页面对象模型中的Javascript执行器

时间:2018-09-21 08:18:23

标签: javascript java selenium automation

对于我的自动化脚本(使用Java和Java使用Selenium使用Page Object Model)编写,我有时想使用Javascript Executor,因为默认的WebDriver单击有时会导致找不到元素的异常。

在初始化Web元素的框架页面中,代码如下所示:

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)

如果我在clickLoginButton()内创建Javascript Executor的实例;方法,它可以正常工作。 我的问题是如何用Page Object Model正确实现Javascript Executor,而不必在每个方法中都创建它的新实例?

1 个答案:

答案 0 :(得分:1)

找到了解决问题的方法:

在类和构造函数中初始化Javascript Executor的正确方法是:

LIKELY(!!(InExpression))

这也可以应用于WebDriverWait,具有不同的显式等待时间(在构造函数中可以看到)。