2017-05-30 77 views
2

我正在使用量角器。我知道量角器有類似於語法的Jquery,但我需要一些可以在我的一些測試中基於DOM元素創建條件,變量和循環的東西。我想能夠使用querySelector。僅僅使用承諾不會讓我做我需要做的那種測試。爲什麼我不能在量角器中使用querySelector?

當我運行它,它說:

Failed: Cannot read property 'querySelector' of undefined 

Failed: document is not defined 

Failed: window is not defined 

我已經建立了一個測試,測試這個問題。它運行我正在看的一個隨機的網頁。它使用量角器選擇頁腳,然後使用querySelector嘗試它。如果我在控制檯中輸入querySelector部分,它將正確運行代碼。我也嘗試了querySelector的變體,使用window.document;這也適用於瀏覽器,但不適用於量角器。

describe("Test", function() 
{ 
    it('This is a test to test protractor' , function() 
    { 
    browser.waitForAngularEnabled(false); 
    browser.get("https://facebook.github.io/jest/"); 
    $("#footer").getAttribute("innerHTML").then(function(value) 
    { 
     console.log("inside value then"); 
     console.log(value); 

    }); 

    var queryse = document.querySelector("#footer").innerHTML; 
    // var queryse = browser.document.querySelector("#footer").innerHTML; 
    // var queryse = window.document.querySelector("#footer").innerHTML; 

    console.log('query selector'); 
    console.log(queryse); 
    }); 

}); 

enter image description here

回答

4

實際上它是在Node.js執行你的量角器測試用例運行並沒有真正在瀏覽器中運行的代碼。您應該將其視爲一個API,然後通過WebDriver與瀏覽器進行通信。這意味着您不能在代碼中使用特定於瀏覽器的JavaScript API。 $幫手只是爲了使語法簡單易懂,而無需瞭解Selenium的任何信息。這就是爲什麼documentwindow無法訪問您。如果您想了解更多有關:https://github.com/angular/protractor/blob/master/docs/locators.md

+0

如果我需要在沒有承諾的情況下查找DOM元素,該怎麼辦? – munchschair

+0

這是不可能的,這就是'WebDriver'的工作方式,你可以用它做什麼,對不起 – Nhor

+0

很高興知道,謝謝! – munchschair

1

@ NHOR的答案是在環境方面,爲什麼你不能直接使用documentwindow大多是正確的。但是,對於它的價值,你一定可以通過executeScript找到DOM中的元素。唯一的問題是,你爲什麼需要這樣做?

您可以在DOM中使用的任何定位器,您可以在量角器中使用(雖然語法可能不同)。這裏有一個例子,我以前innerHTML,因爲這是你在你的情況下,試圖:

describe('Protractor Demo App', function() { 
    it('element test', function() { 
    browser.get('http://juliemr.github.io/protractor-demo/'); 
    var el = browser.executeScript('return document.querySelector("h3").innerHTML'); 
    el.then(function (text) { 
     console.log(text); // logs "Super Calculator" 
    }); 
    }); 
}); 

最後,需要注意的是這個el是從executeScript調用內受限於JavaScript函數是很重要的。它不是版本的量角器ElementFinder,你不能執行像getText()這樣的動作(雖然它仍然是一個承諾,所以你需要撥打.then())。您可以在el上執行控制檯日誌以查看該對象中的內容。

+0

如果它仍然是一個承諾,這對於常規的ElementFinder有什麼好處? – munchschair

+0

@munchschair真的沒什麼好處,這就是爲什麼我在我的答案中包含「爲什麼你需要這樣做?」。您可以使用'querySelector'獲得任何定位器,您可以從他們的方法中獲得量角器。只是想讓你知道這是可能的 – Gunderson

相關問題