home_page.activityOnAgenda().then(function (items) {
var len = items.length;
for ( i = 0; i<=12;i++ ) {
browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
browser.sleep(3000);
var flag = false;
home_page.activity("My Scrolling").isPresent().then( function (value) {
if(value===true){
break;}
})
browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
})
我无法在promise中使用break语句。如果我在promise之外使用break语句,则如果for循环之外的block不会执行
答案 0 :(得分:0)
您不能像这样中断循环,因为then
回调最有可能仅在循环完成后才执行。如果您确实想使用此回调中断循环,则可以使用async/await
:
const items = await home_page.activityOnAgenda();
var len = items.length;
for (i = 0; i <= 12; i++) {
browser.element(by.xpath("//virtual-list/div/div[" + len + "]")).click();
browser.sleep(3000);
var flag = false;
const isPresent = await home_page.activity("My Scrolling").isPresent();
if (isPresent) {
break;
}
browser.element(by.xpath("//virtual-list/div/div[" + len + "]")).click();
}
此外,我不确定browser
对象是什么,但我敢肯定它的sleep
方法也是异步的,并且需要await
:
await browser.sleep(3000);
答案 1 :(得分:0)
使用async
/ await
在promise周围使用顺序循环:
const items = await home_page.activityOnAgenda();
const len = items.length;
for (let i=0; i<=12; i++) {
await browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
await browser.sleep(3000);
if (await home_page.activity("My Scrolling").isPresent()) {
break;
}
}
await browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
如果您不能使用该语法,请使用翻译器,或者使用递归方法,直到找到元素为止。
答案 2 :(得分:0)
之所以会发生这种情况,是因为函数会破坏函数内部而不是函数外部的循环。
then
语句在完成承诺后执行该功能。
这是一个例子。
for (i = 0; i !== 10;i++){
Promise.resolve(null).then(()=>{
break
})
}
这会导致错误
Uncaught SyntaxError: Illegal break statement
从该问题的其他答案中,您需要使用await
。
但是应该位于异步功能中。
有效的await
:
(async function() {
for (i = 0; i !== 10; i++) {
console.log(i)
let resolved = await Promise.resolve(1)
if (resolved === 1) break;
}
})()
无效的await
:
for (i = 0; i !== 10; i++) {
console.log(i)
let resolved = await Promise.resolve(1)
if (resolved === 1) break;
}