You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:45:00