2016-09-18 102 views
1

我一直在玩量角器和承諾,我對我得到的不同結果感到困惑。我有三個測試基本上加載www.angularjs.org並等待「主頁」鏈接。量角器:使用承諾

describe('Sample tests', function() { 

    it("test1", function(){ 
    browser.get("angularjs.org"); 
    browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home')))) 
     .then(function() { 
     console.log("element visible"); 
     }) 
    }) 

    it("test2", function() { 
    browser.get("angularjs.org"); 
    fn1().then(function(){ 
     return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home')))) 
     .then(function() { 
     console.log("element visible"); 
     }) 
    }); 

    function fn1() { 
     return new Promise(function (fulfill, reject){ 
     fulfill(); 
     }); 
    } 

    }) 

    it("test3", function() { 
    browser.get("angularjs.org"); 
    fn1().then(function(){ 
     browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home')))) 
     .then(function() { 
     console.log("element visible"); 
     }, function(err) { 
     console.log("error: " + err); 
     }) 
    }); 

    function fn1() { 
     return new Promise(function (fulfill, reject){ 
     browser.manage().addCookie("abc", "123") 
      .then(function() { 
      console.log("set cookie"); 
      fulfill(); 
      }, function(err){ 
      console.log("error in fn1: " + err); 
      }) 
     }); 
    } 
    }) 
}) 

TEST1通行證和輸出element visible

test2的失敗例外Error while waiting for Protractor to sync with the page: "[ng:test] http://errors.angularjs.org/1.5.8/ng/test"Error: Error while waiting for Protractor to sync with the page: "window.angular is undefined.

TEST3不打印element visible,並間歇輸出error: WebDriverError: no such session (Driver info: chromedriver=2.22.397929 (fb72fb249a903a0b1041ea71eb4c8b3fa0d9be5a),platform=Mac OS X 10.10.5 x86_64)

有趣的是,如果我移動browser.get("angularjs.org");beforeEach塊,TEST2不會拋出錯誤並輸出element visible,而test1和test3的行爲相同,無論browser.get("angularjs.org");的位置如何。

所以我的問題是

  1. 爲什麼把browser.get("angularjs.org");beforeEach塊使test2的工作,爲什麼不的browser.get("angularjs.org");位置影響TEST1和TEST3?
  2. 爲什麼不測試3輸出element visible

UPDATE 我固定由

  1. 返回從FN1
  2. 的瀏覽器的承諾在fn1().then(...)
  3. 返回瀏覽器的承諾TEST3鏈的附加then子句來結束(fn1().then().then() ),並稱爲done()


it("test3", function(done) { 
    browser.get('https://www.angularjs.org') 
    fn1() 
     .then(function(){ 
      return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home')))) 
     .then(function() { 
      console.log("element visible"); 
     }, function(err) { 
      console.log("error: " + err); 
     }) 
     }) 
     .then(function(){ 
     done(); 
     }); 

    function fn1() { 
     return new Promise(function (fulfill, reject){ 
     return browser.manage().addCookie("abc", "123") 
      .then(function() { 
      console.log("set cookie"); 
      fulfill(); 
      }, function(err){ 
      console.log("error in fn1: " + err); 
      }) 
     }); 
    } 
    }) 
+0

「// do stuff」究竟是什麼? – Bergi

+0

您是否嘗試在您的承諾中添加'.catch()'處理程序? – Bergi

+0

@Bergi我編輯了這個問題,並將錯誤處理添加到test3,它現在輸出'WebDriverError:no such session'。刪除了/ /做東西,因爲它只是一個評論。 – mws

回答

0

首先,如果你通過browser.get('angularjs.org')你應該得到一個例外的webdriver你Failed: Target URL angularjs.org is not well-formed.沒有得到這個例外。我認爲你正在使用一個老版本的量角器。

當我改變的URL browser.get('https://www.angularjs.org')就跑您的規格(火狐瀏覽器)中的所有3次測試通過,得到了以下的輸出:

element visible // 1st test output 
..element visible // 2nd test output 
set cookie   
.element visible // 3rd test output 

3 specs, 0 failures 
Finished in 8.661 seconds 

正如你可以從上面的輸出中看到所有三個測試已執行如預期的那樣,承諾會相應返還。您的實施沒有任何問題。

量角器的API完全異步並返回承諾,每個任務都排在ControlFlow中。爲了理解這些任務是如何排隊的以及控制流程如何工作的,請查看webdriverJS control flow API doc

+0

謝謝,我使用的是v4.0.0。已更新至v4.0.8並收到URL錯誤。但是,我仍然遇到與原始問題相同的錯誤。我注意到在你的輸出中,所有三個測試在8.6秒內完成。對我來說,運行test3需要10秒。我認爲由於我的連接速度緩慢,量角器並沒有等待。 – mws

+0

我通過調用'done()'並返回承諾來修復test3。雖然對test2使用相同的技術似乎不起作用。 – mws