在QAF BDD2中如何实现每个场景执行后调用driver.quit()关闭浏览器
解决方案
问题根因
当你通过debuggerAddress配置绑定已启动的Chrome实例时,WebDriver默认仅与目标浏览器建立调试连接,不会持有浏览器进程的控制权,所以原生的driver.quit()仅会断开连接,不会关闭浏览器,且QAF默认的驱动复用逻辑会导致同个浏览器实例被多个场景复用。
操作步骤
1. 调整QAF基础配置
在你的resources目录下的配置文件(一般为application.properties或test.properties)中添加如下配置,关闭驱动单例模式,强制每个场景创建独立驱动实例:
# 关闭驱动单例,每个场景创建新的驱动实例 selenium.singletone=false # 禁用驱动复用 selenium.reuse.driver=false
2. 自定义QAF场景监听器,实现场景结束后的清理逻辑
创建自定义监听器实现QAF提供的QAFTestListenerAdapter,在场景执行完成的回调方法中主动执行驱动退出,同时杀掉对应端口的Chrome进程:
import com.qmetry.qaf.automation.testng.QAFTestListenerAdapter; import org.openqa.selenium.WebDriver; import com.qmetry.qaf.automation.ui.WebDriverTestBase; import org.testng.ITestResult; import java.io.IOException; public class ScenarioLifeCycleListener extends QAFTestListenerAdapter { @Override public void onTestFinish(ITestResult result) { // 先获取当前驱动实例执行quit WebDriver driver = new WebDriverTestBase().getDriver(); if (driver != null) { driver.quit(); } // 杀掉9222端口对应的Chrome进程 try { // Windows系统命令 Runtime.getRuntime().exec("taskkill /F /im chrome.exe /FI \"LOCALPORT eq 9222\""); // 如果是Mac/Linux系统,替换为下面的命令 // Runtime.getRuntime().exec(new String[]{"sh", "-c", "lsof -ti:9222 | xargs kill -9"}); } catch (IOException e) { e.printStackTrace(); } } }
代码中com.yourpackage需要替换为你实际的包路径。
3. 注册自定义监听器
在你的testng.xml中添加监听器配置,或者在配置文件中添加如下配置注册监听器:
testng.listeners=com.yourpackage.ScenarioLifeCycleListener
4. 调整Chrome启动逻辑(可选)
如果你的Chrome是代码自动启动的,建议每个场景启动前先杀掉旧的9222端口Chrome进程,再启动新的带调试端口的Chrome实例,避免端口占用报错。
内容的提问来源于stack exchange,提问作者Satish A
相关产品推荐
相关产品推荐

