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

Playwright多测试执行失败:TargetClosedError问题排查与解决

Playwright + Cucumber 批量执行测试时首个用例通过、后续全部失败的问题解决

问题场景

作为公司独立QA,近期基于Playwright做自动化测试,完成30个测试用例后用Cucumber测试运行器批量执行,出现如下问题:第一个测试用例正常通过,但后续所有测试均失败,报错信息如下:

Error navigating to URL: Playwright connection closed
Error clicking on element: Error {
message='Target page, context or browser has been closed
name='TargetClosedError
stack='TargetClosedError:Target page, context or browser has been closed

我理解错误含义,也尝试遵循最佳实践在每个测试后关闭Page、Browser、BrowserContext及Playwright实例,但问题依旧。

相关代码实现

PlaywrightDriver类

public class PlaywrightDriver {

    private static Playwright playwright;
    private static Browser browser;
    private static BrowserContext browserContext;
    private static Page page;

    public PlaywrightDriver() {
        playwright = Playwright.create();
    }

    public Page initDriver() {

        //initializing browser type
        String browserType = ConfigurationReader.getProperty("browser");
        
        //setting arguments for the session
        List<String> arguments = new ArrayList<>();
        arguments.add("--start-maximized");

        switch (browserType.toLowerCase()) {

            case "chromium":
                browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setArgs(arguments));
                break;
        }

        browserContext = browser.newContext();
        page = browserContext.newPage();
        return page;
    }


    public void closeDriver() {
        if(page != null){
            page.close();
        }
        if (browserContext != null) {
            browserContext.close();
        }
        if (browser != null) {
            browser.close();
        }
        if (playwright != null) {
            playwright.close();
        }
    }
}

Hooks类

public class Hooks extends Base_StepDef{

    private PlaywrightDriver driver;
    private static Page page;

    @Before
    public void setup(Scenario scenario) {
        driver = new PlaywrightDriver();
        page = driver.initDriver();
    }

    @After
    public void tearDown(Scenario scenario) {
        softAssert.assertAll();
        driver.closeDriver();
   
    }


    public static Page getPage() {
        return page; // Provide access to the Page instance
    }
}

BrowserUtils中的navigate方法

public static void navigateTo(String url) {
      page.navigate(url);
       
    }

我的预期是:每个测试用例使用全新的Page和BrowserContext,Playwright实例可在所有测试结束后统一关闭,保证多测试用例正常串行执行。

排查过程

最初尝试移除BrowserUtils中的静态navigateTo方法后,页面能够正常加载,但调用其他BrowserUtils中的方法(如click、getTextFromElement)时,仍然出现相同的TargetClosedError错误。

最终解决方案

问题根源在于BrowserUtils中的静态方法依赖静态Page实例:
我之前在BrowserUtils中定义了静态Page对象,并将其赋值为Hooks类中的静态Page实例。由于静态对象的生命周期与JVM一致,第一个测试用例执行完毕后,该Page实例已被关闭,但后续测试用例仍然尝试复用这个已关闭的静态Page对象,导致报错。

修改方案:移除BrowserUtils中的静态Page依赖,改为通过非静态方式传递或获取当前测试用例对应的Page实例,确保每个测试用例使用自己的Page对象。修改后所有测试用例均可正常执行。

内容的提问来源于stack exchange,提问作者Igor Korpak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:05:05