Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在条件计算为true时获取元素(扩展ElementArrayFinder)_Javascript_Selenium_Selenium Webdriver_Iteration_Protractor - Fatal编程技术网

Javascript 在条件计算为true时获取元素(扩展ElementArrayFinder)

Javascript 在条件计算为true时获取元素(扩展ElementArrayFinder),javascript,selenium,selenium-webdriver,iteration,protractor,Javascript,Selenium,Selenium Webdriver,Iteration,Protractor,我们有一个菜单,表示为ul->li列表(简化): 下面是我如何使用它的: this.getInclusionFilters = function () { return element.all(by.css("ul.dropdown-menu li")).takewhile(function (inclusionFilter) { return inclusionFilter.evaluate("!filterItem.isDivider"); }); }; 但

我们有一个菜单,表示为
ul->li
列表(简化):

下面是我如何使用它的:

this.getInclusionFilters = function () {
    return element.all(by.css("ul.dropdown-menu li")).takewhile(function (inclusionFilter) {
        return inclusionFilter.evaluate("!filterItem.isDivider");
    });
};
但是,测试将一直挂起,直到
jasmine。在
takewhile()
调用上达到默认的\u TIMEOUT\u INTERVAL

如果我将
console.log
s放入循环和循环之后,我可以看到它正确地将元素推到分隔器之前,并在到达分隔器时停止。我可能遗漏了什么

使用量角器2.2.0



另外,如果我把问题复杂化了,请告诉我。

也许我遗漏了一些东西,但是当他们从getText()中给你一些东西时,你不能只检查一下
ul li a
元素,然后将它们存储到某个数组中,或者直接在该循环中使用它们吗

var i = 0;
var el = element.all(by.css('ul li a'));
var tableItems = [];
(function loop() {
    el.get(i).getText().then(function(text){
        if(text){
            tableItems.push(el.get(i));
            i+=1;
            loop();
        }
    });
}());
takewhile()
from
onPrepare()
-这是用来替换
量角器的。promise
可以动态地使用
q
来使用语法糖。显然,用
q
代替
量角器是不安全的

我现在要做的就是将它添加到
onPrepare()


仅供参考。

谢谢您的选择!我不满意的是,在这种情况下,我得到的是一个元素数组,而不是一个ElementArrayFinder,这使得以后使用它很不方便-例如,我将无法调用
getText()
并获得一个文本数组,或者使用
map()
each())
或量角器中可用的其他函数语法。但是,一般来说,我同意,它完成了任务。考虑到现在我可以,这个选项成为我的选择。再次感谢!
this.getInclusionFilters = function () {
    return element.all(by.css("ul.dropdown-menu li")).takewhile(function (inclusionFilter) {
        return inclusionFilter.evaluate("!filterItem.isDivider");
    });
};
var i = 0;
var el = element.all(by.css('ul li a'));
var tableItems = [];
(function loop() {
    el.get(i).getText().then(function(text){
        if(text){
            tableItems.push(el.get(i));
            i+=1;
            loop();
        }
    });
}());
protractor.ElementArrayFinder.prototype.takewhile = function(whileFn) {
    var self = this;
    var getWebElements = function() {
        return self.getWebElements().then(function(parentWebElements) {
            var list = [];
            parentWebElements.forEach(function(parentWebElement, index) {
                var elementFinder =
                    protractor.ElementFinder.fromWebElement_(self.ptor_, parentWebElement, self.locator_);

                list.push(whileFn(elementFinder, index));
            });
            return protractor.promise.all(list).then(function(resolvedList) {
                var filteredElementList = [];
                for (var index = 0; index < resolvedList.length; index++) {
                    if (!resolvedList[index]) {
                        break;
                    }
                    filteredElementList.push(parentWebElements[index])
                }
                return filteredElementList;
            });
        });
    };
    return new protractor.ElementArrayFinder(this.ptor_, getWebElements, this.locator_);
};
element.all(by.css("ul li a")).takewhile(function (elm) {
    return elm.getText().then(function (text) {
        return text;
    });
});