Selenium не может найти элемент по аннотации @FindBys в случае двух условий - PullRequest
1 голос
/ 20 марта 2020

У меня есть текстовый элемент на странице со свойствами:

Web element property

И я пытаюсь получить этот элемент, используя аннотацию 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>

1 Ответ

1 голос
/ 20 марта 2020

Поиск FindBys

FindBys используются для маркировки поля на , чтобы указать, что поиск должен использовать серию @FindBy тегов в цепочке как описано в ByChained. В качестве примера:

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

Класс ByChained

ByChained механизм, используемый для поиска элементов в документе с использованием ряда других поисков. Этот класс найдет все элементы 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;
    
...