1

由于我当前项目的情况,我需要一起使用 2 个 docker 图像进行硒测试。

一种叫做扎伦铵。我通过 docker-compose 演示完成并工作。它基本上类似于 selenium docker repo,只是它可以录制视频并显示实时进度。

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 和 selenium-webdriver 的 nodejs(npm 包),这样我就可以运行命令来触发浏览器自动化。详细信息在这里(https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver)和这里(https://hub.docker.com/r/qmu1/selenium-webdriver-节点/ )

您可以在这里看到从 docker compose 运行的 Zalenium。我可以正确地看到每秒更新的时间,因此它肯定会显示实时视图。

在此处输入图像描述

根据我正在使用的另一个 docker 容器的文档(https://hub.docker.com/r/qmu1/selenium-webdriver-node/),我应该能够简单地使用 docker 运行测试像这样的命令。

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 网络。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

如何将运行 selenium 代码的 docker 容器连接到运行 Zalenium 的 docker hub?

我尝试将其更改为...

var driver = new webdriver.Builder()
    .forBrowser('firefox')
    .usingServer('http://localhost:4444/wd/hub')
    .build();

但也没有运气。我可以将任何我想要的假地址放在它说 localhost 的地方,而且它似乎没有抛出任何错误或任何奇怪的东西。

4

2 回答 2

1

好吧,我不知道我到底做了什么,但是其中一个步骤让它突然起作用了。我想这就是我写剧本的方式。

首先使用 docker 容器进行 mocha 测试,这里是我使用的命令。

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,只是不要删除桥、主机或无,因为它们是默认值。

由于默认情况下从 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

它创建了一个别名,因此您可以在访问项目时使用域名来引用它。从技术上讲,在我的作曲家文件中,我将服务称为“web”,我可以通过这种方式访问​​它,但是我的网站使用域名信息来决定它是处于 beta 还是 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:
于 2017-10-09T06:22:05.693 回答
1

我有一个类似的问题,我发现我可以使用--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>
于 2017-12-08T13:55:20.487 回答