Selenium的ByChained课程如何运作?

Abh*_*kar 12 selenium webdriver selenium-webdriver

对ByChained类文档提到的内容非常困惑.它说:

用于使用一系列其他查找来定位文档中的元素的机制.此类将查找按顺序匹配每个定位符的所有DOM元素,例如driver.findElements(new ByChained(by1,by2))将查找与by2匹配的所有元素,并显示在与by1匹配的元素下.

code.google.com 的selenium 也存在一个问题,为ByChained类引发,有人评论说它用于使用多个定位器查找元素/元素.

我不明白.为什么by1和by2是两个不同元素的定位器?当我最初遇到这个课程时,我觉得通过使用不同的定位器来帮助定位元素.因此,如果一个定位器不起作用,则下一个定位器将起作用.但是当我几乎使用这个类时,它表现得非常奇怪并且一直抛出NoSuchElementException.

例如,如果我的html是:

<html>
  <body>
    <div id="details">
      <input id="firstName" class="personName" type="text"/>
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我想通过在ByChained中使用两个定位器来找到输入字段:
1.使用By.id("firstName")
2. usingBy.className("personName")

所以我的代码变成:

By myBy = new ByChained(By.id("firstName"),By.className("personName"));
driver.findElement(myBy);
Run Code Online (Sandbox Code Playgroud)

执行时,我得到了NoSuchElementException.我期待如果我的第一个By不起作用,那么它将在系列中找到具有下一个By的元素.

有人可以解释这个类如何使用一个例子,在哪些情况下可以使用它?

Pau*_*ris 19

这个类的功能是允许你使用dom中的heirarchy来定位元素.

让我们说因为某些原因你有以下html:

<html>
    <body>
        <div id="details">
            <input id="firstName" class="personName" type="text"/>
        </div>
        <input id="firstName" class="personName" type="text"/>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

并且你想获得div之间的元素而不是它自己的元素.您可以使用ByChained by通过执行以下操作来指定您想要该元素:

new ByChained(By.id("details"),By.id("firstName"));
Run Code Online (Sandbox Code Playgroud)

会发生的是,它找到第一个元素,然后在dom层次结构中搜索下一个列表中的选择器.基本上这个By只是一个很好的清洁方式,不再需要执行以下操作:

details = driver.findElement(By.id("details"));
input = details.findElement(By.id("firstName"));
Run Code Online (Sandbox Code Playgroud)

  • 如果您更喜欢cssSelector但需要xpath来查找起点,那么这个类非常有用,那么您可以将By.xpath作为第一个参数传递,将By.cssSelector作为第二个参数传递.我之前已经这样做了,因为css不能像xpath一样在DOM中向上遍历. (6认同)

Pet*_*ček 8

您的请求将通过可以调用的ByAny内容来满足,该内容将返回与任何传递的By参数匹配的元素.没有这样的AFAIK级.

但是,ByChained工作方式不同.它找到第一个参数匹配的元素,然后使用第二个参数等搜索它们的后代.所以,如果你有这样的HTMl:

<html>
    <body>
        <div id="details">
            <input id="firstName" class="personName" type="text"/>
        </div>
        <div id="notDetails">
            <input id="secondName" class="personName" type="text"/>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

并且你想找到下面的class=personName元素id=details,你可以使用CSS选择器,XPath表达式,或者

new ByChained(By.id("details"), By.className("personName"))
Run Code Online (Sandbox Code Playgroud)

请注意,还有一个ByAll类可以搜索与By传递的所有参数匹配的元素.