Запустите команды 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>
Другие вопросы по тегам