Используйте выражение @ 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:
А до тех пор вы будете только догадываться.