Docker Pod中Playwright 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)
解决方案建议
调整无头浏览器启动参数
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适配容器权限限制。修改页面等待策略
将WaitUntilState.LOAD改为WaitUntilState.DOMCONTENTLOADED,仅等待DOM加载完成即可,避免因资源加载缓慢超时:someUIPage.navigate("www.testexample.com",new Page.NavigateOptions().setWaitUntil(WaitUntilState.DOMCONTENTLOADED));也可尝试
WaitUntilState.NETWORKIDLE,等待网络请求稳定后再继续执行。捕获页面JS异常
无头环境下可能存在JS执行阻塞页面加载的情况,添加错误监听排查:someUIPage.onPageError(error -> { LOGGER.error("Page error occurred: {}", error.getMessage()); });排查DNS解析差异
虽然curl能访问,但浏览器DNS解析逻辑可能不同,可在上下文设置中指定Host头:context = browser.newContext(new Browser.NewContextOptions() .setIgnoreHTTPSErrors(true) .setExtraHTTPHeaders(Map.of("Host", "www.testexample.com")));升级Playwright版本
当前使用的v1.34.0版本较旧,升级到最新稳定版可能修复容器环境下的导航超时问题。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

