0

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

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 循环内的链。有没有办法让链在返回之前完成所有回调执行。

4

1 回答 1

0

您的目标是返回一个承诺,一旦循环中执行的所有工作完成,该承诺就会解决。但是,这不是你正在做的。你的问题是你有这个:

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

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

您应该执行以下操作。重要的是在循环内创建一个操作链并从您传递给的函数中返回该链.then,以便最顶层的承诺解析为您在循环中创建的链。这样,您从您的方法返回的承诺必须等待所有内部操作完成才能被解决。

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 ifor 您的循环,您可以摆脱循环中立即调用的箭头函数,这似乎只是为了确保循环内的闭包获得顺序值i(而不是所有以 )的最后一个值执行i

于 2017-11-16T12:34:04.730 回答