2016-09-18 103 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