#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 .. месяцы зависят от ресурсов) и стоимости, тогда с радостью соглашайтесь на это.
или
Тогда ищите управление ожиданием в общем виде в объектной модели страницы
- Создайте класс базовой страницы
- Инициировать явное ожидание в конструкторе
- Создайте методы ожидания для присутствия, видимости и так далее
- Расширьте этот класс базовой страницы в другом классе страницы
например
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");
}
}