xpath для доступа к сгенерированному экземпляру класса JS - PullRequest
1 голос
/ 06 декабря 2011

Мне нужно использовать xpath в качестве локатора для Selenium Webdriver, чтобы нажимать на кнопку.Это в диалоге, который генерируется динамически.Firebug / firepath дает ссылки на div с номерами, которые будут меняться.Я прочитал много хороших советов здесь, и я близок, но, похоже, не могу получить точную спецификацию.Мне нужен xpath для доступа к Close и Cancel:

<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
<button class="ui-button ui-widget ui-state-default ui-corner-all 
ui-button-text-only  ui-state-hover" type="button" role="button" aria-disabled="false">
<span class="ui-button-text">Close</span>
</button>
<button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
type="button" role="button" aria-disabled="false">
<span class="ui-button-text">Create</span>

Безуспешно с:

    xpath="//*[@class='ui-button-text' and @value='Close'") 
    xpath="//span[contains(@class='ui-button-text' and @value='Close')]")

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Используйте

//span[@class = 'ui-button-text' and . = 'Close']

Выбирает все элементы span в документе XML со строковым значением "Close" и строковым значением атрибута class которого является "ui-button-text".

0 голосов
/ 06 декабря 2011

Используйте выражение @ Dimitre:

//span[@class='ui-button-text' and .='Close']

Я отвечаю, чтобы объяснить, где вы ошиблись с исходными выражениями.

Первое выражение :

//*[@class='ui-button-text' and @value='Close'")]

Это выбирает все элементы (*) в любом месте документа (//), которые имеют атрибут (@) с именем class, значение которого ui-button-text, и атрибут с именем value, значение которого равно Close. Спецификатором оси атрибута является символ @. Это сокращение от attribute::. Следующие выражения эквивалентны:

//*[@class='ui-button-text' and @value='Close'")]
//*[attribute::class='ui-button-text' and attribute::value='Close'")] 

Вышеприведенные выражения могут быть полностью расширены до:

/descendant-or-self::node()/child::*[attribute::class='ui-button-text' and 
                                     attribute::value='Close'")] 

Вкратце: попытайтесь понять синтаксические сокращения в XPath при построении выражений.

Второе выражение :

//span[contains(@class='ui-button-text' and @value='Close')]

Функция XPath contains имеет следующую подпись:

boolean contains(string, string)

... и описывается в спецификации следующим образом:

Функция contains возвращает true, если строка первого аргумента содержит строку второго аргумента и в противном случае возвращает false.

Похоже, вы пытаетесь трактовать ее как более общую магическую функцию, которая проверяет, «содержит» ли элемент некоторые атрибуты, но по сути это string function.

Я рекомендую быстрое (или не очень быстрое) чтение Рекомендации XPath 1.0:

А до тех пор вы будете только догадываться.

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