Bru*_*ano 4 javascript this promise intern leadfoot
为简单起见,假设我有以下 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>
Run Code Online (Sandbox Code Playgroud)
我想在child函数 findAllByCssSelector('.child') 返回的所有元素中循环。ico特别是,只有当labeldiv 的 是 B时,我才会单击div 子元素。
我会记得,那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()
}
}
})
Run Code Online (Sandbox Code Playgroud)
我尝试了这段代码,但没有用,因为函数elementArray[i]内getVisibleText().then()不存在 - 就像我失去了它的引用一样。此外,我还需要,如果在循环末尾找不到标签,则应抛出异常。
我怎样才能做到这一点?有人可以帮忙吗?
最简单的方法是使用 Xpath 表达式直接选择项目,例如:
.findByXpath('//div[@class="child" and div[@class="label" and text()="B"]]/div[@class="ico"]')
Run Code Online (Sandbox Code Playgroud)
上面的表达式将找到第一个类为“ico”的 div,它是类为“child”的 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();
});
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
需要注意的几个要点:
then当你在回调中执行异步操作时,你需要从回调中返回 Promises/ thenCommandselement.findByCssSelector)返回 Promises,而不是 Commands,因此您无法调用click结果。| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |