首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在高寒Linux上运行Angular6 E2E测试

如何在高寒Linux上运行Angular6 E2E测试
EN

Stack Overflow用户
提问于 2018-06-08 14:52:42
回答 2查看 1.9K关注 0票数 5

在尝试使用E2E运行阿尔卑斯Linux测试时,我们有以下神秘错误:

代码语言:javascript
复制
E/launcher - spawn (...)/selenium/chromedriver_2.40 ENOENT

如何复制

代码语言:javascript
复制
docker run -it --name my-alpine --rm alpine:latest /bin/ash
apk add --update nodejs nodejs-npm chromium \
    && export CHROME_BIN=/usr/bin/chromium-browser

npm install -g @angular/cli
ng new testAlpine
cd testAlpine
ng e2e

结果

代码语言:javascript
复制
[14:10:54] I/file_manager - creating folder /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium
ℹ 「wdm」: Compiled successfully.
[14:10:54] I/update - chromedriver: unzipping chromedriver_2.40.zip
[14:10:55] I/update - chromedriver: setting permissions to 0755 for /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.40
(node:121) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
[14:10:55] I/launcher - Running 1 instances of WebDriver
[14:10:55] I/direct - Using ChromeDriver directly...
[14:10:55] E/launcher - spawn /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.40 ENOENT
[14:10:55] E/launcher - Error: spawn /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.40 ENOENT
    at _errnoException (util.js:1024:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
    at onErrorNT (internal/child_process.js:372:16)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
[14:10:55] E/launcher - Process exited with error code 199
An unexpected error occured: undefined

一些调查细节

假设量角器使用Nodejs产卵函数,我们尝试从ash运行命令,结果是一条“未找到”消息!深入研究发现,这可能与缺少的动态链接库有关。

为了验证该假设,我们安装了二值来检查动态链接依赖项。

代码语言:javascript
复制
apk add --update binutils
readelf -l /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.40

结果显示,在阿尔卑斯Linux中不存在这种依赖关系,

/lib64/ld-linux-x86-64.so.2

代码语言:javascript
复制
Elf file type is EXEC (Executable file)
Entry point 0x490000
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000200040 0x0000000000200040
                 0x0000000000000268 0x0000000000000268  R      0x8
  INTERP         0x00000000000002a8 0x00000000002002a8 0x00000000002002a8
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000200000 0x0000000000200000
                 0x000000000028f27c 0x000000000028f27c  R      0x1000
  LOAD           0x0000000000290000 0x0000000000490000 0x0000000000490000

试图使用webdriver获得更新的chrome驱动程序版本也不起作用。下载的版本也有相同的问题。

代码语言:javascript
复制
npm install -g webdriver-manager

webdriver-manager update
webdriver-manager: using global installed version 12.0.6
[14:30:20] I/file_manager - creating folder /usr/lib/node_modules/webdriver-manager/selenium
[14:30:21] I/update - chromedriver: unzipping chromedriver_2.40.zip
[14:30:21] I/update - chromedriver: setting permissions to 0755 for /usr/lib/node_modules/webdriver-manager/selenium/chromedriver_2.40

/testAlpine # /usr/lib/node_modules/webdriver-manager/selenium/chromedriver_2.40
/bin/ash: /usr/lib/node_modules/webdriver-manager/selenium/chromedriver_2.40: not found

随机触摸

EN

回答 2

Stack Overflow用户

发布于 2018-06-11 12:35:51

有必要用musl重新构建chromedriver,或者使用高寒repos中的chromedriver,您可以使用apk add --no-cache chromium-chromedriver安装它。

您还需要告诉量角器在量角器配置中使用正确的chromeDriver: '/usr/bin/chromedriver'二进制文件。

票数 8
EN

Stack Overflow用户

发布于 2020-11-30 21:14:09

对于将来有这个问题的人,我完全无法让alpine + angular + protractor + webdriver-manager的组合以任何现成的方式进行合作。

经过多次修补后,我设法使它开始工作。

  1. 使用webdriver生成信任
  2. 用高寒注册表中的驱动程序重写webdriver驱动程序

Dockerfile:

代码语言:javascript
复制
FROM node:12-alpine

RUN \
  echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
  && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \
  && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
  && apk --no-cache update \
  && apk --no-cache upgrade \
  && apk add --no-cache --virtual .build-deps chromium chromium-chromedriver \
  && rm -rf /var/cache/apk/* /tmp/*

ENV CHROME_BIN /usr/bin/chromium-browser

protractor.conf.js

代码语言:javascript
复制
capabilities: {
    browserName: 'chrome',
    chromeOptions: {
        args: ['--headless', '--disable-gpu', '--no-sandbox'],
    },
},
directConnect: true,

脚本看起来有点像这样:

代码语言:javascript
复制
  before_script:
    - yarn install --frozen-lockfile --cache-folder "$CI_PROJECT_DIR/.yarn"
  script:
    - npx webdriver-manager update --versions.chrome="$(chromium-browser --version | cut -d ' ' -f 2)"
    - mv "$CI_PROJECT_DIR/node_modules/webdriver-manager/selenium/chromedriver_$(chromium-browser --version | cut -d ' ' -f 2)" "$CI_PROJECT_DIR/node_modules/webdriver-manager/selenium/chromedriver.bak"
    - ln -s "/usr/bin/chromedriver" "$CI_PROJECT_DIR/node_modules/webdriver-manager/selenium/chromedriver_$(chromium-browser --version | cut -d ' ' -f 2)"
    - yarn run e2e --webdriverUpdate=false

请注意,上面提到的代码是Gitlab CI配置的代码:根据您的需要,您可能必须:

  • 将其转换为可用于您的环境的脚本
  • 删除/替换某些环境变量
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50763289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档