Javascript Executor в объектной модели страницы - PullRequest
0 голосов
/ 21 сентября 2018

Для моего сценария автоматизации, написанного на 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 с объектной моделью страницы, не создавая новый экземпляр в каждом методе?

1 Ответ

0 голосов
/ 21 сентября 2018

Нашел решение проблемы:

Правильный способ инициализации Javascript Executor в классе и в конструкторе:

public class MainPage {

WebDriver driver;
private WebDriverWait wait10;
private WebDriverWait wait40;
JavascriptExecutor executor;


@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;
    this.executor = (JavascriptExecutor) this.driver;
    this.wait10 = new WebDriverWait(driver, 10);
    this.wait40 = new WebDriverWait(driver, 40);
    PageFactory.initElements(driver, this);
}

//method, for clicking mainButton with WebDriver
public void clickMainButton() {
    wait40.until(ExpectedConditions.elementToBeClickable(mainButton)).click();
}

//method, for clicking mainButton with JS Executor
public void clickLoginButton() {
    executor.executeScript("arguments[0].click();", loginButton);
}

Это может быть применено для WebDriverWaitтакже с разными точными временами ожидания (как это видно в конструкторе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...