【问题标题】:protractor e2e testing Returning Promises from utility steps量角器 e2e 测试从实用程序步骤返回 Promise
【发布时间】:2015-06-25 12:05:47
【问题描述】:

我对量角器和一般承诺相当陌生。我环顾四周,虽然有很多关于返回承诺的帖子,或者排队操作的结果对我来说没有多大意义,所以我在寻找一个相当容易描述的答案,我希望是一个简单的问题!

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

我主要使用 bootstrap 和 angular,没有其他第三方库,除了偶尔的 angular 插件,例如烤面包机和 bootstrap modal。

在进入测试的断言部分之前,我有几个“安排步骤”。比方说:

  • a) 个人登录
  • b) 人员访问选项表(可能会或可能会 取决于某些外部设备,尚未在屏幕上显示 因素,但如果它不存在,他们可以通过按下按钮打开它 )。
  • c) 人员在选项表单上执行操作。
  • d) 断言表单上的文本框现在包含正确的值。

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

我试图像这样从 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() 的结果,我会看到以下内容,所以我知道它正在返回一些东西:

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

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

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

【问题讨论】:

    标签: angularjs promise protractor e2e-testing


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 dmitankin。我想我是在叫错树了。不过,我有点困惑,因为 isDisplayed 的文档状态它返回一个承诺,该承诺将通过该元素当前是否在页面上可见来解决。这就是为什么我试图获得工作/返回的承诺。如果它只是一个函数,你能澄清一下这些文档对我意味着什么吗?只是为了让我明白我将来会读什么! :)
    • 这有点令人困惑,是的,但主要是因为缺乏示例。 isDisplayed 是一个返回 promise 的函数,所以你可以这样做:element(by.id(logoutFormID)).isDisplayed().then(function(visible) { console.log(visible); });
    【解决方案2】:

    Protractor 不像 Selenium 的 Java 或 C# 绑定那样工作(它更有趣,但要实现 Java 或 C# 中的简单操作需要更多的工作)。如果选项表单也不在 DOM 中,但如果它在 DOM 中并且只是隐藏,则返回计数承诺会更安全,您可以使用 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();
             }
        });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多