javascript - 页面对象模型中的 Javascript 执行器
问题描述
对于我的自动化脚本,使用页面对象模型用 Selenium 用 Java 编写,有时我想使用 Javascript 执行器,因为默认的 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 的实例;方法,它可以正常工作。我的问题是如何使用页面对象模型正确实现 Javascript 执行器,而不必在每个方法中创建它的新实例?
解决方案
找到了解决问题的方法:
在类和构造函数中初始化 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,具有不同的显式等待时间(可以在构造函数中看到)。
推荐阅读
- excel - 如何使用来自不同列的值在 Excel 的 XY 散点图中添加不同的标记?
- typescript - 如何使用 Jest 和 TypeScript 正确存根/模拟 AWS SecretManager
- asp.net-mvc - 使用 Blazor 和实体框架时如何避免服务定位器模式?
- python - 停止无限循环的问题
- python - Django:为什么我的视频不会在模板中显示?(错误“找不到支持格式和 MIME 类型的视频”)
- .net - 我如何知道正在使用哪个版本的 .NET mono?
- vue.js - Webpack/Vue 未从根目录加载 runtime.js
- c++ - 从 MASM 将字符串推送到 C++
- python - Python 访问嵌套 JSON 数据并保存到数据框中
- html - 可访问性:移动设备上的选项卡位于视口底部的导航叠加层后面