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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:18:17