我目前正在评估Selenium结合GitLab CI作为我们网站的测试工具。这是我当前的.gitlab-ci.yml
:
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 0
stages:
- tests
test:
stage: tests
image: node:latest
tags:
- linux
before_script:
- apt-get update
- apt-get install -y chromium
- npm install -g selenium-side-runner
- npm install -g chromedriver
script:
- selenium-side-runner My-UI-Test.side
我得到以下错误:
FAIL ./DefaultSuite.test.js
● Test suite failed to run
WebDriverError: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
at Object.throwDecodedError (../../../../../../usr/local/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/error.js:550:15)
at parseHttpResponse (../../../../../../usr/local/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/http.js:560:13)
at Executor.execute (../../../../../../usr/local/lib/node_modules/selenium-side-runner/node_modules/selenium-webdriver/lib/http.js:486:26)
我已经搜索了错误信息DevToolsActivePort file doesn't exist
,似乎Chrome不喜欢以root权限运行。许多答案建议使用--no-sandbox
或--disable-dev-shm-usage
标志。但这些都是Chrome的标志,因为我没有直接调用Chrome,所以我不能使用它们。有问题的网站也是从一个不同的项目部署,所以我没有代码的工作。我唯一能修改的文件是My-UI-Test.side
和.side.yaml
。
我有一个单独的项目用于我的e2e测试,我在其中添加了一个Dockerfile,我的selenium .side文件以及一个配置文件.side.conf。该项目使用gitlab docker注册表将项目作为镜像上传,该镜像可以直接加载到gitlab-ci中。
这是我的e2e测试项目的文件:
- package.json
...
"scripts": {
"test": "selenium-side-runner test.side"
},
...
"dependencies": {
"selenium-side-runner": "^3.17.0",
"chromedriver": "^101.0.0"
}
这些是我正在使用的选项,你可能想要调整一些东西在这里和那里。不过,这些功能基本上是您想要的。
我还将baseUrl键添加到该文件中,而不是直接添加到包中。json,因为我在几个环境中使用相同的图像,并更改url,我在需要时在我的before_script中替换。(我在下面省略了这一点,因为您的用例可能不同)
- .side.yml
capabilities:
browserName: "chrome"
goog:chromeOptions:
binary: /usr/bin/google-chrome-stable
args:
- no-sandbox
- disable-dev-shm-usage
- headless
- nogpu
output-directory: results
output-format: junit
baseUrl: <baseURL>
Dockerfile可能包含一些无用的依赖,你可以删除它们。其中许多只是从我的木偶Dockerfile复制过来的,因为它们使用的google-chrome-stable二进制文件非常相似。在您的情况下,可能也不需要下载带有google-chrome-stable二进制文件的字体。所以根据你的需要调整一下。
- Dockerfile
FROM node:14
RUN apt update
RUN apt install -y
rsync
grsync
gnupg
ca-certificates
fonts-liberation
libappindicator3-1
libasound2
libatk-bridge2.0-0
libatk1.0-0
libc6
libcairo2
libcups2
libdbus-1-3
libexpat1
libfontconfig1
libgbm1
libgcc1
libglib2.0-0
libgtk-3-0
libnspr4
libnss3
libpango-1.0-0
libpangocairo-1.0-0
libstdc++6
libx11-6
libx11-xcb1
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxext6
libxfixes3
libxi6
libxrandr2
libxrender1
libxss1
libxtst6
lsb-release
wget
xdg-utils
RUN apt-get update
&& apt-get install -y wget gnupg
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
&& apt-get update
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1
--no-install-recommends
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY package.json /app
COPY .side.yml /app
COPY test.side /app
COPY results /app
RUN npm i -g chromedriver --unsafe-perm
RUN npm i -g selenium-side-runner --unsafe-perm
RUN npm install
这里我把它包含到我的gitlab CI
- gitlab-ci.yml:
e2e:
stage: test
image: <image-of-above-project>:1.0
variables:
GIT_STRATEGY: none
script:
- cat .side.yml
- npm run test
如果您需要更多关于容器注册表的信息,请访问这里:https://docs.gitlab.com/ee/user/packages/container_registry/