我一直在尝试在Docker中运行一些量角器测试,但是我发现了一个我无法解决的问题。 量角器说元素不在Docker的网页里面,但它在localhost中。此外,网页的CURL公开了HTML元素(如您所知,而不是Angular组件内的HTML),但仍未找到该元素。在Docker中运行的量角器返回元素不存在但在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
});
和两个测试
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('');
});
像
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
}
}));
}
}
配置文件中的泊坞窗链接到一个码头工人-nginx服务器暴露于端口80,所以我们可以检查一个项目是否正确运行或不运行(它是)。 当我运行的泊坞窗命令:
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浏览器(实际上是相同的结果本地主机回报卷曲),但不知何故量角器不在URL内部找到元素(我已经试图通过多个茉莉花函数获取元素,并且仍然发生同样的问题)。
LOCALHOST PROTRACTOR_RESULT
谢谢!
EDIT1:
使用这里面的码头工人产生错误,而不是在本地主机
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和实际输入元素)
<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>
我可以运行一个测试,通过搜索通过.model的元素,但它不是指内部输入,因为它应该做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('');
});
问题仍然清晰,无法获得角分量
的内部HTMLEDIT3:
我测试过此页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);
});
你好bwarff!它仍然在发生......但我发现了一个奇怪的行为,browser.pause()在docker中不起作用,所以......我不知道这个问题是关于chrome-> docker而不是量角器 - > docker – Alf
你没有手如果在Docker中完成,则恢复暂停。 但是,您可以显示页面上的元素并将其记录下来。例如,您可以像$('html')那样定义一个定位器,并在此时显示您在页面上的内容,如下所示: $('html')。getAttribute('textContent')。then(function(内容){ console.log(content); }); 你可以使用其他getAttribute textContent显示dom,但我不记得使用哪种方法。 另外,如果您不刷新页面,您的测试是否正常? – bwarff
刷新页面是为了从LocalStorage正确加载正确的api-url(我删除了代码,因为它不认为这很重要)。我试图公开dom到控制台,但我不能:') – Alf