javascript - Protractor 等待不必要地失败

标签 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 将以成功的 Promise 结束,因此它的 .then 应该进入第一个函数,并打印 Found element 1
  • 如果 element1 不存在,那么第一个 browser.wait 将以失败的 Promise 结束,因此 .then应该进入第二个函数,该函数查找 element2。然后,如果 element2 存在,测试应继续,打印 Found element 2,然后通过。但是,如果 element2 不存在,则它应该在第二个 browser.wait 处失败,因此测试应该失败。

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

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

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

为什么会发生这种情况?

最佳答案

我只会使用预期条件,有一个 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');
    }
});

关于javascript - Protractor 等待不必要地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822686/

相关文章:

javascript - 如何测试传递的函数?

angularjs - 运行 Protractor 示例时获取 "ReferenceError: angular is not defined"

Android - gradle testProguardFile - 它与单元测试相关的目的是什么

javascript - 选择所有复选框问题(jQuery)

javascript - 创建按键事件

javascript - 将结果从一个函数传递到 Nodejs 上的另一个函数

c# - MSTest Assert.AreEqual 因字符串数组而失败

javascript - 在 Protractor 中,我们如何迭代并为其中包含 $index 的 Angular 模型赋予不同的值?

javascript - 什么时候应该使用 getInnerHtml() 方法?

javascript - 为什么这个闭包范围的变量会失去它的值(value)?