【问题标题】:AngularJS & Protractor - Perform .click() while an element .isDisplayed()AngularJS 和量角器 - 在元素 .isDisplayed() 时执行 .click()
【发布时间】:2015-09-20 23:53:10
【问题描述】:

我想在我的 AngularJS 应用程序中测试“显示更多”按钮,所以当用户点击按钮时,它会加载一些内容,并且没有更多内容可以显示按钮隐藏。

如何在显示“显示更多”时执行.click()。我不想硬编码循环数,但以某种方式将.isDisplayed()(即使它返回一个承诺)插入while()

【问题讨论】:

    标签: javascript angularjs selenium testing protractor


    【解决方案1】:

    恕我直言,2种方法,

    因为 .click 实际上是在创建 Promise,所以你不能只用 while 循环它——它只会创建一堆相同的 Promise。我为此创建了一个递归函数:

    reclick = function(elementos) {
            if (elementos.isDisplayed()) {
                elementos.click().then(function () {
                    console.log('click');
                    //YOUR CHECKS AFTER CLICK HERE
                    return reclick(elementos);
                });
            }
        };
    reclick(anyElement);
    

    您可能可以将其与另一个函数一起作为参数重用,其中包含您想要在单击后执行的代码...

    • 更简单的版本是将额外的 it('should have something after click') 包装到 while() 循环中,这样您就不必处理承诺(但这取决于您在 afterEach()、beforeEach() 中的内容...

    【讨论】:

    • 当元素不存在时,在循环的最后一次迭代中,这不会爆炸吗?
    【解决方案2】:

    我会使用filter() 找到所有Show More 按钮和过滤器仅可见。实施:

    // find all "Show More" links by link text and filter only visible
    var showMores = element.all(by.linkText("Show More")).filter(function (link) {
        return link.isDisplayed().then(function (value) {
            return value;
        });
    });
    
    // for each visible "Show More", click it
    showMores.each(function (link) {
        link.click();
    
        // TODO: assertions/expectations
    });
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多