求助:Selenium+Cucumber结合Sauce Labs时driver.quit()卡顿无响应
解决Sauce Labs环境下Selenium @After钩子中driver.quit()卡顿问题
问题背景
环境配置:
- IntelliJ
- Selenium + Cucumber + Java
- 通过Sauce Connect(带隧道标识符)执行测试用例
本地运行测试脚本一切正常,但在Sauce Labs环境下,@After钩子中的driver.quit()会卡顿数小时,无任何报错,控制台仅输出"Printing till here",后续代码不执行,脚本一直处于运行状态。尝试过try-finally、try-catch、先close再quit等方式均无效。
可行解决方案
1. 为WebDriver设置超时时间
在调用quit()前,设置脚本超时和页面加载超时,避免无限等待Sauce Labs端的响应:
@After public void tearDown(Scenario scenario) { if (driver() != null) { System.out.println("Printing till here"); // 设置超时时间 driver().manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); driver().manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); driver().quit(); System.out.println("Not printing"); } }
2. 通过Sauce Labs API强制终结会话
绕过WebDriver的quit(),直接调用Sauce Labs的REST API主动删除会话,确保会话被终止:
@After public void tearDown(Scenario scenario) { if (driver() != null) { System.out.println("Printing till here"); try { // 获取会话ID String sessionId = ((RemoteWebDriver) driver()).getSessionId().toString(); // 构建API请求URL,替换为你的Sauce用户名和Access Key URL url = new URL("https://你的用户名:你的AccessKey@ondemand.saucelabs.com:443/rest/v1/你的用户名/sessions/" + sessionId); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("DELETE"); connection.connect(); connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } finally { // 尝试常规quit,即使API调用失败 driver().quit(); } System.out.println("Not printing"); } }
3. 检查并重置Sauce Connect隧道
- 关闭当前Sauce Connect隧道,重新启动,排除隧道连接异常导致的会话终结阻塞
- 查看Sauce Connect的日志,检查是否存在连接中断、超时或隧道标识符不匹配的问题
- 确认测试脚本中使用的隧道标识符与Sauce Connect启动时的参数一致
4. 更新依赖版本
可能是旧版本的Selenium或Sauce相关库存在兼容性bug,更新到最新稳定版:
- 将Selenium Java绑定更新至4.x系列最新版
- 同步更新Cucumber相关依赖到适配版本
- 如果使用了Sauce Labs官方Java客户端,也更新到最新版
5. 先关闭所有窗口再执行quit()
逐个关闭所有打开的窗口,避免单个窗口的异常导致quit()操作阻塞:
@After public void tearDown(Scenario scenario) { if (driver() != null) { System.out.println("Printing till here"); // 关闭所有窗口 for (String handle : driver().getWindowHandles()) { driver().switchTo().window(handle); driver().close(); } driver().quit(); System.out.println("Not printing"); } }
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

