Adapt browser drivers to accessible control markup

This commit is contained in:
John Chilton
2026-10-14 04:35:31 -04:00
parent 2abb453957
commit 801a8f293f
4 changed files with 24 additions and 29 deletions
+17 -16
View File
@@ -330,7 +330,7 @@ history_panel:
selector: 'name input'
type: data-description
history_name_edit_label: '[data-description="name display"]'
history_name_edit_input: '[data-description="name display"] #click-to-edit-input'
history_name_edit_input: '[data-description="name display"] input'
contents: '.history-index .content-item'
empty_message: '#empty-history-message'
size: '.history-size'
@@ -400,8 +400,8 @@ edit_dataset_attributes:
info_input: '[aria-labelledby="dataset-attributes-heading"] textarea#info'
annotation_input: '[aria-labelledby="dataset-attributes-heading"] textarea#annotation'
datatypes_tab: '.dataset-edit-datatype-tab'
datatype_dropdown: ' #datatype .multiselect'
dbkey_dropdown: '#dbkey .multiselect'
datatype_dropdown: '#datatype-container .multiselect'
dbkey_dropdown: '#dbkey-container .multiselect'
save_button: '#dataset-attributes-default-save'
auto_detect_datatype_button: '#dataset-attributes-autodetect-datatype'
alert: '.dataset-attributes-alert'
@@ -574,9 +574,9 @@ histories:
files_dialog:
selectors:
ftp_label: 'a[title="label-gxftp://"]'
ftp_label: 'button[title="label-gxftp://"]'
ftp_details: 'span[title="details-gxftp://"]'
row: 'span[title="label-${uri}"]'
row: '[title="label-${uri}"]'
back_btn: '#back-btn'
options_ready: '[data-description="selection dialog options"] .selection-dialog-table[aria-busy="false"]'
ok: '[data-description="selection dialog ok"]'
@@ -831,7 +831,7 @@ tool_form:
parameter_color_input: 'div.ui-form-element[id="form-element-${parameter}"] input[type="color"]'
parameter_text_input: 'div.ui-form-element[id="form-element-${parameter}"] input'
parameter_form_selection: 'div.ui-form-element[id="form-element-${parameter}"] .form-selection'
parameter_multiselect_tag_close: 'div.ui-form-element[id="form-element-${parameter}"] i.multiselect__tag-icon'
parameter_multiselect_tag_close: 'div.ui-form-element[id="form-element-${parameter}"] button.multiselect__tag-icon'
parameter_drilldown_option: 'div.ui-form-element[id="form-element-${parameter}"] #drilldown-option-${value}'
parameter_value_list_input:
type: xpath
@@ -1185,11 +1185,11 @@ workflow_editor:
type: xpath
selector: >
//div[@data-label='Rename dataset']//input
change_datatype: "#pja__${output}__ChangeDatatypeAction__newtype [role='combobox']"
select_datatype_text_search: "#pja__${output}__ChangeDatatypeAction__newtype [role='combobox'] input"
select_datatype: "#pja__${output}__ChangeDatatypeAction__newtype [data-option-value='${datatype}']"
select_datatype_option_not_matching: "#pja__${output}__ChangeDatatypeAction__newtype [data-option-value]:not([data-option-value*='${text}' i])"
selected_datatype: "#pja__${output}__ChangeDatatypeAction__newtype [data-selected-value]"
change_datatype: "#pja__${output}__ChangeDatatypeAction__newtype-container .multiselect__select"
select_datatype_text_search: "#pja__${output}__ChangeDatatypeAction__newtype[role='combobox']"
select_datatype: "#pja__${output}__ChangeDatatypeAction__newtype-container [data-option-value='${datatype}']"
select_datatype_option_not_matching: "#pja__${output}__ChangeDatatypeAction__newtype-container [data-option-value]:not([data-option-value*='${text}' i])"
selected_datatype: "#pja__${output}__ChangeDatatypeAction__newtype-container [data-selected-value]"
add_tags_button:
type: xpath
selector: >
@@ -1429,7 +1429,7 @@ admin:
selector: "//div[@id='admin-quota-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]"
remove_selected_user:
type: xpath
selector: "//div[@id='admin-quota-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]/i[contains(@class, 'multiselect__tag-icon')]"
selector: "//div[@id='admin-quota-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]/button[contains(@class, 'multiselect__tag-icon')]"
submit: '#admin-quota-submit'
role:
@@ -1445,7 +1445,7 @@ admin:
selector: "//div[@id='role-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]"
remove_selected_user:
type: xpath
selector: "//div[@id='role-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]/i[contains(@class, 'multiselect__tag-icon')]"
selector: "//div[@id='role-users']//span[contains(@class, 'multiselect__tag')][span[text()='${email}']]/button[contains(@class, 'multiselect__tag-icon')]"
groups: '#role-groups .multiselect'
groups_input: '#role-groups input.multiselect__input'
group_option:
@@ -1456,7 +1456,7 @@ admin:
selector: "//div[@id='role-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]"
remove_selected_group:
type: xpath
selector: "//div[@id='role-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/i[contains(@class, 'multiselect__tag-icon')]"
selector: "//div[@id='role-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/button[contains(@class, 'multiselect__tag-icon')]"
submit: '#role-submit'
user_roles_groups:
@@ -1472,7 +1472,7 @@ admin:
selector: "//div[@id='admin-user-roles']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]"
remove_selected_role:
type: xpath
selector: "//div[@id='admin-user-roles']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/i[contains(@class, 'multiselect__tag-icon')]"
selector: "//div[@id='admin-user-roles']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/button[contains(@class, 'multiselect__tag-icon')]"
groups: '#admin-user-groups .multiselect'
groups_input: '#admin-user-groups input.multiselect__input'
group_option:
@@ -1483,7 +1483,7 @@ admin:
selector: "//div[@id='admin-user-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]"
remove_selected_group:
type: xpath
selector: "//div[@id='admin-user-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/i[contains(@class, 'multiselect__tag-icon')]"
selector: "//div[@id='admin-user-groups']//span[contains(@class, 'multiselect__tag')][span[text()='${name}']]/button[contains(@class, 'multiselect__tag-icon')]"
submit: '#admin-user-roles-groups-submit'
index:
@@ -1569,6 +1569,7 @@ libraries:
import_datasets_from_history_modal_list_is_ready: '.selection-dialog-modal [data-description="selection dialog busy spinners"]'
import_datasets_from_history_modal_select_list_items: '.selection-dialog-modal table tbody tr'
import_datasets_from_history_modal_select_list_item_by_index: '.selection-dialog-modal table tbody tr[aria-rowindex="${row_index}"] td[id^="g-table-cell-label-"]'
import_datasets_from_history_modal_open_history_by_index: '.selection-dialog-modal table tbody tr[aria-rowindex="${row_index}"] button.selection-dialog-folder'
import_datasets_from_history_modal_ok: '.selection-dialog-modal [data-description="selection dialog ok"]'
import_datasets_from_history_modal_cancel: '.selection-dialog-modal [data-description="selection dialog cancel"]'
add_to_history_as_collection:
+5 -1
View File
@@ -3021,11 +3021,15 @@ class NavigatesGalaxy(HasDriverProxy[WaitType]):
container_elem = self.wait_for_selector(container_selector_or_elem)
else:
container_elem = container_selector_or_elem
if "multiselect__input" in (container_elem.get_attribute("class") or "").split():
container_elem = container_elem.find_element(
By.XPATH, "ancestor::*[contains(concat(' ', normalize-space(@class), ' '), ' multiselect ')][1]"
)
trigger_elem = container_elem.find_element(By.CSS_SELECTOR, ".multiselect__select")
self.scroll_into_view(trigger_elem)
trigger_elem.click()
try:
text_input = container_elem.find_element(By.CSS_SELECTOR, "input[class='multiselect__input']")
text_input = container_elem.find_element(By.CSS_SELECTOR, "input.multiselect__input")
except Exception:
text_input = None
if text_input:
@@ -187,6 +187,6 @@ class TestLibraryContents(SeleniumTestCase, UsesLibraryAssertions, UsesUploadAct
def _search_and_select_history(self, row_index=1, label_text="Unnamed history"):
self.libraries_dataset_import_from_history_search_for(label_text)
self.sleep_for(self.wait_types.UX_RENDER)
self.components.libraries.folder.import_datasets_from_history_modal_select_list_item_by_index(
self.components.libraries.folder.import_datasets_from_history_modal_open_history_by_index(
row_index=row_index
).wait_for_and_click()
@@ -1604,17 +1604,7 @@ steps:
self.assert_workflow_has_changes_and_save()
def switch_param_type(self, element, param_type):
if self.backend_type == "playwright":
pw_driver = cast("HasPlaywrightDriver", self._driver_impl)
element.click()
self.sleep_for(self.wait_types.UX_RENDER)
pw_driver.page.keyboard.type(param_type)
self.sleep_for(self.wait_types.UX_RENDER)
pw_driver.page.keyboard.press("Enter")
else:
self.action_chains().move_to_element(element).click().pause(1).send_keys(param_type).pause(1).send_keys(
Keys.ENTER
).perform()
self.select_set_value(element, param_type)
@selenium_test
def test_editor_invalid_tool_state(self):