从另一个Docker容器运行Zalenium的Selenium命令

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

一个叫做Zalenium。 我已经通过docker-compose演示了。 它基本上像seleniumdocker回购,除了这可以loggingvideo,并显示你现场进展。

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 )和这里( https://hub.docker.com/r/qmu1/selenium-webdriver-节点/ )

你可以看到从docker运行的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上,我没有看到任何事情发生在查看器来validation它甚至工作?

我的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命令和…并没有运气。 只要这样你就可以看到networking的细节和容器的运行。 您可以看到zalenium已添加到distributiontech_defaultnetworking。

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

如何将运行Selenium代码的Docker容器连接到运行Zalenium的Docker中心?

我试着改变这个…

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

但也没有运气。 我可以把任何虚假的地址,我想要的地方,它似乎并没有抛出任何错误或任何奇怪的东西。

       

网上收集的解决方案 "从另一个Docker容器运行Zalenium的Selenium命令"

我有一个类似的问题,我发现我可以使用–link命令,所以我可以链接一个命名的Zalenium网格实例与执行我的testing的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> 

那么我不知道我做了什么,但其中一个步骤突然就起作用了。 我认为这是我写剧本的方式。

首先在Docker容器中进行摩卡testing是我使用的命令。

 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(networking)上,并调整正确的位置,并为自己使用正确的.js文件path。

我正在使用的composer php文件已添加到最底部

 networks: main: 

然后,我把每个服务…

 networks: - main 

networking名称将默认为您的项目所在的名称,以及您在composer php文件中定义的名称。 使用命令docker network ls查看您当前的networking。 您可以用docker network rm networknamehere清除旧的未使用的,只是不要删除桥,主机或没有,因为它们是默认的。

这个步骤放在networking上可能没有必要,因为默认情况下是从docker撰写的。 你可以通过使用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 () { }); }); 

注意这里的关键是我指的是不在同一个networking上的.usingServer('http://zalenium:4444/wd/hub') ,这会自动parsingIP地址,脚本能够findzalenium服务器容易。

另一件事是,因为我有我的网站在另一个容器,我添加这使访问更容易在composer php文件。

 networks: main: aliases: - distribution.tech.sel 

这取代了

 networks: -main 

它会创build一个别名,以便在访问项目时使用域名来引用项目。 从技术上来说,在我的作曲文件中,我调用了服务“web”,我可以这样访问它,但是我的站点使用域名信息来决定它是处于testing还是开发模式,所以在连接到域时,在我的情况。

希望这有助于某人。

示例整个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: