量角器端到端测试从实用程序步骤返回承诺

protractor e2e testing Returning Promises from utility steps

总的来说,我对量角器和 promises 还比较陌生。我环顾四周,虽然那里有很多关于 returning promises 的帖子,或者其中 none 排队操作的结果对我来说很有意义,所以我正在寻找一个相当简单描述的答案我希望是一个简单的问题!

我正在尝试为我的 angularjs 网站编写一些量角器测试。

我主要使用 bootstrap 和 angular,没有其他第三方库,除了偶尔使用 angular 附加组件,例如烤面包机和 bootstrap 模态.

在进入测试的断言部分之前,我有几个 'arrangement steps'。比方说:

当表单已经在屏幕上时,我可以很容易地让我的测试通过,但是让我卡住的是步骤 b),我需要首先检查表单是否处于活动状态,如果表单处于活动状态则单击按钮在进行步骤 c 之前还没有完成。

我试过 return isDisplayed 的承诺,就像这样:

//
// Is the user settings form active at the mo?
//
function _isUserSettingsFormActive()
{
    var result = element(by.id(logoutFormID)).isDisplayed;
    return result;
}

但是如果我在 _isUserSettingsFormActive() 上调用 .then,我会收到以下错误:

[31mTypeError: undefined is not a function[0m

但是,如果我输出 _isUserSettinsFormActive() 的结果,我会看到下面的内容,所以我知道它正在 returning 一些东西:

function () {
return self.elementArrayFinder_[fnName].
apply(self.elementArrayFinder_, arguments).toElementFinder_();
}

我想做的就是检查一个项目是否存在并在执行我的断言之前对其采取行动。

它需要在一个函数中,因为这段代码将在我的测试服中的许多地方使用。这不是 'expect' 本身,更多的是可能需要也可能不需要设置浏览器以使我的测试通过的步骤。

isDisplayed是一个函数,所以应该这样调用:

function _isUserSettingsFormActive()
{
    var result = element(by.id(logoutFormID)).isDisplayed();
    return result;
}

Protractor 不像 Selenium 的 Java 或 C# 绑定那样工作(它更有趣,但需要更多工作来实现 Java 或 C# 中的简单操作)。如果选项表单也不在 DOM 中,但如果它在 DOM 中并且只是隐藏,则 return 计数承诺会更安全,您可以使用 isDisplayed()。我在下面为这两种情况写了两个示例,包括根据条件单击按钮。

选项 1(DOM 中不存在且未显示):

function _isUserSettingsFormActive() {
    //$$('#logoutFormId') is the equivalent of element.all(by.id('logoutFormId'))
    $$('#logoutFormId').count().then(function(num){
         if(num < 1) {
            element(by.id('openLogoutButton').click();
         }
    });
};

选项 2(存在于 DOM 但未显示):

function _isUserSettingsFormActive() {
    //$('#logoutFormId') is the equivalent of element(by.id('logoutFormId'))
    $('#logoutFormId').isDisplayed().then(function(visible){
         if(!visible) {
                element(by.id('openLogoutButton').click();
         }
    });
};