代码之家  ›  专栏  ›  技术社区  ›  Berry Tsakala

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

  •  0
  • Berry Tsakala  · 技术社区  · 17 年前

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Santi    16 年前

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

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

    selenium.click("css=a:contains('Click Here'):nth-child(3)")
    
        2
  •  0
  •   Michael Sorens    15 年前

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

    层叠样式表

    :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类过滤器:如果手头的元素匹配,则返回它。如果不匹配,则不匹配。

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

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

    路径表达式

    您的问题已经表明您知道如何在XPath中做到这一点。用方括号在表达式中的任何点添加数组引用。例如,你可以使用这样的东西: //*[@id='abc']/div[3]/p[2]/span 在指定id下的第三个div下的第二段中查找span。

    文档对象模型

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