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

Docker Pod中Playwright page.navigate()超时异常求助

Playwright Docker Pod环境下page.navigate()超时问题

问题场景

我用Playwright编写UI测试用例,通过page.navigate()方法打开指定网页,待页面加载完成后执行后续测试操作。目前在Docker Pod环境中调用该方法时无法加载目标网页,触发等待超时异常。

测试环境

  • 基础镜像:mcr.microsoft.com/playwright/java:v1.34.0-jammy

已执行的排查操作

  • 通过curl命令验证,目标URL在Docker Pod内部可正常访问;
  • 将默认导航超时时间延长至5分钟;
  • 相同测试用例在本地机器运行正常,仅Docker Pod环境存在该问题。

相关代码

PlayWrightTestSetup.java

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;

import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;


public class PlayWrightTestSetup {

   
    // Shared between all tests in the class.
    public static Playwright playwright;
    public static Browser browser;

    // New instance for each test method.
    public static BrowserContext context;
    public static Page page;

    
    @BeforeSuite()
    public void setUpTestSuite() {
        playwright = Playwright.create();
        browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(Boolean.TRUE));
        
    }

    @AfterSuite()
    public void testSuitePostStep() {
            playwright.close();
    }

}

TestClass.java

import com.microsoft.playwright.Browser;
import com.microsoft.playwright.Page;

import org.apache.commons.lang3.StringUtils;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;


public class TestClass extends PlayWrightTestSetup {

    @BeforeMethod()
    public void createContextAndPage() {
      
        context = browser.newContext(new Browser.NewContextOptions().setIgnoreHTTPSErrors(true));
        context.setDefaultNavigationTimeout(90000);
        
    }

    @AfterMethod()
    public void closeContext() {
       context.close();
    }
    
    @Test()
    public void testUI(){
        Page someUIPage = context.newPage();
        LOGGER.info("Opening web page...");
        someUIPage.navigate("www.testexample.com",new Page.NavigateOptions().setWaitUntil(WaitUntilState.LOAD));
        LOGGER.info("Successfully loaded web page");
    }
    
}

报错信息

navigating to "https://www.testexample.com/", waiting until "load"
============================================================   name='TimeoutError   stack='TimeoutError: Timeout 90000ms exceeded.
=========================== logs =========================== navigating to "https://www.testexample.com/", waiting until "load"
============================================================
    at ProgressController.run (/tmp/playwright-java-1873968284753476751/package/lib/server/progress.js:88:26)
    at Frame.goto (/tmp/playwright-java-1873968284753476751/package/lib/server/frames.js:521:23)
    at FrameDispatcher.goto (/tmp/playwright-java-1873968284753476751/package/lib/server/dispatchers/frameDispatcher.js:75:121)
    at DispatcherConnection.dispatch (/tmp/playwright-java-1873968284753476751/package/lib/server/dispatchers/dispatcher.js:312:46)

解决方案建议

  1. 调整无头浏览器启动参数
    Docker容器环境存在资源和权限限制,给Chromium添加适配参数:

    browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
        .setHeadless(Boolean.TRUE)
        .setArgs(List.of("--disable-gpu", "--no-sandbox", "--disable-dev-shm-usage", "--disable-setuid-sandbox")));
    

    其中--disable-dev-shm-usage解决容器共享内存不足问题,--no-sandbox适配容器权限限制。

  2. 修改页面等待策略
    将WaitUntilState.LOAD改为WaitUntilState.DOMCONTENTLOADED,仅等待DOM加载完成即可,避免因资源加载缓慢超时:

    someUIPage.navigate("www.testexample.com",new Page.NavigateOptions().setWaitUntil(WaitUntilState.DOMCONTENTLOADED));
    

    也可尝试WaitUntilState.NETWORKIDLE,等待网络请求稳定后再继续执行。

  3. 捕获页面JS异常
    无头环境下可能存在JS执行阻塞页面加载的情况,添加错误监听排查:

    someUIPage.onPageError(error -> {
        LOGGER.error("Page error occurred: {}", error.getMessage());
    });
    
  4. 排查DNS解析差异
    虽然curl能访问,但浏览器DNS解析逻辑可能不同,可在上下文设置中指定Host头:

    context = browser.newContext(new Browser.NewContextOptions()
        .setIgnoreHTTPSErrors(true)
        .setExtraHTTPHeaders(Map.of("Host", "www.testexample.com")));
    
  5. 升级Playwright版本
    当前使用的v1.34.0版本较旧,升级到最新稳定版可能修复容器环境下的导航超时问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:47:04