gpt4 book ai didi

javascript - 实习生:在 Promise.> 上循环

转载 作者:行者123 更新时间:2023-11-29 10:11:42 26 4
gpt4 key购买 nike

为简单起见,假设我有以下 DOM 结构:

<div class='myparent'>
<div class='child'>
<div class="label">A</div>
<div class="ico"/>
</div>
<div class='child'>
<div class="label">B</div>
<div class="ico"/>
</div>
<div class='child'>
<div class="label">C</div>
<div class="ico"/>
</div>
</div>

我想在所有 child 中循环函数 findAllByCssSelector('.child') 返回的元素。特别是,我会点击 ico div 子元素仅当 label div的是B。

我会记得,findAllByCssSelector()返回 Promise.<Array.<leadfoot/Element>> .

通常我应该这样做:

var my_label = null;
this.remote
.findAllByCssSelector('.my-selector').then(function (elementArray) {
for(.....) {
elementArray[i]
.getVisibileText()
.then(function (text) {
if(text == my_label)
elementArray[i].findByCssSelector('.ico').click().end()
}
}
})

我试过这段代码但没有成功,因为 elementArray[i]getVisibleText().then() 内功能不存在 - 就像我失去了它的引用。此外,我还需要如果在循环结束时未找到标签,则应抛出异常。

我怎样才能做到这一点?请问有人能帮忙吗?

最佳答案

最简单的方法是使用 Xpath 表达式直接选择项目,例如:

.findByXpath('//div[@class="child" and div[@class="label" and text()="B"]]/div[@class="ico"]')

上面的表达式将找到第一个类为“ico”的 div,它是类为“child”的 div 的子 div,类 div 的子 div 类为“label”,文本内容为“B”。


更新

使用 Xpath 表达式几乎总是比使用 Leadfoot 命令遍历元素更可取,因为它明显更有效,但如果出于某种原因需要循环,您可以执行如下操作:

var my_label = null;
this.remote
.findAllByCssSelector('.my-selector')
.then(function (elementArray) {
return Promise.all(elementArray.map(function (element) {
return element.getVisibleText()
.then(function (text) {
if (text === my_label) {
return element.findByCssSelector('.ico')
.then(function (ico) {
return ico.click();
});
}
});
});
});

需要注意的几个关键点:

  1. 当您在 then 回调中执行异步操作时,您需要从 then 回调中返回 Promises/Commands
  2. 元素方法(如 element.findByCssSelector)返回 Promises,而不是命令,因此您不能对结果调用 click

关于javascript - 实习生:在 Promise.<Array.<leadfoot/Element>> 上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272598/

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