Как выбрать только видимые элементы с помощью XPath?
У меня есть приложение GWT, для которого я пытаюсь написать несколько тестов, используя Selenium.
Я использую XPath для идентификации элементов на странице для тестов. Использование id
не будет работать, поскольку значения id
автоматически генерируются GWT и могут меняться. Все началось хорошо, когда я понял, что могу найти кнопки по их ярлыкам следующим образом:
//button[.='OK']
Однако, когда я начал запускать несколько тестов, у меня возникли проблемы. Я понял, что проблема заключалась в том, что все разные "страницы" приложения GWT, которые были созданы Javascript, остаются в HTML в скрытых элементах <div>
. Это означало, что тесты Selenium иногда нажимали скрытые кнопки вместо кнопки, видимой в текущем виде.
Изучая HTML с Firebug, похоже, что GWT скрывает элементы <div>
, добавляя display: none
к своим style
атрибут. Это означает, что я могу найти все скрытые кнопки OK следующим образом:
//div[contains(@style,'display: none')]//button[.='OK']
Здесь будут найдены все скрытые кнопки OK, то есть кнопки, у которых есть предок <div>
, который скрыт, имея display: none
в style
.
Мой вопрос: как использовать XPath для поиска только видимых кнопок OK? Как найти кнопки, у которых нет элементов предка <div>
с display: none
в style
?
Ответы
Ответ 1
Это должно работать:
.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')])
and not(ancestor::div[contains(@style,'display: none')])]
EDIT:
Более простое и эффективное выражение ниже:
//div[not(contains(@style,'display:none'))]//button[.='OK']
не работает должным образом, потому что каждая кнопка имеет хотя бы один div, который отображается у его предков.
Ответ 2
Selenium 2 Webdriver дает нам возможность метода isDisplayed(), который занимается этой проблемой. Хорошая работа соседей.
Ссылка
Ответ 3
//div[contains(@style,'display: block')]
Этот код найдет видимый элемент xpath