对于我的自动化脚本(使用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,而不必在每个方法中都创建它的新实例?
答案 0 :(得分:1)
找到了解决问题的方法:
在类和构造函数中初始化Javascript Executor的正确方法是:
LIKELY(!!(InExpression))
这也可以应用于WebDriverWait,具有不同的显式等待时间(在构造函数中可以看到)。