我有一个webdriver元素数组,我试图迭代它们以删除它们,除了索引为0的那个。这个迭代中的进程是异步的。
我尝试了几件事,但似乎都没有。
我目前的方法是使用for of
循环,但我得到的是Failed: stale element reference: element is not attached to the page document
。
const els = await this.el.getElements(this.s.tm.button.remove)
for (let el of els) {
if (els.indexOf(el) >= 1) {
await this.h.waitForSpinner(2147483647)
await el.click()
await EC.isVisible(this.s.tm.deleteModal.container)
await this.h.waitForSpinner(2147483647)
await this.el.clickElement(this.s.tm.deleteModal.confirmButton)
}
}
我也尝试过使用:
element.all(by.css('[data-qa="this.s.tm.button.remove"]')).filter((el, i) => {
return i >= 1;
}).each(async (el, i) => {
await el.click()
await EC.isVisible(this.s.tm.deleteModal.container)
await this.h.waitForSpinner(50000)
await this.el.clickElement(this.s.tm.deleteModal.confirmButton)
});
但是第二种方法不是等待异步代码。
任何帮助将不胜感激!
===================更新的解决方案===================
通过@yong迭代WebDriver元素集合的解决方案是正确的。
但是,在我的情况下,for loop
内的代码每次都删除一个元素,因此有.get(i)
次尝试获取索引的时刻通过页面中不再存在的循环。得到错误:
Failed: Index out of bound. Trying to access element at index: 6, but there are only 5 elements that match locator By(css selector, [data-qa=team-members__button-remove])
。
解决方案是使用递减for loop
。这意味着,els_count
的向后循环将始终与get(i)
匹配。请注意,如果els_count === 10
,则最后一个索引为9.所以我们需要els_count - 1
。
async deleteAllTeamMembers() {
await EC.isVisible(await this.el.getFirstElement(this.s.tm.button.invite));
const els_count = await this.el.getElements(this.s.tm.button.remove).count();
for (let i = els_count - 1; i >= 1; i--) {
await EC.isVisible(this.el.getElements(this.s.tm.button.remove).get(i))
await this.el.getElements(this.s.tm.button.remove).get(i).click()
await EC.isVisible(this.s.tm.deleteModal.confirmButton, 50000)
await this.el.clickElement(this.s.tm.deleteModal.confirmButton)
await this.h.waitForSpinner(50000)
}
}
答案 0 :(得分:1)
const els_cnt = await element.all(by.css('[data-qa="this.s.tm.button.remove"]')).count();
for (let index=1;index<els_cnt;index++) {
await element.all(by.css('[data-qa="this.s.tm.button.remove"]')).get(index).click();
await EC.isVisible(this.s.tm.deleteModal.container)
await this.h.waitForSpinner(50000)
await this.el.clickElement(this.s.tm.deleteModal.confirmButton)
}
答案 1 :(得分:0)
尝试这样做。保持对象中的元素,您需要异步访问每个元素并执行如下所示的操作。不需要指定等待
this.searchResults = element.all(by.xpath('<xpath>') // this will hold array of elements
function foo(){
this.searchResults.then(function(runTimeResults){
for(i=0; i< runTimeResults.length; i++){
if(i>0){ //click/delete the element if the index > 0
(function(currentElement){
currentElement.click();
});
})(runTimeResults[i]);// Need to hold the current ith element in a variable => currentElement
}
};
});
}