【发布时间】:2025-12-07 16:40:01
【问题描述】:
我使用 jest & puppeteer 编写了一个大型测试,它在我的应用程序中做了很多事情。
当我在本地运行测试时 - 99% 的时间都通过了。
当我在 Docker 中运行测试时 - 测试在多个地方不一致地失败。几乎每次我运行测试时,它通常都会在等待选择器加载时失败。
很遗憾,我无法在此处分享我的代码,但我可以根据我所做的研究展示我为减少失败所做的工作。
- 在导航发生后或断言前调用
waitFor(< x ms>) - 按照puppeteer docs 中针对点击事件的建议实现
Promise.all模式。像这样:
async singleClickElement(selector, page) {
try {
await Promise.all([
page.waitForSelector(selector),
page.click(selector)
]);
} catch (error) {
console.error(error)
}
}
搞乱
sloMo设置(考虑到我们的默认 css 转换是 0.4 秒,对我来说,似乎 17 是最成功的数字)使用
screenshots在测试失败的地方拍摄前后照片
我忘记提及的一些修改
我的参数
--forceExit --runInBand --detectOpenHandles我的超时时间增加到一分钟
jest.setTimeout(60000)浏览器参数
'--window-size=2560,1080', '--no-sandbox', '--disable-setuid-sandbox', '--enable-logging=stderr', '--v=1'
我的想法已经不多了,正在寻找有关在运行 UI 测试时如何缓解 Docker 中的竞争条件的建议。请随时提出您认为可能对我有帮助的任何建议。谢谢:D
【问题讨论】:
-
我知道这个问题有点老了,但我遇到了完全相同的行为!我也尝试了您指出的所有组合,包括尝试许多不同风格的 docker 镜像,包括预构建的(例如 buildkite )和滚动我自己的。我也尝试过 mocha 和 jest,它们都表现出相同的行为,这让我相信它是 puppeteer 固有的。你曾经解决过这个问题吗?
-
@JohnZoidbergMD 在下面查看我的答案,希望对您有所帮助,干杯
标签: docker jestjs puppeteer race-condition