我有一组标题,它们看起来都像:
<div class='items'>
* Some | Text *
</div>
或
<div class='items'>
* Some more | Text *
</div>
鉴于页面上有许多 block 遵循这两种模式,我想循环遍历所有 block 并确保它们都包含模式 '* Some [more] |文本 *',其中 [more] 是可选的,* 可以是任何内容。
我目前有:
yield browser
...Some code...
.elements('.items')
.then((elementList)=>{
for(var i = 0; i < elementList.value.length; i++){
this.elementIdText(elementList.value[i].ELEMENT)
.then((currElement)=>{
var str = currElement.value;
if(str.indexOf("Some | Text") == -1 || str.indexOf("Some more | Text") == -1){
assert.ok(false, 'invalid string');
}
})
}
})
但是,断言似乎被忽略了,因为它们位于 for 循环内(我猜这会搞乱一切,因为它不是异步的??)
虽然我希望程序在其中一个字符串与所需模式不匹配时立即抛出失败,所以我认为有必要使用循环。
有什么好的方法吗?
如果我将 console.log 放入 for 循环中,当前的行为:
Command: find element
Command: find element
... n times
log: element 1 text
log: element 2 text
... n times
它应该在哪里:
Command
log
Command
log
... n times
最佳答案
找到了不使用 q Promise 库的解决方案!
(替代方案是使用 q 提供的 .all([]).then() 函数)
yield browser
...Some code...
.elements('.items')
.then((elementList)=>{
var chain = this; // start a promise chain
for(var i = 0; i < elementList.value.length; i++){
// add this whole promise to the chain every iteration
chain = chain.elementIdText(elementList.value[i].ELEMENT)
.then((currElement)=>{
var str = currElement.value;
if(str.indexOf("Some | Text") == -1 || str.indexOf("Some more | Text") == -1){
assert.ok(false, 'invalid string');
}
})
}
// Simply return the chain of promises created
return chain;
})
这个想法是 .then 只是一个 promise ,其中的内容最终将被评估。这意味着只有在测试完成后才能评估里面的内容。
虽然一种解决方案是添加暂停(也许?),但通过创建一系列 Promise,下一个 Promise 直到前一个 Promise 才会被评估,因此,测试在所有代码运行后结束.
关于javascript - 断言元素列表遵循 JavaScript Promise 的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141578/