【问题标题】:protractor count() expectation fails unexpectedly量角器计数()期望意外失败
【发布时间】:2016-04-04 23:06:19
【问题描述】:

我有以下代码过滤包含文本的元素:

    var myspan = searchChoices.filter(function(elem, index) {
        return elem.getText().then(function(text) {
            //console.log('index text:'  +text);
            return text === 'Consultant 110';
        });
    });

    expect(myspan).not.toBe(null);
    myspan.count().then(function (x) {
        console.log('count:'+x);
    });

    expect(myspan.count()).toBe(1); // this succeeds
    expect(myspan.count()===1).toBe(true); // <---This fails

奇怪的是,最后一行之前的那一行的期望成功了,而最后一行却失败了。是什么原因?

【问题讨论】:

  • count() 返回一个承诺,而不是一个整数。 expect() 知道如何处理承诺,但 count() === 1 总是会失败
  • 是的,但是在评估之前不应该解决所有的承诺吗?
  • 是的,但这是您传递给它的布尔值,而不是承诺

标签: javascript jasmine protractor


【解决方案1】:

请记住,在 Protractor 中与 webdriver 相关的所有内容都会返回一个 Promise - 一个将放在 Control Flow 上的对象,该对象将在稍后在 Promise 队列中解决。实际值不是立即可用的。

现在,expect() 有一个特殊的行为 - 在 Protractor(实际上是在 jasminewd2)中,它被修补以理解承诺 - 它会在做出期望之前解决一个承诺。这就是为什么expect(myspan.count()).toBe(1) 在您的情况下工作的原因。而且,myspan.count()===1 永远是false - 因为myspan.count() 本身就是一个承诺,它总是不等于1

仅供参考,如果您想检查=== 1,您可以手动解决承诺:

myspan.count().then(function (actualCountValue) {
    expect(actualCountValue === 1).toBe(true);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多