在browser.wait()超时上继续承诺链

时间:2017-10-02 17:05:38

标签: protractor e2e-testing

我有以下代码:

.then(function() {
    return buttonClick();
})
// BEGIN
.then(function() {
    return browser.wait(EC.elementToBeClickable(anotherButton), timeOut)
        .then(function() {
            anotherButton.click();
        })
})
.then(function() {
    return browser.wait(EC.elementToBeClickable(yetAnotherButton), timeOut)
        .then(function() {
            yetAnotherButton.click();
        })
})
// END
.then(function() {
    browser.wait(do some things);
})

我需要在BEGINEND之间执行代码,只有在return browser.wait(EC.elementToBeClickable(anotherButton), timeOut)成功时执行。如果上述内容未成功,我只想在browser.wait(do some things);

恢复链接

我一直在尝试几种不同的方法来实现这一点,并且在做类似于this的事情时发现了一些运气,但还没有真正得到我正在寻找的结果。

关于如何实现这一目标的任何建议?

由于

1 个答案:

答案 0 :(得分:0)

编辑:根据Protractor FAQ,您可以在错误情况下运行第二个函数。

.then(function() {
    return buttonClick();
})
//wrap your BEGIN-END-part into a new function like this:
// then(function(){BEGIN-END}, function(err){failcase-execution})
.then(function(){
    // BEGIN
    .then(function() {
        return browser.wait(EC.elementToBeClickable(anotherButton), timeOut)
            .then(function() {
                anotherButton.click();
            })
    })
    .then(function() {
        return browser.wait(EC.elementToBeClickable(yetAnotherButton), timeout)
            .then(function() {
                yetAnotherButton.click();
            })
    })
}, function(err){
    //Here is your execution in error-case.
    browser.wait(do some things);
})
.then(function() {
    browser.wait(do some things);
})

但对我而言,听起来像你正试图测试两个不同的范围。 有没有理由,这两个测试必须在同一个测试用例(it-block)中执行?

类似的东西:

describe ("test", function(){
    it("executes the first part incl. Begin-End", function(){
        //eventually some steps to come here first.
        .then(function() {
            return buttonClick();
        })
        // BEGIN
        .then(function() {
            return browser.wait(EC.elementToBeClickable(anotherButton), timeOut)
                .then(function() {
                    anotherButton.click();
                })
        })
        .then(function() {
            return browser.wait(EC.elementToBeClickable(yetAnotherButton), timeOut)
                .then(function() {
                    yetAnotherButton.click();
                })
        })
    });
    it("executes the second part, which resumes anyway", function(){
        //if necessary, repeat some of the steps from before test
        .then(function() {
            return buttonClick();
        })
        .then(function() {
            browser.wait(do some things);
        })
    });
});

或者如果你想弄清楚,如果你可以点击按钮,你可以在一个单独的函数中执行BEGIN / END之间的点击,它只返回true或false(类似于你链接到的):

//existing part
.then(function() {
    return buttonClick();
})
.then(
    bool clicksWorked = this.optionalExecution();
)
.then(function() {
    browser.wait(do some things);
    if(!clicksWorked){console.log("Some Buttons couldn't be clicked")} 
})

//as separate function, which just returns either true or false
this.optionalExecution = function() {
    try {
        // BEGIN
        browser.wait(EC.elementToBeClickable(anotherButton), timeOut)
            .then(function() {
                anotherButton.click();
            })
        browser.wait(EC.elementToBeClickable(yetAnotherButton), timeOut)
            .then(function() {
                yetAnotherButton.click();
            })
        return true
    } 
    catch (Exception e) {
       return false
    }
}

作为旁注: 您是否可以在.then() - 列表中添加更多内容,因为我不清楚,.then()是否都涉及进入状况或者他们是如何进入的? ;重新嵌入测试用例。 在您当前的示例中,似乎没有必要将您的操作放在.then() - 块中。量角器将同步逐行执行,也没有.then()。另请参阅here