代码之家  ›  专栏  ›  技术社区  ›  hamilton.lima

如何在Alpine Linux上运行Angular6 E2E测试

  •  2
  • hamilton.lima  · 技术社区  · 8 年前

    在尝试使用运行E2E测试时 Alpine Linux 我们有以下神秘的错误:

    E/launcher - spawn (...)/selenium/chromedriver_2.40 ENOENT
    

    如何繁殖

    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
    

    结果

    [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 spawn function ,我们尝试从ash运行该命令,结果显示“未找到”消息!稍微挖掘一下,发现这可能与缺少动态链接库有关。

    为了验证这个假设,我们安装了 binutils 以检查动态链接依赖关系。

    apk add --update binutils
    readelf -l /testAlpine/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.40
    

    结果显示了Alpine Linux中不存在的依赖性,

    /lib64/ld-linux-x86-64。所以2.

    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 manager获取更新的chrome驱动程序版本也不起作用。下载的版本也有相同的问题。

    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
    

    随机吹捧

    1 回复  |  直到 8 年前
        1
  •  8
  •   sdumont    8 年前

    有必要使用musl libc重建chromedriver,或者使用alpine repos的chromedriver软件包,您可以使用 apk add --no-cache chromium-chromedriver .

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

        2
  •  1
  •   JohannesB Tom Ritter    5 年前

    对于将来有这个问题的人,我完全无法得到 alpine + angular + protractor + webdriver-manager 以任何开箱即用的方式进行合作。

    经过多次修补,我设法使它顺利地工作了

    1. 使用webdriver管理器生成配置
    2. 使用alpine注册表中的驱动程序覆盖webdriver管理器驱动程序

    Dockerfile:

    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
    

    量角器。conf.js

    capabilities: {
        browserName: 'chrome',
        chromeOptions: {
            args: ['--headless', '--disable-gpu', '--no-sandbox'],
        },
    },
    directConnect: true,
    

    脚本看起来有点像这样:

      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配置的代码:根据您的需要,您可能需要:

    • 将其转换为可用于您的环境的脚本
    • 删除/替换某些环境变量