我npx ng e2e
在 GitLab 下的 docker CI 环境中运行。当我运行它时,我得到了完全平凡的设置/安装 chrome/webdriver..
[19:57:28] I/file_manager - creating folder /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium
[19:57:28] I/config_source - curl -o/builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chrome-response.xml https://chromedriver.storage.googleapis.com/
[19:57:29] I/downloader - curl -o/builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45.zip https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_linux64.zip
[19:57:30] I/update - chromedriver: unzipping chromedriver_96.0.4664.45.zip
[19:57:31] I/update - chromedriver: setting permissions to 0755 for /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45
Compiling @angular/core : es2015 as esm2015
... lots more compiling stuff..
随后执行失败,
[19:58:07] I/launcher - Running 1 instances of WebDriver
[19:58:07] I/direct - Using ChromeDriver directly...
[19:58:07] E/launcher - spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
[19:58:07] E/launcher - Error: spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:282:19)
at onErrorNT (node:internal/child_process:475:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
[19:58:07] E/launcher - Process exited with error code 199
为什么我会得到,
E/launcher - 错误:spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
当我可以清楚地看到 chrome 在那里解压缩时
我试过./e2e/protractor.conf.js
用不同形式的编辑
chromeOptions: {
binary: process.env.CHROME_BIN,
args: ['--no-sandbox', '--headless', '--disable-gpu']
}
但没有新的事情发生。
跳入容器,我能够确认文件存在,但我无法运行它,
我可以确认它是
+x
,当我运行file
它时,它说,我确认了
readelf -l
文件的输出。在我的主机上/lib64/ld-linux-x86-64.so.2
存在,但在 Alpine/lib64/ld-linux-x86-64.so.2
上不存在。这是因为 webdriver 被编译为 GNU Libc 但 Alpine 使用 MUSL。我们仍然可以让它工作,我们只需要使用 Alpine 的 chrome web 驱动程序。ng e2e
在 Alpine/MUSL 下运行这种方法适用于 Alpine 下的 chromium webdriver。
安装必要的 Alpine 软件包。
在您的图像中设置一个
CHROMIUM_FLAGS
CHROME_BIN
和。CHROME_PATH
在你
e2e/protractor.conf.js
确保包括这些东西。请注意,您不必指定--no-sandbox
是否以其他用户身份运行 chrome 并且您有一个多用户容器。不好的解决方案:
gcompat
官方建议安装
gcompat
这个不起作用并返回以下错误,截至 2021 年 12 月,gcompat 似乎更像是一项正在进行的工作
ENOENT
是缺少动态链接器的典型症状;参见例如 为什么 chroot 会在现有文件上获得 ENOENT?如果您想在容器中运行基于 glibc 的二进制文件,最好使用基于 glibc 的基础镜像,而不是基于 musl 的镜像(如 Alpine)。
有许多基本图像可以满足您的要求,要真正推荐一个,我需要更多地了解它们的真正含义。