当页面中有多个具有相同定位符的元素时,如何引用下一个元素?
使用Xpath定位器可以添加数组表示法,例如的xpath =(//跨度/ DIV)[1] 但是用简单的定位器?
例如,如果有3个链接由“link = Click Here”标识,则只需附加[3]将不会获得第3个元素。
解决元素数组的权威参考在哪里?我找不到任何。
答案 0 :(得分:2)
Selenium本身不处理定位器数组。它只返回满足查询的第一个元素,所以如果你想这样做,你必须使用xpath,dom甚至更好,css。
因此,对于链接示例,您应该使用:
selenium.click("css=a:contains('Click Here'):nth-child(3)")
答案 1 :(得分:0)
Santi是正确的,Selenium返回与您指定的定位器匹配的第一个元素,并且您必须应用您使用的定位器类型的相应表达式。我认为在这里提供详细信息会很有用,因为在这种情况下,它们与“ gory details ”相邻:
: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中执行此操作。使用方括号在表达式中的任何位置添加数组引用。例如,您可以使用以下内容://*[@id='abc']/div[3]/p[2]/span
在指定ID下的第3个div下的第二个段落中查找范围。
DOM使用与XPath 相同的方括号表示法除了,DOM从0开始索引,而XPath索引从1开始:document.getElementsByTagName("div")[1]
返回第二个div,而不是第一个div! DOM也提供了另一种语法:document.getElementsByTagName("div").item(0)
完全等效。请注意,使用getElementsByTagName,总是必须使用索引,因为它返回一个节点集,而不是单个节点。