如何使用相对 Xpath 访问第二个元素
How to access second element using relative Xpath
给定此页面片段
<section id="mysection">
<div>
<div>
<div>
<a href="">
<div>first</div>
</a>
</div>
<div>
<a href="">
<div>second</div>
</a>
</div>
</div>
</div>
</section>
我想使用相对 Xpath 访问第二个 a 元素。在 FF 中(并使用 Selenium IDE 定位)this
//section[@id='mysection']//a[1]
有效,但这不匹配
//section[@id='mysection']//a[2]
第二个表达式有什么问题?
编辑:其实我不太关心 Selenium IDE(只是用它来快速验证)。我想在 Robot Framework 中使用 selenium2library。这里,输出是:
ValueError: Element locator with prefix '(//section[@id' is not
supported
对于建议的解决方案 (//section[@id='mysection']//a)[2]
试试这个方法:
(//section[@id='mysection']//a)[2]
//a[2]
在同一父级中查找 <a>
元素。由于每个父 <div>
仅包含一个 <a>
子,因此您的 xpath 不匹配任何内容。
有了这个:
//section[@id='mysection']//a[1]
您正在匹配任何上下文中的所有第一个 'a' 元素(例如,在一个 div 中),但是使用此
//section[@id='mysection']//a[2]
您正在尝试将任何第二个 'a' 元素与任何上下文匹配,但您在任何节点中都没有超过一个 'a' 元素。
因此,icrementing 兄弟节点应该是那些 'a' 标签的父 div 节点。
很简单:
//section[@id='mysection']//a[1] - both elements
这就是为什么之前在整个事情周围加上括号的答案是正确的。
//section[@id='mysection']//div[1]/a - only first element
//section[@id='mysection']//div[2]/a - only second elemnt
另一种分别加工每个 'a' 的方法:
//section[@id='mysection']//a[div[text()='first']]
//section[@id='mysection']//a[div[text()='second']]
你可以用这个。这将 select section 的锚定后代并为您提供第二个节点。这适用于 xslt 处理器,希望它适用于 Selenium
//section[@id='mysection']/descendant::a[2]
到达第二个 a 元素的其他方法是使用
<div>second</div>, call this bottom-up approach
而不是从节元素开始
<section id="mysection">, call this top-down approach
使用 a 元素的 div 子元素,解决方案应如下所示:
//div[.='second']/..
给定此页面片段
<section id="mysection">
<div>
<div>
<div>
<a href="">
<div>first</div>
</a>
</div>
<div>
<a href="">
<div>second</div>
</a>
</div>
</div>
</div>
</section>
我想使用相对 Xpath 访问第二个 a 元素。在 FF 中(并使用 Selenium IDE 定位)this
//section[@id='mysection']//a[1]
有效,但这不匹配
//section[@id='mysection']//a[2]
第二个表达式有什么问题?
编辑:其实我不太关心 Selenium IDE(只是用它来快速验证)。我想在 Robot Framework 中使用 selenium2library。这里,输出是:
ValueError: Element locator with prefix '(//section[@id' is not supported
对于建议的解决方案 (//section[@id='mysection']//a)[2]
试试这个方法:
(//section[@id='mysection']//a)[2]
//a[2]
在同一父级中查找 <a>
元素。由于每个父 <div>
仅包含一个 <a>
子,因此您的 xpath 不匹配任何内容。
有了这个:
//section[@id='mysection']//a[1]
您正在匹配任何上下文中的所有第一个 'a' 元素(例如,在一个 div 中),但是使用此
//section[@id='mysection']//a[2]
您正在尝试将任何第二个 'a' 元素与任何上下文匹配,但您在任何节点中都没有超过一个 'a' 元素。 因此,icrementing 兄弟节点应该是那些 'a' 标签的父 div 节点。
很简单:
//section[@id='mysection']//a[1] - both elements
这就是为什么之前在整个事情周围加上括号的答案是正确的。
//section[@id='mysection']//div[1]/a - only first element
//section[@id='mysection']//div[2]/a - only second elemnt
另一种分别加工每个 'a' 的方法:
//section[@id='mysection']//a[div[text()='first']]
//section[@id='mysection']//a[div[text()='second']]
你可以用这个。这将 select section 的锚定后代并为您提供第二个节点。这适用于 xslt 处理器,希望它适用于 Selenium
//section[@id='mysection']/descendant::a[2]
到达第二个 a 元素的其他方法是使用
<div>second</div>, call this bottom-up approach
而不是从节元素开始
<section id="mysection">, call this top-down approach
使用 a 元素的 div 子元素,解决方案应如下所示:
//div[.='second']/..