Для моего сценария автоматизации, написанного на Java с Selenium с использованием Page Object Model, я иногда хотел бы использовать Javascript Executor, потому что щелчки по умолчанию WebDriver иногда приводят к исключениям элементов, которые не найдены.
InНа странице фреймворка, где инициализируются веб-элементы, код выглядит следующим образом:
public class MainPage {
WebDriver driver;
JavascriptExecutor executor = (JavascriptExecutor) driver;
@FindBy(xpath = "//*[@id='main_button']/div/span")
WebElement mainButton;
@FindBy(xpath = "//*[@id='login_button']/div/span")
WebElement loginButton;
// constructor, where the elements are initialized
public MainPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
//method, for clicking mainButton with WebDriver
public void clickMainButton() {
WebDriverWait wait = new WebDriverWait(driver, 40);
wait.until(ExpectedConditions.elementToBeClickable(mainButton)).click();
}
//method, for clicking mainButton with JS Executor
public void clickLoginButton() {
WebDriverWait wait = new WebDriverWait(driver, 40);
executor.executeScript("arguments[0].click();", loginButton);
}
В этот момент при выполнении скрипта, взаимодействующего со страницей, при вызове clickMainButton ();метод, он выполняется правильно.Но при вызове clickLoginButton ();метод, программа выдаст исключение нулевого указателя:
java.lang.NullPointerException
at pages.MainPage.clickLoginButton(MainPage.java:55)
Если я создаю экземпляр Исполнителя Javascript внутри clickLoginButton ();метод, он работает правильно.Мой вопрос заключается в том, как правильно реализовать Javascript Executor с объектной моделью страницы, не создавая новый экземпляр в каждом методе?