gpt4 book ai didi

javascript - 在条件评估为真时获取元素(扩展 ElementArrayFinder)

转载 作者:行者123 更新时间:2023-12-03 13:35:56 24 4
gpt4 key购买 nike

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

<ul class="dropdown-menu" role="menu">
<li ng-repeat="filterItem in filterCtrl.filterPanelCfg track by filterItem.name"
ng-class="{'divider': filterItem.isDivider}" class="ng-scope">
<a href="" class="ng-binding"> Menu Item 1</a>
</li>
...
<li ng-repeat="filterItem in filterCtrl.filterPanelCfg track by filterItem.name"
ng-class="{'divider': filterItem.isDivider}" class="ng-scope">
<a href="" class="ng-binding"> Menu Item 2</a>
</li>
</ul>

在位置 N 的某处,有一个分隔符,可以通过评估 filterItem.isDivider 来识别。或通过查看 a 的文本链接(如果是分隔线,则为空)。

现在,目标是获取位于分隔符之前的所有菜单项。你会如何处理这个问题?

我目前的方法是相当通用的 - 扩展 ElementArrayFinder并添加 takewhile()函数(受 Python 的 itertools.takewhile() 启发)。这是我实现它的方式(基于 filter() ):
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_);
};

而且,这是我使用它的方式:
this.getInclusionFilters = function () {
return element.all(by.css("ul.dropdown-menu li")).takewhile(function (inclusionFilter) {
return inclusionFilter.evaluate("!filterItem.isDivider");
});
};

但是,测试一直挂到 jasmine.DEFAULT_TIMEOUT_INTERVAL到达 takewhile()称呼。

如果我把 console.log s 进入循环之后,我可以看到它正确地将元素推到分隔符之前,并在到达它时停止。我可能在这里遗漏了一些东西。

使用 Protractor 2.2.0。

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

最佳答案

也许我错过了一些东西,但你不能直接通过ul li a元素,而他们从 getText() 中给了你一些东西,并将它们存储到某个数组中,或者直接在那个循环中对它们做一些事情?

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();
}
});
}());

关于javascript - 在条件评估为真时获取元素(扩展 ElementArrayFinder),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com