在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到它,并且不加载内容。
- 无法在docker容器中创build量angular器testing报告
- Docker中的量angular器testing – asynchronouscallback没有在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时
- 需要使用Azure容器registry将angular度种子高级项目部署到Azure应用程序服务
- 量angular器testing在Jenkins的Docker中随机超时,在本地Docker中正常工作
- Docker – 带有Angular 4模板的ASP.NET Core 2.0
- Gitlab runner:可以运行一个依赖于另一个的docker镜像
- docker ERR_NAME_NOT_RESOLVED http ajax
- 使用NginX在服务器上部署Angular2应用程序时,不会加载子组件
- 如何在Docker机器上运行Angular 2应用程序?