2015-12-08 105 views
2

經過大量的研究和修補,我似乎無法真正讓我的量角器測試做其他任何事情,除了有角度相關的錯誤,即使我使用瀏覽器來避免檢測到Angular。用角度打開的非角度頁面 - 角度未定義使用ignoreSynchronization或等待角度沒有

該測試涉及一個Angular應用程序,在其中打開下拉菜單,然後單擊控制檯的鏈接;控制檯在單獨的窗口中打開非角度管理頁面。

因此,基於許多翔實的SO帖子,我發現,我第一次用這個...

browser.driver.getAllWindowHandles().then(function(handles) { 
    browser.driver.switchTo().window(handles[1]).then(function() { 
//expect for new window here 
      }); 
     }); 

這似乎工作,因爲我可以通過repl到窗口很容易地。 的問題是,當添加以下任一...

browser.driver.getAllWindowHandles().then(function(handles) { 
    browser.driver.switchTo().window(handles[1]).then(function() { 
     expect(browser.getLocationAbsUrl()).toContain('/console/login.jsp'); 
     expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login'); 
      }); 
     }); 

一想到查詢的網址和其他檢查頁面上的元素header,這是一個表頭。當我運行它,我得到如下:

Error while waiting for Protractor to sync with the page: "angular could not be found on the window"

當我決定使用browser.ignoreSynchronization = true,無論是在功能,或在beforeEach,帶有或不帶有以下afterEach其設置爲false,我得到如下:

JavascriptError: angular is not defined

我似乎無法得到任何「有用」的錯誤來幫我調試它,並在repl努力沒有幫助,因爲我得到了同樣的問題。 爲了更全面,試圖找到我的URL而沒有得到第二個窗口會給我的根,另一個會失敗。 只是做一個或另一個會導致同樣的問題。 更改爲常規語法(element(by.css...))不會改變事情。

+0

您嘗試獲取URL的方法並不是非常'AngularJS',例如,將'$ state'注入到您的Angular測試控制器然後從那裏獲取url $ state會更簡單.href()例如。 您還可以使用「元素」訪問DOM元素,這裏是什麼地方你可以找到它使用: http://stackoverflow.com/questions/19429025/how-to-access-a-dom-element-in -a-angular-directive – cullimorer

回答

0

看起來像getLocationAbsUrl是角abs網址。
嘗試使用本機驅動程序getCurrentUrl來代替。

- expect(browser.getLocationAbsUrl())。toContain('/ console/login.jsp');
++預期(browser.driver.getCurrentUrl()...

+0

謝謝,我意識到這一點,並且在發佈時寫下了答案。儘管如此,鏈接到文檔頁面肯定是有幫助的;這是試錯,導致我自己找到答案。 –

2

這麼多我的第一個問題...

看來,我使用browser.getLocationAbsUrl()的,就是要用於Angular頁面,並導致我的問題... 本質上,即使我相信我使用的是純Webdriver調用,該調用仍然需要Angular在頁面上工作... 正如another post所述,使用browser.driver.getCurrentUrl()是一個使用Webdriver的非Angular調用,並解決了這個問題。因此,最終代碼如下翅膀...

browser.sleep(1000); //to wait for the page to load 
     browser.driver.getAllWindowHandles().then(function(handles) { 
      browser.driver.switchTo().window(handles[1]).then(function() { 
       expect(browser.driver.getCurrentUrl()).toContain('/console/login.jsp'); 
       expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login'); 
      }); 
     }); 

這工作沒有設置ignoreSynchronization,BTW。 我意識到這可能是相對簡單的修復它,只是沒想到我會很快得到它(我打算在昨天晚上提交的問題,但今天早上發佈它)。

無論如何,我希望這至少會成爲面對同樣問題的其他人的一個很好的參考。

+0

這是相關的:[getLocationAbsUrl vs getCurrentUrl](http://stackoverflow.com/questions/30790032/getlocationabsurl-vs-getcurrentur)。 – alecxe