【问题标题】:Dealing synchronously in Protractor tests在量角器测试中同步处理
【发布时间】:2015-01-06 13:13:44
【问题描述】:

我正在尝试编写我认为在量角器中相当简单的测试,但似乎当您尝试同步执行任何操作时,量角器会让您的生活变得艰难!通常,处理定位器函数(返回一个承诺)不是问题,因为任何期望语句都会在测试断言之前自动解析传递给它的任何承诺语句。但是,我正在尝试做的是在期望语句之前解决这些定位器承诺,以便我可以有条件地执行一些测试逻辑。考虑(伪代码):

// Imagine I have a number of possible elements on the page
// and I wish to know which are on the page before continuing with a test.

forEach(elementImLookingFor){
  if (elementImLookingFor.isPresent) {
    // record the fact that the element is (or isnt) present
  }
}

// Now do something for the elements that were not found

但是,在我上面的示例中,“isPresent”调用返回一个承诺,因此实际上不能以这种方式调用。将其称为承诺(即使用 then)意味着我的 forEach 块在我记录该元素是否存在于页面上之前退出。

我对此一无所知,有没有人遇到过类似的情况?

【问题讨论】:

    标签: angularjs protractor


    【解决方案1】:

    我已使用bluebird 执行以下操作;

    it('element should be present', function(done)
      Promise.cast(elementImLookingFor.isPresent)
        .then(function(present){
          expect(present).toBeTruthy();
        })
        .nodeify(done);
    });
    

    如果您有几个元素要检查isPresent,您应该可以执行以下操作;

    it('check all elements are present', function(done){
      var promises = [element1, element2].map(function(elm){
        return elm.isPresent();
      });
    
      // wait until all promises resolve
      Promise.all(promises)
        .then(function(presentValues){
          // check that all resolved values is true
          expect(presentValues.every(function(present){
            return present;
          })).toBeTruthy(); 
    
        })
        .nodeify(done);
    });
    

    希望对你有帮助

    【讨论】:

    • 是的,这确实有很大帮助,但我如何才能将承诺中的每个已解决承诺与其相关元素相关联?我认为不能保证它们会按顺序解决?在您的示例中,presentValues 将是一个真值或假值数组,但我需要将这些值与调用 isPresent 的元素匹配......
    • 我已将您的答案标记为已接受,感谢您的帮助。我最终没有使用黑鸟,而是使用量角器公开的本机承诺支持(protractor.promise.all 而不是 Promise.all)。我还假设在解决它们时保留承诺顺序,这似乎是这种情况。谢谢!
    【解决方案2】:

    所以elementImLookingForelement.all 返回的承诺,我猜?或者,如 Protractor 文档中所述,ElementArrayFinder。你可以在它上面调用方法.each(),并传递给它一个expects东西的函数。

    【讨论】:

    • elementImLookingFor 基本上是一个量角器 ElementFinder,类似于 element(by.id('myElement1'))。我的定位器因我所追求的每个元素而异,所以不确定 ElementArrayFinder 在这种情况下是否适合我。
    • 但是您提到forEach 表明您想要找到多个元素,您应该使用element.all。或者您是否使用具有不同定位器的相同代码?即使如此,您也应该能够使用element.all 并使用.each() 对其进行迭代,如果定位器仅匹配单个元素,则只会执行给定函数一次。
    • 是的,我正在寻找多个元素,但每个元素都有一个非常不同的定位器。我的“elementImLookingFor”只是我自己的内部业务对象,我需要遍历集合以获取用于构造定位器字符串的对象的属性。 @Bulkan 准确地确定了我需要做的事情(在他的示例中,map 函数中有更多逻辑围绕为定位器创建路径字符串等。
    • 如我所见:您首先收集了一堆不相关的元素,然后检查它们的相同属性(在本例中为isPresent)。无论如何,如果有人在谷歌上搜索我描述的问题并找到你的问题,他们会得到我的答案来帮助他们^.^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2016-04-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多