首页 > 解决方案 > 如何运行包含 Angular 的 dockerized protractor 项目?

问题描述

我是量角器的新手。我用 angular 创建了一个项目,它在没有 docker 的情况下工作正常。但是,当我构建图像时,它已成功创建。不幸的是无法运行那个。

文件夹:量角器内容如下

.
./Dockerfile
./protractor.sh
./protractor.conf.js
./package-lock.json
./node_modules
./package.json
./specs

我已经使用此命令手动运行它

protractor$ ./protractor.sh protractor.conf.js

然后结果如下

[14:36:13] I/launcher - Running 1 instances of WebDriver
[14:36:13] I/local - Starting selenium standalone server...
[14:36:14] I/local - Selenium standalone server started at http://192.168.8.103:53238/wd/hub
[14:36:14] I/start - java -Djava.security.egd=file:///dev/./urandom -Dwebdriver.gecko.driver=/usr/lib/node_modules/protractor/node_modules/webdriver-manager/selenium/geckodriver-v0.29.1 -Dwebdriver.chrome.driver=/usr/lib/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_90.0.4430.24 -jar /usr/lib/node_modules/protractor/node_modules/webdriver-manager/selenium/selenium-server-standalone-3.141.59.jar -port 4444
[14:36:14] I/start - seleniumProcess.pid: 14964
14:36:14.643 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358
14:36:14.710 INFO [GridLauncherV3.lambda$buildLaunchers$3] - Launching a standalone Selenium Server on port 4444
2021-05-23 14:36:14.744:INFO::main: Logging initialized @260ms to org.seleniumhq.jetty9.util.log.StdErrLog
14:36:14.951 INFO [WebDriverServlet.<init>] - Initialising WebDriverServlet
14:36:15.069 INFO [SeleniumServer.boot] - Selenium Server is up and running on port 4444
Started
[14:36:20] W/element - more than one element found for locator By(css selector, .ng-binding) - the first result will be used
.


1 spec, 0 failures
Finished in 7.482 seconds

[14:36:22] I/local - Shutting down selenium standalone server.
[14:36:22] I/launcher - 0 instance(s) of WebDriver still running
[14:36:22] I/launcher - chrome #01 passed

Docker构建命令如下

sudo docker build -t priyanwso2/protractor-docker .
Sending build context to Docker daemon   36.5MB
Step 1/8 : FROM         node:latest
 ---> 7493e35c7ffa
Step 2/8 : WORKDIR  /tmp
 ---> Using cache
 ---> d1941bcedacd
Step 3/8 : RUN      apt-get update --fix-missing &&         apt-get install -y xvfb wget openjdk-11-jre-headless libgconf-2-4 libexif12 chromium &&         apt-get clean
 ---> Using cache
 ---> 0f440f61b0f9
Step 4/8 : RUN      mkdir /protractor &&            npm install -g protractor
 ---> Using cache
 ---> eca289196866
Step 5/8 : RUN      webdriver-manager update
 ---> Using cache
 ---> fa2d0cc0ca06
Step 6/8 : ADD      protractor.sh /protractor.sh
 ---> Using cache
 ---> 83ef2046c6b0
Step 7/8 : WORKDIR  /protractor
 ---> Using cache
 ---> 0f7bb601e197
Step 8/8 : ENTRYPOINT   ["/protractor.sh"]
 ---> Using cache
 ---> a25c6c8f566b
Successfully built a25c6c8f566b
Successfully tagged priyanwso2/protractor-docker:latest

当我运行 docker images 时,它在 docker images list 中列出

priyanwso2/protractor-docker   latest    a25c6c8f566b   47 minutes ago   1.69GB

当我尝试运行 docker 映像时,它会给出以下错误

sudo docker run priyanwso2/protractor-docker protractor.conf.js
[09:09:57] E/configParser - Error code: 105
[09:09:57] E/configParser - Error message: failed loading configuration file protractor.conf.js
[09:09:57] E/configParser - Error: Cannot find module '/protractor/protractor.conf.js'
Require stack:
- /usr/local/lib/node_modules/protractor/built/configParser.js
- /usr/local/lib/node_modules/protractor/built/launcher.js
- /usr/local/lib/node_modules/protractor/built/cli.js
- /usr/local/lib/node_modules/protractor/bin/protractor
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:941:15)
    at Function.Module._load (node:internal/modules/cjs/loader:774:27)
    at Module.require (node:internal/modules/cjs/loader:1013:19)
    at require (node:internal/modules/cjs/helpers:93:18)
    at ConfigParser.addFileConfig (/usr/local/lib/node_modules/protractor/built/configParser.js:135:26)
    at Object.initFn [as init] (/usr/local/lib/node_modules/protractor/built/launcher.js:93:22)
    at Object.<anonymous> (/usr/local/lib/node_modules/protractor/built/cli.js:227:10)
    at Module._compile (node:internal/modules/cjs/loader:1109:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
    at Module.load (node:internal/modules/cjs/loader:989:32)

操作系统 Ubuntu 18.04 LTS(64 位)

Dockerfile

FROM            node:latest

WORKDIR         /tmp

RUN             apt-get update --fix-missing && \
                apt-get install -y xvfb wget openjdk-11-jre-headless libgconf-2-4 libexif12 chromium && \
                apt-get clean

RUN             mkdir /protractor && \
                npm install -g protractor

RUN             webdriver-manager update

ADD             protractor.sh /protractor.sh

WORKDIR         /protractor

ENTRYPOINT      ["/protractor.sh"]

package.json 文件如下

{
  "name": "test",
  "version": "1.0.0",
  "description": "Test e2e package",
  "main": "conf.js",
  "dependencies": {
    "chromedriver": "^90.0.1",
    "jasmine": "^3.7.0",
    "protractor": "^7.0.0",
    "webdriver-manager": "^12.1.8"
  },
  "scripts": {
    "test": "protractor.conf.js"
  },
  "author": "SOAS",
  "license": "ISC"
}

protractor.conf.js 如下

exports.config = {
  multiCapabilities: [{browserName: 'chrome'}],
  specs: ['specs/superCalculatorTest.js' ],
  onPrepare: function(){browser.ignoreSynchronization = true;},
};

有关 protractor.sh 中的代码,请参见此处

#!/bin/bash
webdriver-manager start &
protractor $@

在 specs 文件夹下存在一个 js (superCalculatorTest.js)。这是它的代码

const { $, browser } = require("protractor");
let url = 'https://juliemr.github.io/protractor-demo/';

describe('Super Calculator Test suite', () => {
    it('Verify Adding two Integers', () => {
        browser.get(url);
        browser.sleep(2000);
        element(by.model('first')).sendKeys(2);
        element(by.model('second')).sendKeys(5);
        element(by.id('gobutton')).click();
        browser.sleep(2000);
        expect(element(by.className('ng-binding')).getText()).toEqual('7');
        browser.sleep(2000);
    });
});

请帮忙解决这个问题。我使用这个中等页面来编写测试部分。 https://bytes.grubhub.com/end-to-end-testing-with-docker-71008dca11a0

标签: angulardockerseleniumnpmprotractor

解决方案


您缺少 dockerfile 中最重要的部分。您需要将所有文件复制到容器中。您正在运行mkdir,然后立即运行npm install,但您的protractor目录中没有任何内容。它是空的。

COPY /path/to/source /path/to/destination

请参阅文档https://docs.docker.com/engine/reference/builder/#copy


推荐阅读