我一直在嘗試在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