Добавление функции isExists в WebElement

#java #selenium

#java #селен

Вопрос:

Я хочу расширить selenium и реализовать что-то вроде этого:

 public class IsExistsWebElement extends WebElement {

    public boolean isExists() {
        try {
            this.getText();
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

}
  

А затем использовать ее следующим образом (используя фабрику страниц):

 public class HomePage{

    @FindBy(class = "button")
    private IsExistsWebElement button;

    public HomePage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public boolean isButtonExists() {
        return this.button.isExists();
    }
} 
  

Каков наилучший способ реализовать что-то подобное?

Ответ №1:

Если вы ищете пользовательскую реализацию, вам нужно создать новую платформу поверх selenium и написать свою собственную реализацию для большинства вещей.

Например RemoteWebElement , класс реализует WebElement интерфейс. Но не так просто написать код чуть ниже и иметь доступ, как мы делаем для WebElement

например IsExistsWebElement element = driver.findElement(By.id("a"));

 class IsExistsWebElement extends RemoteWebElement {
    public boolean isExists() {
        try {
            this.getText();
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
}
  

Если вы ищете новый фреймворк поверх selenium и можете позволить себе время (может быть 3,6,9 .. месяцы зависят от ресурсов) и стоимости, тогда с радостью соглашайтесь на это.

или

Тогда ищите управление ожиданием в общем виде в объектной модели страницы

  1. Создайте класс базовой страницы
  2. Инициировать явное ожидание в конструкторе
  3. Создайте методы ожидания для присутствия, видимости и так далее
  4. Расширьте этот класс базовой страницы в другом классе страницы

например

 public BasePage(WebDriver driver) {
    this.driver = driver;
    wait = new WebDriverWait(driver, TIMEOUT, POLLING);
    PageFactory.initElements(new AjaxElementLocatorFactory(driver, TIMEOUT), this);
}


public void waitForElementReady(WebElement element) {
    try {
        wait.until(ExpectedConditions.visibilityOf(element));
    } catch (TimeoutException exception) {
        System.out.println("Element didn't find in given time");
    }
}