一尘不染

Selenium的ByChained类是如何工作的?

selenium

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

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

selenium在code.google.com上也存在一个问题,该问题是为ByChained类提出的,有人在评论中说,它旨在用于通过多个定位符查找元素/元素。

我不明白
为什么by1和by2是两个不同元素的定位符?当我初次接触该类时,我觉得它将通过使用不同的定位器来帮助定位元素。因此,如果一个定位器不起作用,则下一个定位器将起作用。但是,当我实际使用此类时,它的行为非常奇怪,并一直抛出NoSuchElementException。

例如,如果我的html是:

<html>
  <body>
    <div id="details">
      <input id="firstName" class="personName" type="text"/>
    </div>
  </body>
</html>

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

所以我的代码变成:

By myBy = new ByChained(By.id("firstName"),By.className("personName"));
driver.findElement(myBy);

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

有人可以通过一个示例解释此类的工作原理,以及可以在哪种情况下使用该类吗?


阅读 334

收藏
2020-06-26

共1个答案

一尘不染

此类的作用是允许您使用dom中的层次结构来定位元素。

可以说由于某种原因您拥有以下html:

<html>
    <body>
        <div id="details">
            <input id="firstName" class="personName" type="text"/>
        </div>
        <input id="firstName" class="personName" type="text"/>
    </body>
</html>

并且您想要获得div之间的元素,而不是单独获得的元素。您可以使用ByChained by通过执行以下操作来指定所需的元素:

new ByChained(By.id("details"),By.id("firstName"));

发生的情况是,它找到第一个元素,然后在dom层次结构中的该元素下搜索列表中下一个选择器。基本上,此By只是一种不再需要执行以下操作的好方法:

details = driver.findElement(By.id("details"));
input = details.findElement(By.id("firstName"));
2020-06-26