量角器:过滤直到找到第一个有效元素

时间:2017-03-26 15:13:05

标签: node.js protractor

我正在一个包含一个表的网站上进行e2e测试,我需要进行迭代,直到找到一个在我点击它时不会失败的表。

我使用filter尝试了它并且它正在运行:

this.selectValidRow = function () {
    return Rows.filter(function (row, idx) {
        row.click();
        showRowPage.click();
        return errorMessage.isDisplayed().then(function (displayed) {
            if (!displayed) {
                rowsPage.click(); // go back to rows Page, all the rows
                return true;
            }
        });
    }).first().click();
}; 

这里的问题是它正在迭代所有可用行,而我只需要第一个有效的行(不显示errorMessage)。

我当前的方法存在的问题是它耗时太长,因为我当前的表可能包含数百行。

是否有可能filter(或不同的方法)并在第一次出现有效事件时停止迭代?或者有人能提出更好的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您更喜欢使用非量角器来处理这种情况,我建议async.whilst。 async是一个非常受欢迎的模块,很可能是您的应用程序正在使用它。我在编辑器中写了下面的代码,但它应该可以工作,你可以根据你的需要自定义它。希望你能了解我在这里所做的事情。

var found = false, count = 0;
async.whilst(function iterator() {
   return !found &&  count < Rows.length;
}, function search(callback) {
    Rows[count].click();
    showRowPage.click();
    errorMessage.isDisplayed().then(function (displayed) {
        if (!displayed) {
            rowsPage.click(); // go back to rows Page, all the rows
            found = true; //break the loop
            callback(null, Rows[count]); //all good, lets get out of here
        } else {
           count = count + 1;
           callback(null); //continue looking
        }
    });
}, function aboutToExit(err, rowIwant) {
    if(err) {
      //if search sent an error here;
    }
    if(!found) {
      //row was not found;
    }
    //otherwise as you were doing
    rowIwant.click();
});

答案 1 :(得分:0)

你是对的,filter()和其他内置的量角器&#34;功能编程&#34;当第一个有效事件出现时,方法不能解决&#34;停止迭代&#34;案件。你需要&#34;取一些元素,而某些条件评估为真&#34; (就像Python世界中的itertools.takewhile())。

幸运的是,您可以扩展ElementArrayFinder (最好在onPrepare()中)并添加takewhile()方法:

请注意,我已建议将其内置,但功能请求仍处于打开状态: