我目前正在使用 Github Actions、Playwright 和 headless Chromium 的组合进行一些 E2E 测试。现在,目前我的测试需要相当长的时间(简单测试需要几十秒),这并不理想,特别是考虑到我的用例需要经常运行大量这些测试。经过一番研究,我发现很多人似乎都提到了这个链接:https://michelkraemer.com/enable-gpu-for-slow-playwright-tests-in-headless-mode/
它提供了如何在无头模式下为缓慢的 Playwright 测试启用 GPU 硬件加速的说明。但是,无论我做什么,硬件加速都拒绝在无头模式下启用。在 Head 模式下,它实际上是默认启用的,一切都运行得更流畅。这是我的代码:
(async () => {
let browser = await chromium.launch({
args: ['--use-gl=desktop', '--use-angle=default'],
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('chrome://gpu');
await page.pdf({
path: 'page.pdf',
});
})();
我也尝试过
--use-gl=egl
,但没有成功。每次,pdf 都会显示 Software only, hardware acceleration unavailable
。此时,我怀疑这可能是我的笔记本电脑硬件的问题,但我不知道如何找出这个问题。我还确认我的命令行参数实际上是由 Playwright 传递的,因为使用 --window-size
实际上改变了窗口大小,并且 --disable-software-rasterization
似乎确实禁用了某些功能。
更新:“--use-gl=swiftshader”对我来说没有什么区别。此外,我相信我的问题在于“--ignore-gpu-blocklist”,因为即使我包含该标志,它仍然处于禁用状态,这让我相信有什么东西迫使我的 GPU 不提供硬件加速。我的笔记本电脑的 GPU 是 Nvidia 2060(如果有帮助的话),尽管我的代码在通过 GitHub Action 远程运行时也无法工作。
这是一个包含
chrome://gpu
原样结果的 Pastebin:https://pastebin.com/U6m0pcjY--disable-software-rasterization
后的结果:https://pastebin.com/uDfQuqQq你可以尝试下面的代码吗-
// @ts-check
const playwright = require('playwright');
(async () => {
// Try to add 'playwright.firefox' to the list ↓
for (const browserType of [playwright.chromium]) {
const browser = await browserType.launch({
args: ['--use-gl=swiftshader'],
} );
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('chrome://gpu');
await page.screenshot({ path: `example-${browserType.name()}.png` });
await browser.close();
}
})();
这个问题被问到已经有一段时间了,但对于面临类似问题的人来说,我相信还有很多。
我最近与 Remotion.dev 开源社区合作修复了同样的问题并使其正常工作。我们成功地在无头模式下运行带有硬件加速的远程。
我在一篇文章如何在无头模式下在 AWS 上的 Chrome、Chromium 和 Puppeteer 上启用硬件加速中整合了我的发现。我相信这将为 Chrome 在无头模式下通过硬件加速工作提供帮助和指导。
免责声明:我是本指南的作者