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

Playwright for Java 1.33.0如何阻止浏览器异常时自动关闭?

Playwright Java 1.33.0 异常时保持浏览器窗口不关闭的解决方法

问题说明

当测试中出现元素未找到等异常时,Playwright会自动销毁Playwright和Browser实例,导致浏览器窗口关闭。setHandleSIGINT(false)配置仅用于忽略系统中断信号(如Ctrl+C),对测试代码抛出的异常场景无效。

实用解决方法

核心思路是捕获异常并阻塞测试线程,避免Playwright实例被提前销毁,以下是两种可行方案:


1. 单测试方法临时处理

直接在测试代码中通过try-catch捕获异常,添加阻塞逻辑手动控制浏览器关闭时机:

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import org.testng.annotations.Test;
import java.util.Scanner;

public class Basic {

    @Test
    public void firstTest() {
        Playwright playwright = Playwright.create();
        Browser browser = null;
        try {
            browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
                    .setHeadless(false));
            Page page = browser.newPage();
            page.navigate("https://the-internet.herokuapp.com/");
            page.click("//a[contains(@href, '/hovers')]");
            page.click("//a[contains(@href, '/failme')]");
        } catch (Exception e) {
            e.printStackTrace();
            // 阻塞线程,保持浏览器打开,用户输入后才关闭
            System.out.println("浏览器将保持打开,按任意键关闭...");
            new Scanner(System.in).nextLine();
        } finally {
            if (browser != null) {
                browser.close();
            }
            playwright.close();
        }
    }
}

原理:

  • 异常发生后,通过Scanner等待用户输入,阻止测试线程结束
  • 在finally块中手动销毁Browser和Playwright实例,确保资源最终被释放

2. 全局统一处理(多测试用例场景)

通过TestNG基类统一管理Playwright生命周期,在测试失败时触发阻塞逻辑:

第一步:创建测试基类
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Playwright;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import java.util.Scanner;

public class PlaywrightTestBase {
    protected Playwright playwright;
    protected Browser browser;

    @BeforeMethod
    public void setUp() {
        playwright = Playwright.create();
        browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
                .setHeadless(false));
    }

    @AfterMethod
    public void tearDown(ITestResult result) {
        // 测试失败时阻塞线程
        if (!result.isSuccess()) {
            System.out.println("测试失败,浏览器将保持打开,按任意键关闭...");
            new Scanner(System.in).nextLine();
        }
        browser.close();
        playwright.close();
    }
}
第二步:测试类继承基类
import com.microsoft.playwright.Page;
import org.testng.annotations.Test;

public class Basic extends PlaywrightTestBase {

    @Test
    public void firstTest() {
        Page page = browser.newPage();
        page.navigate("https://the-internet.herokuapp.com/");
        page.click("//a[contains(@href, '/hovers')]");
        page.click("//a[contains(@href, '/failme')]");
    }
}

原理:

  • 基类统一处理Playwright和Browser的创建与销毁
  • 在AfterMethod钩子中判断测试结果,失败则触发阻塞,避免浏览器自动关闭

补充说明

  • setHandleSIGINT(false)仅作用于系统中断信号,无法干预测试异常后的资源回收流程
  • 上述方案通过阻塞线程阻止Playwright实例被JVM回收,是当前Playwright Java版本下最直接的解决方案

内容的提问来源于stack exchange,提问作者Sameera De Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:15:03