如何使用相对 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']/..