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()
fromonPrepare()
-这是用来替换量角器的。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;
});
});