for循环中的WebDriver链接只迭代循环,而不执行回调



我正在编写Appium(v1.7.1)iOS自动化测试,其中我正在链接一个网络驱动程序会话,并尝试循环遍历元素以获取数据。

setFilterOptions: function (driver, loc) {
var chain = driver;                  //I am assigning the driver to chain
chain = chain
.getFilterElementListCount()    //This gives me back the count for elements
.then((count) => {
console.log("Number of Filters - ",count);  
for(var i=1; i<=count; i++) {
((i) => {
console.log("Value of i - ", i);
//This gives me the label for each Cell->StaticText
chain = chain
.getElAttribute('label',util.format('//XCUIElementTypeCell[%d]/XCUIElementTypeStaticText[1]', i), 'xpath')                           
.then((filterTitle, i) => {
console.log("Filter Title - ", filterTitle);
console.log("I value - ", i);
});
})(i);
}
});
return chain;
},    
The Console o/p i am getting is - 
Number of Filters -  3
Value of i -  1
Value of i -  2
Value of i -  3

循环进行迭代,但不执行for循环中的链。有没有办法让链在返回之前完成所有回调执行。

您的目标是返回一个承诺,该承诺将在完成循环中执行的所有工作后解决。然而,这不是你要做的。你的问题是你有这个:

chain = chain.//
// Bunch of asynchronous operations, some of which assign 
// to the variable `chain`.
//
return chain;

为了让代码正常工作,异步操作必须在执行return语句之前分配给chain。但异步操作并不是这样工作的。当您调用任何异步方法时,您只是在调度异步操作以供将来执行。它将在未来的某个时刻执行,但肯定不会立即执行。在您的代码中,您安排了一个异步操作,并立即返回chain返回的chain的值不能是在循环中设置的值您的循环尚未执行。

你应该做如下的事情。重要的是在循环中创建一个操作链,从传递给.then的函数中返回该操作链,以便最上面的promise解析为您在循环中所创建的操作链。这样,从方法返回的promise将必须等待所有内部操作完成后才能解析。

setFilterOptions: function (driver, loc) {
return driver
.getFilterElementListCount()    //This gives me back the count for elements
.then((count) => {
var chain = Promise.resolve();
console.log("Number of Filters - ",count);  
for(var i=1; i<=count; i++) {
((i) => {
console.log("Value of i - ", i);
//This gives me the label for each Cell->StaticText
chain = chain
.getElAttribute('label',util.format('//XCUIElementTypeCell[%d]/XCUIElementTypeStaticText[1]', i), 'xpath')                           
.then((filterTitle, i) => {
console.log("Filter Title - ", filterTitle);
console.log("I value - ", i);
});
})(i);
}
// Return your promise!                
return chain;
});
},    

还要注意的是,如果您在循环中使用let i而不是var i,那么您可以去掉循环中立即调用的箭头函数,该函数似乎只是为了确保循环中的闭包获得i的顺序值(而不是全部使用i的最后一个值执行)。

最新更新