【问题标题】:Protractor Wait Fails Unnecessarily量角器等待不必要地失败
【发布时间】:2016-06-16 00:16:00
【问题描述】:

我正在尝试编写 Protractor E2E 测试,通过browser.wait(...)element1.isPresent() 检查某个元素是否存在,如果是,那么很好,但否则我想通过以下方式检查另一个元素是否存在element2.isPresent().

应该存在element1element2 中的一个,如果两者都不存在,那么我希望测试失败。

我的代码如下所示:

var element1 = element(by.id('test-elem1'));
var element2 = element(by.id('test-elem2'));
browser.wait(function() {
    return element1.isPresent();
}, 5000, "Waiting for element 1").then(function() {
    console.log('Found element 1');
    // Do something with element 1
}, function() {
    // Element 1 not present --> look for element 2
    browser.wait(function() {
        return element2.isPresent();
    }, 5000, "Waiting for element 2");
    print('Found element 2');
});

我的期望是:

  • 如果存在element1,那么第一个browser.wait 将以一个成功的promise 结束,所以它的.then 应该进入第一个函数,并打印Found element 1
  • 如果element1 不存在,那么第一个browser.wait 将以失败的promise 结束,因此.then 应该进入第二个函数,该函数查找element2。然后,如果存在element2,测试应该继续,打印Found element 2,然后通过。但是,如果 element2 不存在,那么它应该在这一秒 browser.wait 失败,因此测试应该失败。

实际发生的情况是,如果element1 不存在,第一个browser.wait 就会失败并导致测试失败。如果存在element1,则其余测试将按预期继续。

我的印象是,如果定义了 .then() 的第二个参数,那么在失败时,应该调用第二个函数,而不是完全失败。

我很确定我在其他地方有几乎相同的代码(我已经删除了它,所以我不能再引用它了),所以我不确定为什么这部分不起作用。

为什么会这样?

【问题讨论】:

    标签: javascript unit-testing protractor


    【解决方案1】:

    我只会使用预期条件,有一个built-in or operator

    var EC = protractor.ExpectedConditions;
    var element1 = element(by.id('test-elem1'));
    var element2 = element(by.id('test-elem2'));
    
    browser.wait(EC.or(EC.presenceOf(element1), EC.presenceOf(element2)), 5000); 
    

    如果两个元素都不存在,这将失败,否则通过。


    现在,让我们尝试了解您的初始代码发生了什么。

    第一个问题是browser.wait() 的第一个参数应该是一个函数。此外,您应该将第二个console.log() 调用放入第二个browser.wait() 调用的then() 回调中:

    var element1 = element(by.id('test-elem1'));
    var element2 = element(by.id('test-elem2'));
    
    browser.wait(function() {
        return element1.isPresent();
    }, 5000).then(function() {
        console.log('Found element 1');
    }, function() {
        // Element 1 not present --> look for element 2
        browser.wait(function() {
            return element2.isPresent();
        }, 5000).then(function () {
            print('Found element 2');
        }
    });
    

    【讨论】:

    • 哦,哎呀。我将browser.wait 的第一个参数作为字符串保留,因为我使用了一个包装器,它实际上首先采用了一个字符串。我在写问题时忘记删除它。
    • 另外,我需要根据是否找到element1element2 来做不同的事情。我还应该为此使用预期条件吗?
    • @Jashaszun 好吧,您仍然可以使用它们等待,但随后另外发出isPresent() 检查。或者,您可以坚持当前的方法(假设它现在有效)..btw,您可以用EC.presenceOf 调用替换这些函数。谢谢。
    • 我现在正在尝试您的方法。我用EC.or(..., ...) 检查是否存在,然后我用.then(function(present) { if (present) { /* element 1 present */ } else { /* element 2 present */ } }); 检查element1.isPresent() 但是,它似乎总是认为元素1 存在。对此有什么想法吗?如果答案是“把它放在自己的问题中”,那就没问题了。
    • @Jashaszun 很有趣。您确定 element1 实际上不存在于页面上吗? (例如,它可能存在但未显示?)
    猜你喜欢
    • 2015-03-17
    • 2017-02-02
    • 2015-10-05
    • 2023-03-03
    • 1970-01-01
    • 2017-12-30
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多