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
相关产品推荐
相关产品推荐

