Запустите команды Selenium для Zalenium из другого контейнера Docker
В связи с моими обстоятельствами для текущего проекта мне нужно использовать 2 изображения докера для тестирования селена.
Один называется Zalenium. У меня есть это и работает через демонстрацию docker-compose. По сути, он похож на репозиторий селеновых докеров, за исключением того, что он может записывать видео и показывать вам живой прогресс.
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
Другой образ - сервер NodeJS, предустановленный с Mocha, и nodejs (пакет npm) для selenium-webdriver, так что я могу запускать команды для запуска автоматизации браузера. Подробности об этом здесь ( https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver) и здесь ( https://hub.docker.com/r/qmu1/selenium-webdriver-node/)
Вы можете видеть, что Zalenium, работающий из докера, просто отлично скомпонован. Я могу видеть, как время корректно обновляется каждую секунду, поэтому оно определенно показывает в реальном времени.
В соответствии с документацией на другой докер-контейнер, который я использую, который находится здесь ( https://hub.docker.com/r/qmu1/selenium-webdriver-node/), я должен иметь возможность запускать тесты просто с помощью докера команда как это.
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 я не видел, чтобы что-то происходило со зрителем, чтобы убедиться, что оно вообще работает?
Мой сценарий селена выглядит как ниже.
//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 и с... и не повезло. Просто чтобы вы могли видеть детали сети и работающие контейнеры. Вы можете видеть, что zalenium добавлен в сеть distributiontech_default.
Как подключить Docker-контейнер, на котором запущен код селена, к Docker-концентратору с Zalenium?
Я пытался изменить это на...
var driver = new webdriver.Builder()
.forBrowser('firefox')
.usingServer('http://localhost:4444/wd/hub')
.build();
но тоже не повезло. Я могу поместить любой поддельный адрес, который я хочу, где он говорит localhost, и он, кажется, не выдает никаких ошибок или чего-либо достаточно странного.
2 ответа
Ну, я понятия не имею, что именно я сделал, но один из этих шагов заставил его работать внезапно. Я думаю, что это был способ, которым я писал сценарий.
Сначала, чтобы выполнить тест mocha с контейнером 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
В качестве имени сети по умолчанию будет использоваться имя вашего проекта с _ и именем, которое вы определили в файле композитора. Используйте команду docker network ls
для просмотра ваших текущих сетей. Вы можете удалить старые неиспользуемые docker network rm networknamehere
, только не удаляйте bridge, host или none, так как они по умолчанию.
Этот шаг для подключения к сетям может быть необязательным, поскольку он по умолчанию создан для вас из docker compose. Вы можете увидеть это, используя docker network ls
команда.
Пример файла селена, который работал для меня, был следующим...
"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.
Другое дело, что мой сайт находится в другом контейнере, и я добавил его, чтобы упростить доступ к нему в файле композитора.
networks:
main:
aliases:
- distribution.tech.sel
Это заменяет
networks:
-main
Он создает псевдоним, чтобы вы могли использовать доменное имя для обращения к проекту при доступе к нему. Технически в моем файле композитора я назвал сервис "веб", и я мог получить к нему доступ таким образом, но мой сайт использует информацию о доменном имени, чтобы решить, находится ли он в бета-версии или в режиме dev, поэтому было важно предоставить правильный домен при подключении к нему. в моем случае.
Надеюсь, это кому-нибудь поможет.
Пример всего файла 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, чтобы связать именованный экземпляр сетки 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>