量角器等待不必要地失败

时间:2016-06-14 21:49:44

标签: javascript unit-testing protractor

我正在尝试编写一个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将以成功的承诺结束,因此其.then应该进入第一个函数,并打印Found element 1。< / LI>
  • 如果element1不存在,那么第一个browser.wait将以失败的承诺结束,因此.then应该进入第二个函数,它会查找{{ 1}}。然后,如果存在element2,则测试应继续,打印element2,然后通过。但是,如果Found element 2不存在,则它应该在第二个element2失败,因此测试应该失败。

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

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

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

为什么会这样?

1 个答案:

答案 0 :(得分:3)

我只想使用预期条件,有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()来电置于第二个then()来电的browser.wait()回调中:

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');
    }
});