运行 来自另一个 Docker 容器的 Zalenium 的 Selenium 命令
Run Selenium Commands For Zalenium from another Docker Container
由于我当前项目的情况,我需要将 2 docker 个图像一起用于 selenium 测试。
一个叫做 Zalenium。我通过 docker-compose 演示启动并工作。它基本上类似于 selenium docker 存储库,只是它可以录制视频并向您显示实时进度。
zalenium:
image: "dosel/zalenium"
container_name: zalenium
hostname: zalenium
tty: true
volumes:
- /Users/josephastrahan/seluser/videos:/home/seluser/videos
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- 4444:4444
command: >
start --chromeContainers 1
--firefoxContainers 1
--maxDockerSeleniumContainers 8
--screenWidth 800 --screenHeight 600
--timeZone "Europe/Berlin"
--videoRecordingEnabled true
--sauceLabsEnabled false
--browserStackEnabled false
--testingBotEnabled false
--startTunnel false
environment:
- HOST_UID
- HOST_GID
- SAUCE_USERNAME
- SAUCE_ACCESS_KEY
- BROWSER_STACK_USER
- BROWSER_STACK_KEY
- TESTINGBOT_KEY
- TESTINGBOT_SECRET
另一个图像是预装了 Mocha 的 NodeJS 服务器和 selenium-webdriver 的 nodejs(npm 包),这样我就可以 运行 命令来触发浏览器自动化。此处有详细信息 (https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver) and here (https://hub.docker.com/r/qmu1/selenium-webdriver-node/)
您可以在这里看到来自 docker 的 Zalenium 运行ning 编写得很好。我可以正确地看到时间每秒更新一次,所以它确实显示了实时视图。
根据我正在使用的另一个 docker 容器的文档(https://hub.docker.com/r/qmu1/selenium-webdriver-node/),我应该能够 运行 简单地使用 [=63] 进行测试=] 这样的命令。
HERE=$(pwd)
echo ""
echo "----------------------------"
echo "Running an example"
echo "----------------------------"
echo ""
docker run -it --rm \
-v $HERE:/workspace \
qmu1/selenium-webdriver-node:latest /bin/sh -c "
mocha sample.js --timeout=10000
"
我更改了此命令以满足我的需要,直到它看起来很有效。
docker run -it --rm --net=distributiontech_default -v $HERE:/workspace qmu1/selenium-webdriver-node:latest /bin/sh -c "mocha tests/seleniumtest.js --timeout=10000"
我得到回复:
all modules are ready!
0 passing (1ms)
问题是...在 Zalenium 上,我没有看到查看器上发生任何事情来验证它是否正常工作?
我的 selenium 脚本如下所示。
//Run using this project (https://github.com/qmu/dockerfiles/blob/master/src/selenium-webdriver-node/example/bin/run)
"use strict";
const webdriver = require('selenium-webdriver'),
By = webdriver.By,
until = webdriver.until,
test = require('selenium-webdriver/testing');
const expect = require('expect.js');
const assert = require('assert');
// var driver = new webdriver.Builder()
// .withCapabilities(webdriver.Capabilities.chrome())
// .usingServer('http://localhost:4444/wd/hub')
// .build();
var driver = new webdriver.Builder()
.forBrowser('firefox')
.usingServer('http://zalenium:4444/wd/hub')
.build();
driver.get('http://www.google.com');
driver.findElement(webdriver.By.name('q')).sendKeys('simple programmer');
driver.findElement(webdriver.By.name('btnG')).click();
//driver.quit();
console.log('all modules are ready!');
我试过不使用 --net 命令并使用...但没有成功。这样您就可以看到网络详细信息和容器 运行ning。你可以看到 zalenium 被添加到 distributiontech_default 网络中。
如何将 docker 容器 运行ning selenium 代码连接到 docker 集线器 运行ning Zalenium?
我尝试将其更改为...
var driver = new webdriver.Builder()
.forBrowser('firefox')
.usingServer('http://localhost:4444/wd/hub')
.build();
但也不走运。我可以把任何我想要的假地址放在它说本地主机的地方,它似乎不会抛出任何错误或任何奇怪的东西。
好吧,我不知道我到底做了什么,但是其中一个步骤让它突然起作用了。我想这就是我写剧本的方式。
首先用docker容器做摩卡测试这里是我用的命令
docker run -it --rm --net=distributiontech_main -v $HERE:/workspace qmu1/selenium-webdriver-node:latest /bin/sh -c "mocha tests/seleniumtest.js --timeout=10000"
请注意,您需要在正确的 --net(网络) 上并卷入正确的位置,并为您自己使用正确的 .js 文件路径。
我使用的作曲家文件我添加到最底部
networks:
main:
然后对于我放置的每个服务...
networks:
- main
网络名称将默认为您的项目所在的名称加上一个 _ 以及您在 composer 文件中定义的名称。使用命令 docker network ls
查看您当前的网络。您可以使用 docker network rm networknamehere
清除旧的未使用的,只是不要删除网桥、主机或 none,因为它们是默认值。
可能没有必要将此步骤放到网络上,因为默认情况下已从 docker compose 为您创建了一个。您可以使用docker network ls
命令查看它。
一个对我有用的示例 selenium 文件是这个...
"use strict";
var webdriver = require('selenium-webdriver'),
{ describe, it, after, before } = require('selenium-webdriver/testing'),
By = webdriver.By,
until = webdriver.until;
var driver;
describe('Login Test', function () {
this.timeout(50000);//50 seconds
beforeEach(function(){
driver = new webdriver.Builder()
.withCapabilities({'browserName': 'chrome','name':'Chrome Test','tz':'America/Los_Angeles','build':'Chrome Build','idleTimeout':'60'})
.usingServer('http://zalenium:4444/wd/hub')
.build();
driver.get('http://distribution.tech.sel');
});
afterEach(function(){
driver.quit();
});
//this.timeout(20000);
it('Should show welcome message after entering credentials', function () {
driver.findElement(By.name('_username')).sendKeys('**');
driver.findElement(By.name('_password')).sendKeys('**');
driver.findElement(By.css("button")).click();
});
it('The title should say something interesting', function () {
});
it('And this thing too...', function () {
});
});
注意这里的关键是我指的是不在同一网络上的 zalenium,.usingServer('http://zalenium:4444/wd/hub')
,这会自动解析 ip 地址,脚本可以轻松找到 zalenium 服务器。
另一件事是因为我的网站在另一个容器上,所以我添加了这个以便在 composer 文件中更容易访问它。
networks:
main:
aliases:
- distribution.tech.sel
这将取代
networks:
-main
它创建了一个别名,因此您可以在访问项目时使用域名来引用该项目。从技术上讲,在我的作曲家文件中,我调用了服务 'web' 并且我可以通过这种方式访问它,但是我的网站使用域名信息来决定它是处于测试版还是开发模式,因此在连接时提供正确的域很重要就我而言。
希望这对某人有所帮助。
示例整个 dockercompose.yml 文件
version: "3"
services:
dblive:
image: mysql:5.5.52
volumes:
- ./db_data_live:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: **
MYSQL_DATABASE: **
MYSQL_USER: **
MYSQL_PASSWORD: **
networks:
- main
dbdev:
image: mysql:5.5.52
volumes:
- ./db_data_dev:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: **
MYSQL_DATABASE: **
MYSQL_USER: **
MYSQL_PASSWORD: **
networks:
- main
phpmyadmin:
depends_on:
- dblive
- dbdev
image: phpmyadmin/phpmyadmin
environment:
PMA_ARBITRARY : 1
restart: always
ports:
- "8081:80"
networks:
- main
zalenium:
image: "dosel/zalenium"
container_name: zalenium
hostname: zalenium
tty: true
volumes:
- /Users/josephastrahan/seluser/videos:/home/seluser/videos
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- 4444:4444
command: >
start --chromeContainers 2
--firefoxContainers 2
--maxDockerSeleniumContainers 8
--screenWidth 800 --screenHeight 600
--timeZone "America/Los_Angeles"
--videoRecordingEnabled true
--sauceLabsEnabled false
--browserStackEnabled false
--testingBotEnabled false
--startTunnel false
environment:
- HOST_UID
- HOST_GID
- SAUCE_USERNAME
- SAUCE_ACCESS_KEY
- BROWSER_STACK_USER
- BROWSER_STACK_KEY
- TESTINGBOT_KEY
- TESTINGBOT_SECRET
networks:
main:
aliases:
- zalenium.test
web:
#build: ./
depends_on:
- dblive
- dbdev
- zalenium
image: **
volumes:
- ./web:/var/www
- ./config/custom.php.ini:/etc/php5/apache2/conf.d/custom.php.ini
- ./logs/apache_error.log:/var/log/apache2/error.log
- ./logs/apache_access.log:/var/log/apache2/access.log
- ./config/apache_default.conf:/etc/apache2/sites-available/000-default.conf
- ./config/apache_default-ssl.conf:/etc/apache2/sites-available/default-ssl.conf
- ./config/ssl/apache.key:/etc/apache2/ssl/apache.key
- ./config/ssl/apache.crt:/etc/apache2/ssl/apache.crt
- ./web/public_html/livesite:/app
- ./web/public_html/devsite:/appdev
restart: always
ports:
#Standard HTTP Port
- "80:80"
#Below allows access to local computer from outside ports
- "8080:80"
#Standard SSH Port
- "443:443"
#Below allows access to local computer from outside ports for SSH Testing
- "4443:443"
extra_hosts:
- "distribution.tech:127.0.0.1"
- "dev.distribution.tech:127.0.0.1"
- "distribution.tech.local:127.0.0.1"
- "dev.distribution.tech.local:127.0.0.1"
networks:
main:
aliases:
- distribution.tech.sel
# external_links:
# - web:dev.distribution.tech
# - web:distribution.tech
networks:
main:
我有一个类似的问题,我发现我可以使用 --link 命令,这样我就可以 link 一个命名的 Zalenium 网格实例docker 执行我的测试的实例:
docker run --privileged --name stg-selenium-client --rm=true --link zalenium:hub hub.platformservices.io/sbg_core_automation/core-test-runner-with-maven-dependencies:0.12 <command to execute tests>
由于我当前项目的情况,我需要将 2 docker 个图像一起用于 selenium 测试。
一个叫做 Zalenium。我通过 docker-compose 演示启动并工作。它基本上类似于 selenium docker 存储库,只是它可以录制视频并向您显示实时进度。
zalenium:
image: "dosel/zalenium"
container_name: zalenium
hostname: zalenium
tty: true
volumes:
- /Users/josephastrahan/seluser/videos:/home/seluser/videos
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- 4444:4444
command: >
start --chromeContainers 1
--firefoxContainers 1
--maxDockerSeleniumContainers 8
--screenWidth 800 --screenHeight 600
--timeZone "Europe/Berlin"
--videoRecordingEnabled true
--sauceLabsEnabled false
--browserStackEnabled false
--testingBotEnabled false
--startTunnel false
environment:
- HOST_UID
- HOST_GID
- SAUCE_USERNAME
- SAUCE_ACCESS_KEY
- BROWSER_STACK_USER
- BROWSER_STACK_KEY
- TESTINGBOT_KEY
- TESTINGBOT_SECRET
另一个图像是预装了 Mocha 的 NodeJS 服务器和 selenium-webdriver 的 nodejs(npm 包),这样我就可以 运行 命令来触发浏览器自动化。此处有详细信息 (https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver) and here (https://hub.docker.com/r/qmu1/selenium-webdriver-node/)
您可以在这里看到来自 docker 的 Zalenium 运行ning 编写得很好。我可以正确地看到时间每秒更新一次,所以它确实显示了实时视图。
根据我正在使用的另一个 docker 容器的文档(https://hub.docker.com/r/qmu1/selenium-webdriver-node/),我应该能够 运行 简单地使用 [=63] 进行测试=] 这样的命令。
HERE=$(pwd)
echo ""
echo "----------------------------"
echo "Running an example"
echo "----------------------------"
echo ""
docker run -it --rm \
-v $HERE:/workspace \
qmu1/selenium-webdriver-node:latest /bin/sh -c "
mocha sample.js --timeout=10000
"
我更改了此命令以满足我的需要,直到它看起来很有效。
docker run -it --rm --net=distributiontech_default -v $HERE:/workspace qmu1/selenium-webdriver-node:latest /bin/sh -c "mocha tests/seleniumtest.js --timeout=10000"
我得到回复:
all modules are ready!
0 passing (1ms)
问题是...在 Zalenium 上,我没有看到查看器上发生任何事情来验证它是否正常工作?
我的 selenium 脚本如下所示。
//Run using this project (https://github.com/qmu/dockerfiles/blob/master/src/selenium-webdriver-node/example/bin/run)
"use strict";
const webdriver = require('selenium-webdriver'),
By = webdriver.By,
until = webdriver.until,
test = require('selenium-webdriver/testing');
const expect = require('expect.js');
const assert = require('assert');
// var driver = new webdriver.Builder()
// .withCapabilities(webdriver.Capabilities.chrome())
// .usingServer('http://localhost:4444/wd/hub')
// .build();
var driver = new webdriver.Builder()
.forBrowser('firefox')
.usingServer('http://zalenium:4444/wd/hub')
.build();
driver.get('http://www.google.com');
driver.findElement(webdriver.By.name('q')).sendKeys('simple programmer');
driver.findElement(webdriver.By.name('btnG')).click();
//driver.quit();
console.log('all modules are ready!');
我试过不使用 --net 命令并使用...但没有成功。这样您就可以看到网络详细信息和容器 运行ning。你可以看到 zalenium 被添加到 distributiontech_default 网络中。
如何将 docker 容器 运行ning selenium 代码连接到 docker 集线器 运行ning Zalenium?
我尝试将其更改为...
var driver = new webdriver.Builder()
.forBrowser('firefox')
.usingServer('http://localhost:4444/wd/hub')
.build();
但也不走运。我可以把任何我想要的假地址放在它说本地主机的地方,它似乎不会抛出任何错误或任何奇怪的东西。
好吧,我不知道我到底做了什么,但是其中一个步骤让它突然起作用了。我想这就是我写剧本的方式。
首先用docker容器做摩卡测试这里是我用的命令
docker run -it --rm --net=distributiontech_main -v $HERE:/workspace qmu1/selenium-webdriver-node:latest /bin/sh -c "mocha tests/seleniumtest.js --timeout=10000"
请注意,您需要在正确的 --net(网络) 上并卷入正确的位置,并为您自己使用正确的 .js 文件路径。
我使用的作曲家文件我添加到最底部
networks:
main:
然后对于我放置的每个服务...
networks:
- main
网络名称将默认为您的项目所在的名称加上一个 _ 以及您在 composer 文件中定义的名称。使用命令 docker network ls
查看您当前的网络。您可以使用 docker network rm networknamehere
清除旧的未使用的,只是不要删除网桥、主机或 none,因为它们是默认值。
可能没有必要将此步骤放到网络上,因为默认情况下已从 docker compose 为您创建了一个。您可以使用docker network ls
命令查看它。
一个对我有用的示例 selenium 文件是这个...
"use strict";
var webdriver = require('selenium-webdriver'),
{ describe, it, after, before } = require('selenium-webdriver/testing'),
By = webdriver.By,
until = webdriver.until;
var driver;
describe('Login Test', function () {
this.timeout(50000);//50 seconds
beforeEach(function(){
driver = new webdriver.Builder()
.withCapabilities({'browserName': 'chrome','name':'Chrome Test','tz':'America/Los_Angeles','build':'Chrome Build','idleTimeout':'60'})
.usingServer('http://zalenium:4444/wd/hub')
.build();
driver.get('http://distribution.tech.sel');
});
afterEach(function(){
driver.quit();
});
//this.timeout(20000);
it('Should show welcome message after entering credentials', function () {
driver.findElement(By.name('_username')).sendKeys('**');
driver.findElement(By.name('_password')).sendKeys('**');
driver.findElement(By.css("button")).click();
});
it('The title should say something interesting', function () {
});
it('And this thing too...', function () {
});
});
注意这里的关键是我指的是不在同一网络上的 zalenium,.usingServer('http://zalenium:4444/wd/hub')
,这会自动解析 ip 地址,脚本可以轻松找到 zalenium 服务器。
另一件事是因为我的网站在另一个容器上,所以我添加了这个以便在 composer 文件中更容易访问它。
networks:
main:
aliases:
- distribution.tech.sel
这将取代
networks:
-main
它创建了一个别名,因此您可以在访问项目时使用域名来引用该项目。从技术上讲,在我的作曲家文件中,我调用了服务 'web' 并且我可以通过这种方式访问它,但是我的网站使用域名信息来决定它是处于测试版还是开发模式,因此在连接时提供正确的域很重要就我而言。
希望这对某人有所帮助。
示例整个 dockercompose.yml 文件
version: "3"
services:
dblive:
image: mysql:5.5.52
volumes:
- ./db_data_live:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: **
MYSQL_DATABASE: **
MYSQL_USER: **
MYSQL_PASSWORD: **
networks:
- main
dbdev:
image: mysql:5.5.52
volumes:
- ./db_data_dev:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: **
MYSQL_DATABASE: **
MYSQL_USER: **
MYSQL_PASSWORD: **
networks:
- main
phpmyadmin:
depends_on:
- dblive
- dbdev
image: phpmyadmin/phpmyadmin
environment:
PMA_ARBITRARY : 1
restart: always
ports:
- "8081:80"
networks:
- main
zalenium:
image: "dosel/zalenium"
container_name: zalenium
hostname: zalenium
tty: true
volumes:
- /Users/josephastrahan/seluser/videos:/home/seluser/videos
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- 4444:4444
command: >
start --chromeContainers 2
--firefoxContainers 2
--maxDockerSeleniumContainers 8
--screenWidth 800 --screenHeight 600
--timeZone "America/Los_Angeles"
--videoRecordingEnabled true
--sauceLabsEnabled false
--browserStackEnabled false
--testingBotEnabled false
--startTunnel false
environment:
- HOST_UID
- HOST_GID
- SAUCE_USERNAME
- SAUCE_ACCESS_KEY
- BROWSER_STACK_USER
- BROWSER_STACK_KEY
- TESTINGBOT_KEY
- TESTINGBOT_SECRET
networks:
main:
aliases:
- zalenium.test
web:
#build: ./
depends_on:
- dblive
- dbdev
- zalenium
image: **
volumes:
- ./web:/var/www
- ./config/custom.php.ini:/etc/php5/apache2/conf.d/custom.php.ini
- ./logs/apache_error.log:/var/log/apache2/error.log
- ./logs/apache_access.log:/var/log/apache2/access.log
- ./config/apache_default.conf:/etc/apache2/sites-available/000-default.conf
- ./config/apache_default-ssl.conf:/etc/apache2/sites-available/default-ssl.conf
- ./config/ssl/apache.key:/etc/apache2/ssl/apache.key
- ./config/ssl/apache.crt:/etc/apache2/ssl/apache.crt
- ./web/public_html/livesite:/app
- ./web/public_html/devsite:/appdev
restart: always
ports:
#Standard HTTP Port
- "80:80"
#Below allows access to local computer from outside ports
- "8080:80"
#Standard SSH Port
- "443:443"
#Below allows access to local computer from outside ports for SSH Testing
- "4443:443"
extra_hosts:
- "distribution.tech:127.0.0.1"
- "dev.distribution.tech:127.0.0.1"
- "distribution.tech.local:127.0.0.1"
- "dev.distribution.tech.local:127.0.0.1"
networks:
main:
aliases:
- distribution.tech.sel
# external_links:
# - web:dev.distribution.tech
# - web:distribution.tech
networks:
main:
我有一个类似的问题,我发现我可以使用 --link 命令,这样我就可以 link 一个命名的 Zalenium 网格实例docker 执行我的测试的实例:
docker run --privileged --name stg-selenium-client --rm=true --link zalenium:hub hub.platformservices.io/sbg_core_automation/core-test-runner-with-maven-dependencies:0.12 <command to execute tests>