在docker容器中运行nodeJS应用程序,selenium和webdriver.iotesting

我正在尝试使用我的节点应用程序进行一些webdriver.iotesting,这是一个泊坞窗图像。

所以我到目前为止做的是:

1)通过在我的ubuntu服务器上运行这个来获取selenium服务器:

$ docker run -p 4444:4444 selenium/standalone-chrome 

这给了我运行的容器'ubuntu_selenium_1'( $ docker ps docker $ docker ps

2)构build节点应用程序docker image,在后台运行节点应用程序,并运行e2e.jstesting文件

在我的gitlab-ci.yml中,我正在做

 - docker build -t core:test -f Dockerfile.testing . - docker run --rm core:test 

这不会给我任何输出。 没有预期的标题和错误消息。

那么我做错了什么? 有一个正在运行的selenium服务器,有后台加载的节点应用程序,启动e2e.jstesting文件。

我错过了nodeJS应用程序,webdriver和selenium的连接…

Dockerfile.testing

 FROM core:latest # Copy the test files COPY docker-entrypoint.sh / COPY e2e.js / # Get npm packages AND install test framework - mocha and webdriver RUN (cd programs/server && npm install --silent) RUN npm install -g mocha --silent RUN npm install chai webdriverio --silent RUN chmod +x /docker-entrypoint.sh # Run application and then e2e test ENTRYPOINT ["/docker-entrypoint.sh"] 

docker-entrypoint.sh

 #!/bin/bash node main.js & node e2e.js 

也许这个入口脚本是错误的?

e2e.js

 var webdriverio = require('webdriverio'), options = { desiredCapabilities: { browserName: 'firefox' } } webdriverio .remote(options) .init() .url('http://localhost') // Which port do I have to use?? .getTitle().then(function(title) { console.log('Title was: ' + title) }) .end() 

我做了你所需要的,但是我把应用程序分离到了它自己的容器中。

你可以尝试一下我的例子: https : //github.com/xbx/webdriverio-docker-example

这里的变化:

首先,将一个catch()添加到您的webdriverio实例中:

 webdriverio .remote(options) .init() .url('http://app:3000') .getTitle().then(function(title) { console.log('Title was: ' + title) }) .catch(function(e){ console.log('Error!') console.log(e) }) .end() 

其次,使用chrome作为browserName(必须是,因为你使用了selenium铬):

 desiredCapabilities: { browserName: 'chrome' } 

第三,正确地指出你的应用程序:

 .url('http://app:3000') 

看看如何安排容器:

 version: "3" services: selenium: image: selenium/standalone-chrome ports: - 4444:4444 links: - app app: build: . ports: - 3000:3000 testing: build: context: . dockerfile: Dockerfile.testing command: /wait-for-it.sh selenium:4444 -- /wait-for-it.sh app:3000 -- node /e2e.js links: - app - selenium volumes: - ./wait-for-it.sh:/wait-for-it.sh 

运行它: docker-compose up --build

 Attaching to question_app_1, question_selenium_1, question_testing_1 app_1 | Started app. selenium_1 | 12:19:45.516 INFO - Selenium build info: version: '3.4.0', revision: 'unknown' ... selenium_1 | 12:19:45.769 INFO - Selenium Server is up and running testing_1 | Starting testing. selenium_1 | 12:19:47.827 INFO - Executing: [get: http://app:3000]) app_1 | Hit! selenium_1 | 12:19:48.210 INFO - Done: [get: http://app:3000] selenium_1 | 12:19:48.220 INFO - Executing: [get title]) selenium_1 | 12:19:48.239 INFO - Done: [get title] testing_1 | Title was: Hi, this is the title 

编辑:简单的更改docker构成版本1:

 testing: build:. dockerfile: Dockerfile.testing ...... ...... 

webdriverio找不到selenium

你正在调用webdriverio像这样:

 var webdriverio = require('webdriverio'), options = { desiredCapabilities: { browserName: 'firefox' } } 

默认情况下,它将尝试使用localhost:4444上的selenium服务器。 但是,这不会响应,因为每个容器都有自己的 localhost接口。 您的selenium服务器运行在不同的容器中。

你在你的问题中指出你的selenium容器的名字是ubuntu_selenium_1 。 所以你可以在那里指出webdriverio。 (容器名称可以像DNS主机名一样使用。)

 options = { desiredCapabilities: { browserName: 'firefox' }, host: 'ubuntu_selenium_1', port: 4444 } 

如果您的selenium容器的名称是其他东西,请将其replace为host参数。