Подтвердить что ты не робот

Как выбрать только видимые элементы с помощью 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?

4b9b3361

Ответ 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