Выбор элемента с помощью xpath и Selenium - PullRequest
10 голосов
/ 27 апреля 2011

У меня есть HTML, который выглядит в основном следующим образом:

...    
  <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
...

Следующий xpath в Selenium не может найти элемент :

//a[contains(text(), 'Sign in') and contains(@class,'btnX')]

xpath в Selenium успешно выполняются, но не достаточно конкретны для меня.

//a[contains(text(), 'Sign in')]
//a[contains(@class, 'btnX')]

Почему xpath не может найти элемент и что я могу сделать, чтобы он заработал?

Ответы [ 3 ]

15 голосов
/ 28 апреля 2011

Совпадение случаи, когда Sign in непосредственно ребенок a или другого элемента:

//a[contains(@class,'btnX') and .//text()='Sign in']

Я имею в виду

1007 *<a class="btnX btnSelectedBG" href="#">Sign in</a>

и

1012 *<a class="btnX btnSelectedBG" href="#"><b>Sign in</b></a>
5 голосов
/ 28 апреля 2011

// a [содержит (@ class, 'btnX') и span [text () = 'Войти']] не очень хорошая идея, потому что вы собираетесь искать в DOM каждый якорь, а затем пытаться сравните это с вашими критериями поиска.

В идеале вы хотите привязать свой XPath к первому восходящему элементу с идентификатором, а затем пройти вниз по дереву.

например. если ваш html

<div id="foo">   
  <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
</div>

Вы можете использовать:

//div[@id='foo']/a[contains(@class, 'btnX')][span[.='Sign in']]

К сожалению, я не знаю остальную часть структуры страницы, поэтому не могу дать вам ничего более конкретного, чем:

//a[contains(@class, 'btnX')][span[.='Sign in']]

но это действительно не очень хороший xpath.

(Мой XPath немного отличается от вас, потому что я использовал. В качестве ярлыка для текста () и второй набор [] в качестве ярлыка для и)

0 голосов
/ 27 апреля 2011

дааа для меня.Я думаю, что это лучший ответ, но открыт для других решений!

//a[contains(@class,'btnX') and span[text()='Sign in']]
...