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

Bitbucket Pipeline中Playwright测试随机超时失败的稳定化方案咨询

问题描述

错误截图:
Error-screenshot

我使用Docker镜像 mcr.microsoft.com/playwright:v1.49.0-noble,在Bitbucket Pipeline中运行Playwright测试,覆盖Edge、Chrome、Safari及Firefox浏览器。部分测试会随机在Firefox或Chrome上出现超时失败,即使已设置足够等待时间;多次尝试后所有测试可通过,本地运行也完全正常。

以下是自定义的waitUntil函数代码:

async waitUntil(func, timeout = 1000, pollingRate = 100) {
        return new Promise((resolve, reject) => {
            const timer = setTimeout(() => {
                clearInterval(interval);
                reject(new Error('WaitUntil timed out'));
            }, timeout);
            const interval = setInterval(() => {
                if (!func())
                    return;

                clearTimeout(timer);
                clearInterval(interval);
                resolve();
            }, pollingRate);
        });
    }

我已尝试禁用并行执行,但无效果;也已添加足够等待时间,问题仍未解决。请问有什么方法可以稳定这些测试?


解决建议

1. 替换自定义waitUntil为Playwright原生等待API

你的自定义等待函数未处理异步函数场景:如果传入的func是异步逻辑(比如Playwright的元素定位、状态判断),!func()会直接返回true(Promise对象在布尔判断中为真),导致等待逻辑完全失效。

Playwright原生提供了适配多浏览器的可靠等待方法,直接替代自定义函数即可:

  • 等待元素:page.waitForSelector(selector, { timeout: 5000 })
  • 等待自定义条件:page.waitForCondition(async () => { /* 异步判断逻辑 */ }, { timeout: 5000 })
  • 等待网络/页面加载完成:page.waitForLoadState('networkidle')

2. 优化CI环境资源配置

Bitbucket Pipeline的默认资源配额(CPU、内存)有限,Firefox和Chrome对资源波动敏感,容易触发偶发超时:

  • 在Pipeline配置中升级资源规格,比如设置size: 2x(双倍CPU/内存)
  • 启动浏览器时添加参数规避资源限制:给Chrome加--disable-dev-shm-usage(避免共享内存不足),给Firefox加--memory 1024

示例Pipeline配置片段:

script:
  - npx playwright test --browser firefox,chrome
options:
  size: 2x

3. 配置测试重试与日志追踪

针对随机失败的测试,添加重试规则,并收集失败时的详细数据:

  • 在playwright.config.ts中配置:
    export default defineConfig({
      retries: 2, // 失败后自动重试2次
      use: {
        trace: 'on-first-retry', // 重试时记录完整交互追踪日志
        video: 'retain-on-failure', // 失败时保留测试视频
      },
    });
    
  • 运行测试时添加--verbose参数,输出浏览器交互的详细日志,帮助定位偶发问题。

4. 依赖Playwright自动等待,避免硬编码等待

Playwright的所有操作(点击、填写等)都内置了自动等待逻辑,无需手动添加固定等待或自定义轮询。例如直接写:

await page.click('#submit-button'); // 自动等待元素可见且可点击

而非先调用自定义waitUntil再执行操作,多余的手动等待反而会干扰原生逻辑。

5. 确保浏览器与Playwright版本匹配

确认Docker镜像中的浏览器版本与Playwright v1.49.0完全兼容,运行npx playwright install --with-deps重新安装对应版本的浏览器及依赖,避免版本不兼容导致的渲染异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:52:29