0

当页面中有多个具有相同定位器的元素时,应该如何引用下一个元素?

使用 Xpath 定位器可以添加数组表示法,例如 xpath=(//span/div)[1] 但是使用简单的定位器?

例如,如果有 3 个由“link=Click Here”标识的链接,则简单地附加 [3] 不会得到第 3 个元素。

解决元素数组的权威参考在哪里?我找不到任何东西。

4

2 回答 2

2

Selenium 本身不处理定位器数组。它只返回满足您查询的第一个元素,因此如果您想这样做,您必须使用 xpath、dom 甚至更好的 css。

因此,对于链接示例,您应该使用:

selenium.click("css=a:contains('Click Here'):nth-child(3)")
于 2009-08-13T04:39:42.150 回答
0

Santi 是正确的,Selenium 返回与您指定的定位器匹配的第一个元素,并且您必须应用您使用的定位器类型的适当表达式。不过,我认为在这里提供细节会很有用,因为在这种情况下,它们确实接近于“血腥细节”:

CSS

:nth-child伪类很难使用;它有一些鲜为人知没有明确记录的微妙之处,即使在 W3C 页面上也是如此。考虑如下列表:

<ul>
  <li class="bird">petrel</li>
  <li class="mammal">platypus</li>
  <li class="bird">albatross</li>
  <li class="bird">shearwater</li>
</ul>

然后选择器css=li.bird:nth-child(3)返回信天翁元素而不是海鸥!这样做的原因是它使用您的索引 (3) 到元素列表中,这些元素是第一个匹配元素的兄弟元素 -未被 .bird 类过滤!一旦它有了正确的元素,在这个例子中是第三个,它就会应用bird类过滤器:如果手头的元素匹配,它就会返回它。如果不匹配,则匹配失败。

现在考虑选择器css=li.bird:nth-child(2)。这从第二个元素 - 鸭嘴兽开始 - 看到它不是鸟并且空无一物。这表现为您的代码抛出“未找到”异常!

可能适合查找索引条目的典型心理模型的是 CSS:nth-of-type伪类,它在索引之前应用过滤器。不幸的是,根据 locators 的官方文档,这不受 Selenium支持

XPath

您的问题已经表明您知道如何在 XPath 中执行此操作。在带有方括号的表达式中的任意点添加数组引用。例如,您可以使用以下内容://*[@id='abc']/div[3]/p[2]/span在指定 id 下的第三个 div 下的第二段中查找跨度。

DOM

DOM 使用与 XPath 相同的方括号表示法,除了DOM 从零开始索引,而 XPath 从 1 开始索引:document.getElementsByTagName("div")[1]返回第二个 div,而不是第一个 div!DOM 也提供了另一种语法:document.getElementsByTagName("div").item(0)完全等价。请注意,使用 getElementsByTagName 时,您始终必须使用索引,因为它返回的是节点集,而不是单个节点。

于 2011-03-02T20:53:54.970 回答