Playwright Java在Mac Chromium环境下出现TargetClosedError求助
Playwright TargetClosedError 问题解决(Mac Chromium专属异常)
问题概述
使用Cucumber BDD+Playwright Java框架时,仅在Mac机器上运行Chromium会出现浏览器打开后立即关闭的情况,无法执行后续测试步骤,抛出TargetClosedError。Windows环境下Chromium正常,Firefox和Webkit在Mac/Windows环境下均正常。
相关代码
1. 基础测试浏览器初始化方法
public void initBrowser() { playwright = Playwright.create(); String headless = config.headLess; boolean isHeadless = Boolean.parseBoolean(headless); browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(isHeadless)); System.out.println(browser); context = browser.newContext(); System.out.println(context); page = context.newPage(); }
2. 基础测试浏览器关闭方法
public void closeBrowser() { context.close(); browser.close(); playwright.close(); }
3. Cucumber Hooks类
public class Hooks { BasePage basePage = new BasePage(); @Before public void setup() { basePage.initBrowser(); } @After public void tearDown() { basePage.closeBrowser(); } }
错误堆栈信息
com.microsoft.playwright.impl.BrowserImpl@28276e50 com.microsoft.playwright.impl.BrowserContextImpl@36b0fcd5 com.microsoft.playwright.PlaywrightException: Error { message='Target page, context or browser has been closed name='TargetClosedError stack='TargetClosedError:Target page, context or browser has been closed Error at captureRawStack (/private/var/folders/y1/hjtdt91x4r55hpcdsg5v_2vh0000gp/T/playwright-java-15087204804003979156/package/lib/utils/stackTrace.js:50:17) at LongStandingScope._race (/private/var/folders/y1/hjtdt91x4r55hpcdsg5v_2vh0000gp/T/playwright-java-15087204804003979156/package/lib/utils/manualPromise.js:91:52) at LongStandingScope.race (/private/var/folders/y1/hjtdt91x4r55hpcdsg5v_2vh0000gp/T/playwright-java-15087204804003979156/package/lib/utils/manualPromise.js:84:17) at BrowserContextDispatcher._handleCommand (/private/var/folders/y1/hjtdt91x4r55hpcdsg5v_2vh0000gp/T/playwright-java-15087204804003979156/package/lib/server/dispatchers/dispatcher.js:96:36) at DispatcherConnection.dispatch (/private/var/folders/y1/hjtdt91x4r55hpcdsg5v_2vh0000gp/T/playwright-java-15087204804003979156/package/lib/server/dispatchers/dispatcher.js:362:39) } at com.microsoft.playwright.impl.WaitableResult.get(WaitableResult.java:54) at com.microsoft.playwright.impl.ChannelOwner.runUntil(ChannelOwner.java:120) at com.microsoft.playwright.impl.Connection.sendMessage(Connection.java:129) at com.microsoft.playwright.impl.ChannelOwner.sendMessage(ChannelOwner.java:106) at com.microsoft.playwright.impl.ChannelOwner.sendMessage(ChannelOwner.java:101) at com.microsoft.playwright.impl.BrowserContextImpl.newPageImpl(BrowserContextImpl.java:419) at com.microsoft.playwright.impl.BrowserContextImpl.lambda$newPage$13(BrowserContextImpl.java:412) at com.microsoft.playwright.impl.LoggingSupport.withLogging(LoggingSupport.java:47) at com.microsoft.playwright.impl.ChannelOwner.withLogging(ChannelOwner.java:89) at com.microsoft.playwright.impl.BrowserContextImpl.newPage(BrowserContextImpl.java:412) at com.microsoft.playwright.impl.BrowserContextImpl.newPage(BrowserContextImpl.java:44) at pages.BasePage.initBrowser(BasePage.java:24) at hooks.Hooks.setup(Hooks.java:12) Caused by: com.microsoft.playwright.impl.TargetClosedError: Error { message='Target page, context or browser has been closed name='TargetClosedError stack='TargetClosedError:Target page, context or browser has been closed Error
解决方案
1. 添加Chromium启动参数
Mac环境下Chromium的沙箱机制或GPU加速可能导致启动异常,添加以下参数禁用相关特性:
import java.util.Arrays; public void initBrowser() { playwright = Playwright.create(); String headless = config.headLess; boolean isHeadless = Boolean.parseBoolean(headless); browser = playwright.chromium().launch(new BrowserType.LaunchOptions() .setHeadless(isHeadless) .setArgs(Arrays.asList("--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage"))); System.out.println(browser); context = browser.newContext(); System.out.println(context); page = context.newPage(); }
2. 确保Playwright与Chromium版本兼容
执行命令更新Playwright及其浏览器版本,确保与Mac系统兼容:
mvn exec:java -e -Dexec.mainClass=com.microsoft.playwright.CLI -Dexec.args="install chromium"
3. 调整Hooks实例生命周期
检查Hooks中BasePage的实例化方式,避免因实例被意外回收导致上下文关闭。可改为静态实例:
public class Hooks { private static BasePage basePage; @Before public void setup() { basePage = new BasePage(); basePage.initBrowser(); } @After public void tearDown() { basePage.closeBrowser(); } }
4. 添加初始化等待
Mac下Chromium启动速度可能较慢,在创建page前添加短暂等待,确保上下文初始化完成:
public void initBrowser() { playwright = Playwright.create(); String headless = config.headLess; boolean isHeadless = Boolean.parseBoolean(headless); browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(isHeadless)); System.out.println(browser); context = browser.newContext(); System.out.println(context); // 添加500ms等待 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } page = context.newPage(); }
5. 检查Mac系统权限
前往「系统偏好设置」→「安全性与隐私」,确保允许Playwright下载的Chromium运行。若出现阻止提示,点击「允许」即可。
内容的提问来源于stack exchange,提问作者Prasa
相关产品推荐
相关产品推荐

