Selenium RC定位器 - 指后续元素?

时间:2009-06-02 01:00:55

标签: selenium-rc

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

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

例如,如果有3个链接由“link = Click Here”标识,则只需附加[3]将不会获得第3个元素。

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

2 个答案:

答案 0 :(得分:2)

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

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

selenium.click("css=a:contains('Click Here'):nth-child(3)")

答案 1 :(得分:0)

Santi是正确的,Selenium返回与您指定的定位器匹配的第一个元素,并且您必须应用您使用的定位器类型的相应表达式。我认为在这里提供详细信息会很有用,因为在这种情况下,它们与“ gory details ”相邻:

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)返回信天翁元素而不是 shearwater !这样做的原因是它将你的索引(3)用于第一个匹配元素的兄弟元素列表 - 未被.bird类过滤!一旦它具有正确的元素,在本例中为第三个元素,它然后应用鸟类过滤器:如果手中的元素匹配,则返回它。如果没有,则无法匹配。

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

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

的XPath

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

DOM

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