2017-06-21 16 views
0

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

泊塢窗 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(''); 
}); 

問題仍然清晰,無法獲得角分量

的內部HTML

EDIT3:

我測試過此頁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); 
    }); 

回答

0

Docker試圖連接不存在的API http://ify-nginx/api/ ... 該調用期望在寄存器表單上生成所需字段的列表。當返回null時,字段不會被生成,本身,量角器找不到任何東西。

正如你可以在上面看到,奇怪的事情是發生在這裏(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> 

我們得到了一個,如果在API代碼檢查,如果網址爲「本地主機」或服務器的IP,而不是' IFY-nginx的」。當檢測到ify-nginx時,api域被重定向到它,並且它不加載內容。

0

您漏填了 「;」在browser.wait返回結束時。 此外,嘗試

return displaySurnameInput.isPresent(); 

而且是5秒足以載入頁面?

您也可以通過禁用報告庫來禁用獲取有關錯誤的更多詳細信息。或者它可以選擇顯示更多細節。

如果使用browser.ignoreSynchronisation = true;在瀏覽器之前等待並等待之後,它會改變什麼?

+0

你好bwarff!它仍然在發生......但我發現了一個奇怪的行爲,browser.pause()在docker中不起作用,所以......我不知道這個問題是關於chrome-> docker而不是量角器 - > docker – Alf

+0

你沒有手如果在Docker中完成,則恢復暫停。 但是,您可以顯示頁面上的元素並將其記錄下來。例如,您可以像$('html')那樣定義一個定位器,並在此時顯示您在頁面上的內容,如下所示: $('html')。getAttribute('textContent')。then(function(內容){ console.log(content); }); 你可以使用其他getAttribute textContent顯示dom,但我不記得使用哪種方法。 另外,如果您不刷新頁面,您的測試是否正常? – bwarff

+0

刷新頁面是爲了從LocalStorage正確加載正確的api-url(我刪除了代碼,因爲它不認爲這很重要)。我試圖公開dom到控制檯,但我不能:') – Alf

相關問題