Java中JavascriptExecutor导入失效,无法调用executeScript求助
刚接触Java,编写测试用例时希望借助JavascriptExecutor向Sauce Labs上报测试结果,已导入org.openqa.selenium.JavascriptExecutor但该导入未被识别,调用driver.executeScript方法时出现无法解析的错误,相关代码及报错截图如下:
测试代码
package tests; import org.junit.Before; import org.junit.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.RegisterExtension; import pageobjects.Login; import org.junit.jupiter.api.extension.TestWatcher; import org.openqa.selenium.JavascriptExecutor; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class TestLogin extends BaseTest { private Login login; @RegisterExtension public SauceTestWatcher watcher = new SauceTestWatcher(); @Before public void setUp() { login = new Login(driver); } @Test public void succeeded() { login.with("tomsmith", "SuperSecretPassword!"); assertTrue("success message not present", login.successMessagePresent()); } @Test public void failed() { login.with("tomsmith", "bad password"); assertTrue("failure message wasn't present after providing bogus credentials", login.failureMessagePresent()); } @Test public void failed2() { login.with("tomsmith", "bad password"); assertFalse("success message was present after providing bogus credentials", login.successMessagePresent()); } public class SauceTestWatcher implements TestWatcher { @Override public void testSuccessful(ExtensionContext context) { driver.executeScript("sauce:job-result=passed"); driver.quit(); } @Override public void testFailed(ExtensionContext context, Throwable cause) { driver.executeScript("sauce:job-result=failed"); driver.quit(); } } }
报错截图

问题原因及解决办法
1. 未对driver进行类型转换
WebDriver接口本身并没有executeScript方法,该方法属于JavascriptExecutor接口。你需要将driver强制转换为JavascriptExecutor类型后再调用方法,修改代码如下:
@Override public void testSuccessful(ExtensionContext context) { ((JavascriptExecutor) driver).executeScript("sauce:job-result=passed"); driver.quit(); } @Override public void testFailed(ExtensionContext context, Throwable cause) { ((JavascriptExecutor) driver).executeScript("sauce:job-result=failed"); driver.quit(); }
2. 检查Selenium依赖是否正确配置
如果项目依赖中缺少Selenium Java客户端库,IDE会无法识别JavascriptExecutor类。如果使用Maven,确保pom.xml中包含以下依赖(替换为对应版本号):
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> <scope>test</scope> </dependency>
使用Gradle则在build.gradle中添加:
testImplementation 'org.seleniumhq.selenium:selenium-java:4.15.0'
添加后执行依赖同步操作,确保库已下载到项目中。
3. 清理IDE缓存
如果依赖配置正确但IDE仍报错,大概率是IDE缓存问题。以IntelliJ IDEA为例,通过File -> Invalidate Caches...,选择Invalidate and Restart重启IDE;Eclipse则通过Project -> Clean清理项目并重新构建。
4. 检查BaseTest中的driver声明
确认BaseTest类中driver的类型是org.openqa.selenium.WebDriver,且实例化的是支持JavascriptExecutor的驱动(如ChromeDriver、FirefoxDriver等),避免自定义未实现该接口的driver类。
内容的提问来源于stack exchange,提问作者Chaffe

