选择带有xpath和Selenium的元素

cgp*_*cgp 10 selenium xpath selenium-rc

我有HTML,看起来基本上如下:

...    
  <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
...
Run Code Online (Sandbox Code Playgroud)

Selenium中的以下xpath无法找到元素:

//a[contains(text(), 'Sign in') and contains(@class,'btnX')]
Run Code Online (Sandbox Code Playgroud)

Selenium中的以下xpath成功,但对我来说不够具体.

//a[contains(text(), 'Sign in')]
//a[contains(@class, 'btnX')]
Run Code Online (Sandbox Code Playgroud)

为什么xpath无法找到元素,我该怎么做才能让它工作?

Emi*_*ggi 15

匹配其他元素的Sign in直接子项a或子项的情况:

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

我的意思是

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

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


Ard*_*sco 5

// a [contains(@ class,'btnX')和span [text()='登录']]不是一个好主意,因为你要在DOM中搜索每个锚点,然后尝试将它与你的搜索条件.

理想情况下,您希望将XPath键入具有ID的第一个上升元素,然后按照树的方式工作.

例如,如果您的HTML是

<div id="foo">   
  <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a>
</div>
Run Code Online (Sandbox Code Playgroud)

你可以使用:

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

不幸的是,我不知道页面结构的其余部分,所以我不能给你更具体的东西:

//a[contains(@class, 'btnX')][span[.='Sign in']]
Run Code Online (Sandbox Code Playgroud)

但它真的不是一个非常好的xpath.

(我的XPath看起来与你略有不同,因为我使用过.作为text()的快捷方式和第二组[]作为和的快捷方式