2009-03-16 5 views
35

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

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

//button[.='OK'] 

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

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

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

Найдет все скрытые кнопки ОК, то есть кнопки, которые имеют предка <div>, которая скрыта наличием display: none в style.

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

ответ

46

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

.//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, что это видно в своих предках.

+0

Вот так. Большое спасибо. –

+1

Последний не работает, если есть еще один div в дереве, который не скрыт:

Fortega

+0

@Fortega и сказано в тексте вокруг него –

12

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

+1

Это работает, если скрытый атрибут отображения находится на родительском элементе, а не на самом элементе? –

+2

Да, но вы должны проверить это для конкретного элемента, не можете сопоставить целую коллекцию. – sitnarf

+1

Будьте осторожны, потому что это может вызвать исключения 'StaleElementReferenceException', когда элементы изменяются между извлечением (' find by * ') и проверкой его видимости с помощью' isDisplayed() '. – Blaise

-3
//div[contains(@style,'display: block')] 

Этот код будет найти видимый элемент XPath

Смежные вопросы