使用 Chrome 的 Docker 图像进行 Karma 测试
Karma tests using a Docker image of Chrome
对于 CI 服务器上的测试,我想使用 Chrome 的图像而不是 PhantomJS。
我可以使用和不使用 puppeteer 来做到这一点,但两者都需要我在服务器上安装 chrome-stable 包。因此,我想要一种更轻量级的方法,因此使用 docker 图像。
对于 Karma,根据文档,如果我想使用自定义浏览器,我必须为浏览器指定一个脚本。 Karma 还会将 1 个参数传递给此脚本,即 url。对于这个要求,我还提取了无浏览器 docker 图像 browserless quickstart.
我已经创建了脚本并且可以调整 Karma 测试,但看起来 karma 在脚本执行完成之前进入了失败状态。关于我在这里哪里出错的任何想法。容器 运行 符合预期,curl 命令 localhost:3000 returns 符合预期。
自定义脚本
#!/bin/bash
set -euxo pipefail
URL=""
# http://localhost:9876/?id=30931514 this is the argument passed in by Karma
# Change the port to the port the docker container exposes 3000
DOCKER_URL=$( echo "$URL" | sed s/9876/3000/g )
killDockerContainer(){
echo 'Killing Docker Container'
docker rm -f browserless
}
trap "killDockerContainer; exit 0" EXIT
echo "Launching browserless: $DOCKER_URL"
docker run -d -p 3000:3000 --shm-size 2gb --name browserless --restart always -e "DEBUG=browserless/chrome" -e "MAX_CONCURRENT_SESSIONS=10" browserless/chrome
测试输出运行
3 01 2019 11:53:08.471:INFO [karma-server]: Karma v3.1.3 server started at
http://0.0.0.0:9876/
03 01 2019 11:53:08.471:INFO [launcher]: Launching browsers /software/applications/app/browserle 14% building modules 38/38 modules 0 active03 01 2019 11:53:08.491:INFO [launcher]: Starting browser /software/applications/app/browserless.sh
03 01 2019 11:53:08.491:DEBUG [temp-dir]: Creating temp dir at /tmp/karma-34604420
03 01 2019 11:53:08.543:DEBUG [launcher]: /software/applications/app/browserless.sh http://local 17% building modules 60/60 modules 0 active03 01 2019 11:53:10.906:DEBUG [launcher]: Process /software/applications/app/browserless.sh exited with code 0
03 01 2019 11:53:10.907:ERROR [launcher]: Cannot start /software/applications/app/browserless.sh
+ URL='http://localhost:9876/?id=34604420'
++ sed s/9876/3000/g
++ echo 'http://localhost:9876/?id=34604420'
+ DOCKER_URL='http://localhost:3000/?id=34604420'
+ trap 'killDockerContainer; exit 0' EXIT
+ echo 'Launching browserless: http://localhost:3000/?id=34604420'
+ docker run -d -p 3000:3000 --shm-size 2gb --name browserless --restart always -e DEBUG=browserless/chrome -e MAX_CONCURRENT_SESSIONS=10 domain:9082/browserless/chrome 'http://localhost:3000/?id=34604420'
+ killDockerContainer
+ echo 'Killing Docker Container'
+ docker rm -f browserless
+ exit 0
03 01 2019 11:53:10.907:ERROR [launcher]: /software/applications/app/browserless.sh stdout: Launching browserless: http://localhost:3000/?id=34604420
b7144002bc2c9abc786dbdd015a8426c9afcbd0713f408cf3103e980e2278649
Killing Docker Container
browserless
我设法通过 karma-selenium-webdriver-launcher(而不是自定义浏览器)插件并使用 selenium/standalone-chrome(而不是无浏览器)作为图像。我确信这种方法也适用于无浏览器,但 selenium 为我提供了更多未来选择,例如不同的浏览器和使用 selenium 网格等。
两个重要的警告是 Karma 使用的主机名必须在配置中更改为虚拟机 karma 的主机名 运行ning on。您将要注意的另一个名称是 docker 是 运行ning 的地方。这也恰好在 localhost 上,因此在指定 karma 期望浏览器所在的位置时将使用它。现在知道这里有我的业力配置文件来实现这一目标。
1 其他需要考虑的重要事项是您希望 运行 在 jenkins slaves 上进行这些测试的情况,因此对主机名进行硬编码将不起作用。所以你必须找到一种方法来在你的 Karma 配置中获取该地址。
const webdriver = require('selenium-webdriver');
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('karma-selenium-webdriver-launcher'),
require('@angular-devkit/build-angular/plugins/karma')
],
hostname: 'server_hostname', // Here we need to change from default localhost to the hostname of the server
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true,
reporters : ['coverage'],
preprocessors : {'src/app/*.ts' : 'coverage'}
},
angularCli: {
environment: 'dev'
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_DEBUG,
autoWatch: false,
browsers: ['Chrome-wd'],
customLaunchers: {
'Chrome-wd': {
base: 'SeleniumWebdriver',
browserName: 'Chrome',
getDriver: function() {
return new webdriver.Builder()
.forBrowser('chrome')
.usingServer('http://hostname:4444/wd/hub') // Docker is run using docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome
.build()
}
// flags: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-software-rasterizer', '--disable-dev-shm-usage', '--remote-debugging-port=9222']
}
},
singleRun: true
});
};
对于 CI 服务器上的测试,我想使用 Chrome 的图像而不是 PhantomJS。 我可以使用和不使用 puppeteer 来做到这一点,但两者都需要我在服务器上安装 chrome-stable 包。因此,我想要一种更轻量级的方法,因此使用 docker 图像。
对于 Karma,根据文档,如果我想使用自定义浏览器,我必须为浏览器指定一个脚本。 Karma 还会将 1 个参数传递给此脚本,即 url。对于这个要求,我还提取了无浏览器 docker 图像 browserless quickstart.
我已经创建了脚本并且可以调整 Karma 测试,但看起来 karma 在脚本执行完成之前进入了失败状态。关于我在这里哪里出错的任何想法。容器 运行 符合预期,curl 命令 localhost:3000 returns 符合预期。
自定义脚本
#!/bin/bash
set -euxo pipefail
URL=""
# http://localhost:9876/?id=30931514 this is the argument passed in by Karma
# Change the port to the port the docker container exposes 3000
DOCKER_URL=$( echo "$URL" | sed s/9876/3000/g )
killDockerContainer(){
echo 'Killing Docker Container'
docker rm -f browserless
}
trap "killDockerContainer; exit 0" EXIT
echo "Launching browserless: $DOCKER_URL"
docker run -d -p 3000:3000 --shm-size 2gb --name browserless --restart always -e "DEBUG=browserless/chrome" -e "MAX_CONCURRENT_SESSIONS=10" browserless/chrome
测试输出运行
3 01 2019 11:53:08.471:INFO [karma-server]: Karma v3.1.3 server started at
http://0.0.0.0:9876/
03 01 2019 11:53:08.471:INFO [launcher]: Launching browsers /software/applications/app/browserle 14% building modules 38/38 modules 0 active03 01 2019 11:53:08.491:INFO [launcher]: Starting browser /software/applications/app/browserless.sh
03 01 2019 11:53:08.491:DEBUG [temp-dir]: Creating temp dir at /tmp/karma-34604420
03 01 2019 11:53:08.543:DEBUG [launcher]: /software/applications/app/browserless.sh http://local 17% building modules 60/60 modules 0 active03 01 2019 11:53:10.906:DEBUG [launcher]: Process /software/applications/app/browserless.sh exited with code 0
03 01 2019 11:53:10.907:ERROR [launcher]: Cannot start /software/applications/app/browserless.sh
+ URL='http://localhost:9876/?id=34604420'
++ sed s/9876/3000/g
++ echo 'http://localhost:9876/?id=34604420'
+ DOCKER_URL='http://localhost:3000/?id=34604420'
+ trap 'killDockerContainer; exit 0' EXIT
+ echo 'Launching browserless: http://localhost:3000/?id=34604420'
+ docker run -d -p 3000:3000 --shm-size 2gb --name browserless --restart always -e DEBUG=browserless/chrome -e MAX_CONCURRENT_SESSIONS=10 domain:9082/browserless/chrome 'http://localhost:3000/?id=34604420'
+ killDockerContainer
+ echo 'Killing Docker Container'
+ docker rm -f browserless
+ exit 0
03 01 2019 11:53:10.907:ERROR [launcher]: /software/applications/app/browserless.sh stdout: Launching browserless: http://localhost:3000/?id=34604420
b7144002bc2c9abc786dbdd015a8426c9afcbd0713f408cf3103e980e2278649
Killing Docker Container
browserless
我设法通过 karma-selenium-webdriver-launcher(而不是自定义浏览器)插件并使用 selenium/standalone-chrome(而不是无浏览器)作为图像。我确信这种方法也适用于无浏览器,但 selenium 为我提供了更多未来选择,例如不同的浏览器和使用 selenium 网格等。
两个重要的警告是 Karma 使用的主机名必须在配置中更改为虚拟机 karma 的主机名 运行ning on。您将要注意的另一个名称是 docker 是 运行ning 的地方。这也恰好在 localhost 上,因此在指定 karma 期望浏览器所在的位置时将使用它。现在知道这里有我的业力配置文件来实现这一目标。
1 其他需要考虑的重要事项是您希望 运行 在 jenkins slaves 上进行这些测试的情况,因此对主机名进行硬编码将不起作用。所以你必须找到一种方法来在你的 Karma 配置中获取该地址。
const webdriver = require('selenium-webdriver');
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('karma-selenium-webdriver-launcher'),
require('@angular-devkit/build-angular/plugins/karma')
],
hostname: 'server_hostname', // Here we need to change from default localhost to the hostname of the server
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true,
reporters : ['coverage'],
preprocessors : {'src/app/*.ts' : 'coverage'}
},
angularCli: {
environment: 'dev'
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_DEBUG,
autoWatch: false,
browsers: ['Chrome-wd'],
customLaunchers: {
'Chrome-wd': {
base: 'SeleniumWebdriver',
browserName: 'Chrome',
getDriver: function() {
return new webdriver.Builder()
.forBrowser('chrome')
.usingServer('http://hostname:4444/wd/hub') // Docker is run using docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome
.build()
}
// flags: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-software-rasterizer', '--disable-dev-shm-usage', '--remote-debugging-port=9222']
}
},
singleRun: true
});
};