在docker运行的量angular器返回元素不存在,但在本地主机

我一直在尝试在Docker中运行一些量angular器testing,但是我发现了一个我无法解决的问题。 量angular器说这个元素不在Docker的网页里面,但是在localhost中。 此外,网页的CURL公开了HTML元素(正如你所知道的,而不是Angular组件中的HTML),但是仍然没有find元素。

首先,testing在localhost上正常工作:

/*********** TESTING **********/ beforeAll(function(){ browser.sleep(1).then(function() { console.log('Browser running ...'); }); browser.driver.manage().window().getSize().then(function(size) { console.log('Starting browser size', size); }); browser.get(specifiedURL+"/app/users/#/register"); browser.waitForAngular(); //We expect to wait for angular to be loaded so browser can load correctly his components browser.getCurrentUrl().then(function(url){ console.info("Browser redirected to "+url); }); browser.refresh(); //Refresh the view so it loads the content properly at the specified ngStorage-project url }); 

和两个testing

 it("should redirect to the specified page", function(){ expect(browser.getCurrentUrl()).toEqual(specifiedURL+"/app/users/#/register"); }); it("should exists a surname input in the page",function(){ var displaySurnameInput = element(by.id('signup-surname')); browser.wait(function() { return displaySurnameInput.isPresent(); }, 5000); expect(displaySurnameInput.getText()).toEqual(''); }); 

configuration文件就像

  let SpecReporter = require('jasmine-spec-reporter').SpecReporter; exports.config = { framework: "jasmine2", suites: { login: "tests/e2e/login/**/*Spec.js" }, multiCapabilities: [{ browserName: "chrome", chromeOptions: { args: [ "--headless", "--window-size=1200x800", "--disable-gpu", "--test-type", "--no-sandbox"] } }], jasmineNodeOpts: { showColors: true, silent: true, defaultTimeoutInterval: 360000, print: function () { } }, onPrepare: function () { jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: false } })); } } 

Docker链接到一个docker-nginx服务器,暴露在80端口,所以我们可以检查一个项目是否正确运行(它是)。 当我运行docker命令时:

 docker run -it -v /dev/shm:/dev/shm --privileged -e SCREEN_WIDTH=1920 -e SCREEN_HEIGHT=1480 -e SCREEN_DEPTH=24 --link ify-nginx:ify-nginx ify/test-runner bash 

我可以使用CURL访问网页,并在浏览器中显示网页HTML(实际上与在本地主机返回curl相同的结果),但不知何来量器不在URL内find元素(我已经试图得到元素通过多个茉莉花function,仍然发生同样的问题)。

LOCALHOST PROTRACTOR_RESULT

DOCKER PROTRACTOR_RESULT

谢谢!

EDIT1:

使用这个里面的docker生成一个错误,但不是在本地主机

 it("should exists a surname input in the page",function(){ var displaySurnameInput = element(by.id('signup-surname')); browser.pause(); browser.wait(function() { return displaySurnameInput.isPresent(); }, 5000); expect(displaySurnameInput.getText()).toEqual(''); }); 

错误(因为我是新手,我不能粘贴超过2个图像,所以我粘贴在这里的代码)

 [08:33:33] I/protractor - module.js:487 throw err; ^ Error: Cannot find module '_debugger' 

EDIT2:

运用

 browser.executeScript("return arguments[0].innerHTML;", $('html')).then(function (content) { console.log(content); }); 

我打印的HTML揭示组件…但不是内部的HTML(它奠定了正确的ID和实际的input元素)

  <section ng-show="step==1" style="overflow:hidden;"> <ify-input id="signup" field="name" ng-model="user.name" class="ng-pristine ng-untouched ng-valid ng-scope"><!-- ngIf: isAllowed(field) --></ify-input> <a id="signup-step1" class="ify-button ng-binding" ng-click="step2()">{{ ("Next" | translate).toUpperCase() }}</a> </section> 

我可以运行一个testing,通过search元素by.model,但它不是指内部的input,因为它应该与by.id.

 it("should find a model.name in the dom", function(){ var displayNameInput = element(by.model("user.name")); browser.wait(function() { return displayNameInput.isPresent(); }, 5000); expect(displayNameInput.getText()).toEqual(''); }); 

问题依然清楚,不能得到angular度组件的内部html

EDIT3:

我已经testing了这个页面https://docs.angularjs.org/examples/example-heroComponentSimple/index.html并暴露了HTML,并且它好像在读取组件的内部html。

HTML暴露:

  <body ng-app="heroApp" class="ng-scope"> <!-- components match only elements --> <div ng-controller="MainCtrl as ctrl" class="ng-scope"> <b>Hero</b><br> <hero-detail hero="ctrl.hero" class="ng-isolate-scope"><span class="ng-binding">Name: Spawn</span></hero-detail> </div> 

考试:

  it("example component web random",function(){ browser.get("https://docs.angularjs.org/examples/example-heroComponentSimple/index.html"); browser.waitForAngular(); browser.executeScript("return arguments[0].innerHTML;", $('html')).then(function (content) { console.log(content); }); expect(element(by.css('.ng-binding')).isPresent()).toBe(true); }); 

你错过了一个“;” 在browser.wait里面返回的结尾。 另外,尝试

 return displaySurnameInput.isPresent(); 

而且是5秒足够加载页面?

您也可以通过禁用报告库来禁用更多关于错误的细节。 或者,也可以select显示更多细节。

如果你使用browser.ignoreSynchronisation = true; 之前的browser.wait和等待之后,这是否改变什么?

Docker试图连接一个不存在的API在http:// ify-nginx / api / …这个调用期望在registry中生成一个必填字段的列表。 当返回null时,字段将不会被生成,每个量angular器都找不到任何东西。

正如你上面看到的,这里发生了一些奇怪的事情(ngIf:isAllowed)

 <ify-input id="signup" field="name" ng-model="user.name" class="ng-pristine ng-untouched ng-valid ng-scope"><!-- ngIf: isAllowed(field) --></ify-input> 

我们得到了一个if在api代码中检查url是否是'localhost'或服务器ip,而不是'ify-nginx'。 当检测到ify-nginx时,api域被redirect到它,并且不加载内容。