在两种情况下,Selenium 无法通过@FindBys 注释找到元素

Selenium can't find element by @FindBys annotation in case of two conditions

我在页面上有一个文本元素,其属性为:

我正在尝试使用 FindBys 注释获取此元素:

@FindBys({@FindBy(tagName = "h5"),@FindBy(id = "email_label")})
private WebElement EmailLabel;

但出现错误: org.openqa.selenium.NoSuchElementException: 无法使用 By.chained({By.tagName: h5,By.id: email_label})

定位元素

同时如果只使用一个条件就可以正确找到元素:

@FindBys({@FindBy(id = "email_label")})
private WebElement EmailLabel;

@FindBys({@FindBy(tagName = "h5")})
private WebElement EmailLabel;

我使用:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>3.141.59</version>
</dependency>

FindBys 注释

FindBys are used to mark a field on a 表示查找应该使用链中的一系列 @FindBy 标记,如 ByChained 中所述。例如:

@FindBys({@FindBy(id = "foo"),
      @FindBy(className = "bar")})

Class ByChained

ByChained 机制用于使用一系列其他查找来定位文档中的元素。此 class 将找到所有 DOM 与序列中每个定位器匹配的元素,Asan 示例:

driver.findElements(new ByChained(by1, by2))

上面的代码行将找到所有匹配 by2 的元素,并出现在 下方 一个匹配 by1 的元素下。所以基本上你不应该在同一个节点上同时使用 by 而是一个 by 用于 parent 节点,另一个用于 child 节点,您可以使用以下 定位器策略 :

@FindBys({@FindBy(tagName = "h5"), @FindBy(tagName = "strong")})
private WebElement EmailLabel;

理想情况下,要找到文本为 你的电子邮件地址是什么?<span>,你可以使用以下任一方法 :

  • 使用css:

    @FindBys({@FindBy(css  = "h5#email_label>strong"), @FindBy(tagName = "span")})
    private WebElement EmailLabel;
    
  • 使用 xpath:

    @FindBys({@FindBy(xpath  = "//h5[@id='email_label']/strong"), @FindBy(xpath = "//span[contains(., 'your email address')]")})
    private WebElement EmailLabel;