Как выбрать только видимые элементы с помощью XPath? - PullRequest
43 голосов
/ 16 марта 2009

У меня есть приложение GWT , для которого я пытаюсь написать несколько тестов, используя Selenium .

Я использую XPath для идентификации элементов на странице для тестов. Использование id не будет работать, поскольку значения id автоматически генерируются GWT и могут изменяться. Все стало хорошо, когда я понял, что могу найти кнопки по их ярлыкам следующим образом:

//button[.='OK']

Однако, когда я начал выполнять несколько тестов, у меня начались проблемы. Я понял, что проблема заключается в том, что все различные «страницы» приложения GWT, сгенерированные JavaScript, остаются в HTML в скрытых <div> элементах. Это означало, что мои тесты Selenium иногда нажимали скрытые кнопки вместо кнопки, видимой в текущем представлении.

Изучая HTML с помощью Firebug , кажется, что GWT скрывает элементы <div>, добавляя display: none к их атрибуту style. Это означает, что я могу найти все скрытые кнопки ОК следующим образом:

//div[contains(@style,'display: none')]//button[.='OK']

При этом будут найдены все скрытые кнопки ОК, то есть кнопки, у которых есть предок <div>, который скрыт наличием display: none в style.

Мой вопрос: как мне использовать XPath, чтобы найти только видимые кнопки ОК? Как найти кнопки, у которых нет элементов-предков <div> с display: none в style?

Ответы [ 4 ]

53 голосов
/ 16 марта 2009

Это должно работать:

.//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, видимый в ее предках.

12 голосов
/ 01 июня 2012

Selenium 2 Webdriver дает нам возможность метода isDisplayed (), который решает эту проблему. Хорошая работа авторов селена.

0 голосов
/ 12 марта 2019

//div[(contains(@style,'display: block'))]//button[@id='buttonid']

Это сработало для меня. Как 'display: none' представляет скрытые блоки, 'display: block' представляет текущий отображаемый блок, и мы можем указать любые внутренние теги, которые будут идентифицированы, как указано выше

0 голосов
/ 26 октября 2017
//div[contains(@style,'display: block')]

Этот код найдет видимый элемент xpath

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...