【问题标题】:Protractor: using promises量角器:使用承诺
【发布时间】:2016-09-21 08:30:04
【问题描述】:

我一直在玩量角器和承诺,我对我得到的不同结果感到困惑。我有三个测试,基本上加载 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,而无论browser.get("angularjs.org"); 的位置如何,test1 和 test3 的行为都是相同的。

所以我的问题是

  1. 为什么将browser.get("angularjs.org"); 放在beforeEach 块中会使test2 工作,为什么browser.get("angularjs.org"); 的位置不影响test1 和test3?
  2. 为什么 test3 不输出element visible

更新 我通过

修复了test3
  1. 从 fn1 返回浏览器承诺
  2. fn1().then( ... ) 中返回浏览器承诺
  3. 将一个额外的 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);
          })
      });
    }
  })

【问题讨论】:

  • //do stuff 到底是什么?
  • 您是否尝试将 .catch() 处理程序添加到您的承诺中?
  • @Bergi 我编辑了问题并将错误处理添加到 test3,现在输出 WebDriverError: no such session。删除了//do stuff,因为它只是一条评论。
  • 在test2中,你应该用Promise.resolve替换fn1(),在test3中你应该避免fn1中的Promise constructor antipattern。同样在 test3 中,您忘记了 test2 中 then 回调中的 return。尽管这些都不能真正解释错误。

标签: javascript protractor


【解决方案1】:

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

当我将 url 更改为 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

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

Protractor 的 API 完全是异步的并返回承诺,每个任务都在 ControlFlow 中排队。为了了解任务是如何排队的以及控制流是如何工作的,请查看webdriverJS control flow API doc

【讨论】:

  • 谢谢,我使用的是 v4.0.0。更新到 v4.0.8 并得到 URL 错误。但是,我仍然遇到与原始问题相同的错误。我注意到在您的输出中,所有三个测试都在 8.6 秒内完成。对我来说,只运行 test3 需要 10 秒。我想由于我的连接速度很慢,量角器没有等待。
  • 我通过调用 done() 并返回承诺来修复 test3。不过,对 test2 使用相同的技术似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多