Selenium测试报错求助:java.lang.NoClassDefFoundError: HasTouchScreen
问题分析与解决方案
错误原因
这个NoClassDefFoundError本质是缺少Selenium Interactions模块的依赖,org.openqa.selenium.interactions.HasTouchScreen类属于Selenium的交互模块,若项目未引入该模块或依赖版本不兼容,就会触发这个错误。
同时测试代码存在几个逻辑问题,会加剧错误:
- 静态
driver初始化时机错误:类加载时就执行new ChromeDriver(),但系统属性webdriver.chrome.driver是在@BeforeSuite中才设置,导致驱动初始化时找不到配置,同时触发类加载时的依赖缺失报错。 @BeforeSuite方法误用main签名:TestNG的注解方法不需要main方法的参数列表,TestNG运行时不会以这种方式调用该方法。- 注解方法用
static修饰:TestNG注解方法通常使用实例方法,静态方法可能导致上下文管理异常。
解决步骤
1. 修复依赖问题
如果用Maven管理项目,确保引入完整的Selenium Java依赖(包含交互模块),版本统一:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> <!-- 使用最新稳定版 --> </dependency>
如果是手动导入JAR包,要确保包含selenium-interactions-xxx.jar,且所有Selenium相关JAR版本一致。
2. 修正测试代码
调整初始化逻辑和TestNG注解用法,修正后的代码如下:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; public class TestPlan { private WebDriver driver; @BeforeSuite public void setUp() { // 先设置驱动路径,再初始化WebDriver System.setProperty("webdriver.chrome.driver", Utils.CHROME_DRIVER_LOCATION); driver = new ChromeDriver(); } @Test(testName = "Submit a WebForm") public void submitForm(){ driver.get(Utils.BASE_URL); WebForm webForm = new WebForm(driver); webForm.enterFirstName(); webForm.enterLastName(); webForm.pressSubmitButton(); } @AfterSuite public void cleanUp(){ driver.manage().deleteAllCookies(); driver.quit(); // 用quit彻底关闭浏览器进程,替代仅关闭当前窗口的close } }
代码修正说明
- 将
driver改为实例变量,在@BeforeSuite方法中完成初始化,确保系统属性先配置完成 - 移除
@BeforeSuite方法的main签名,改为符合TestNG规范的无参方法 - 所有注解方法改为非静态,避免静态上下文导致的资源管理问题
- 用
driver.quit()替代driver.close(),确保测试结束后彻底清理浏览器资源
内容的提问来源于stack exchange,提问作者Hans Radam
相关产品推荐
相关产品推荐

