量角器:使用承诺

时间:2016-09-18 19:29:54

标签: javascript protractor

我一直在玩量角器和承诺,我对我得到的不同结果感到困惑。我有三个测试基本上加载www.angularjs.org并等待“Home”链接。

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的行为相同,无论{的位置如何{1}}。

所以我的问题是

  1. 为什么在browser.get("angularjs.org");块中放置browser.get("angularjs.org");会使test2正常工作,为什么beforeEach的位置不会影响test1和test3?
  2. 为什么test3输出browser.get("angularjs.org");
  3. 更新 我通过

    修复了test3
    1. 从fn1
    2. 返回浏览器承诺
    3. element visible
    4. 中返回浏览器承诺
    5. 将一个额外的fn1().then( ... )子句链接到末尾(then)并调用fn1().then().then()

    6. done()

1 个答案:

答案 0 :(得分:0)

首先,如果你通过browser.get('angularjs.org'),你应该得到一个webdriver异常Failed: Target URL angularjs.org is not well-formed.你没有得到这个例外。我认为您使用的是较旧版本的Protractor。

当我将网址更改为browser.get('https://www.angularjs.org')并运行您的规范(Firefox浏览器)时,所有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

正如您从上面的输出中看到的,所有三个测试都按预期执行,并且相应地返回了承诺。您的实现没有任何问题。

Protractor的API完全异步并返回promise,每个任务都在ControlFlow中排队。为了理解任务排队的方式以及控制流程的工作原理,请查看webdriverJS control flow API doc