在量角器中异步处理for循环

时间:2017-07-10 14:49:22

标签: json for-loop asynchronous protractor

当我使用量角器执行以下代码时,它可以工作。我将嵌套的json传递给for循环。由于for循环的异步工作,它打印变量i的所有值并达到最后一个值,因此它总是访问最后一对用户名和密码。我该如何解决这个问题?



var data = require('.../testdata.json');

describe('homepage Test', function() {

  it('candidate login', function() {
    browser.driver.get('https://abcxyz.com');
    for (i in data.testdata) {
      element(by.id('tool_btn3')).click();
      console.log(i);
      browser.getTitle().then(function(title) {
        console.log("Title: " + title)
        if (title === "<page title>") {
          browser.driver.sleep(3000);
          element(by.id('email_input')).sendKeys(data.testdata[i].username);
          element(by.id('pwd_input')).sendKeys(data.testdata[i].password);
          element(by.xpath('//*[@id="signIn_btn"]/div[2]')).click();
          browser.sleep(3000);
          element(by.id('setting_img')).click();
          browser.sleep(2000);
          element(by.id('logout_div')).click().then(function() {
            console.log('success');
          });
        } else {
          console.log("problem");
        }
      });
    }
  });
});
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

您需要记住,您不能使用承诺的for循环。所有都是异步的,所以在结尾它会咬你屁股,这意味着it已准备就绪,但测试不是。

根据您的示例,它会建议创建一个名为logon的方法(将其放在Page Object或其他内容中)。它将为您执行登录和操作。添加一个空的promise-container(数组)并在那里推送promises。

for - 循环完成后,您可以立即解析完整的promise容器,并且它将一个接一个地执行所有的promise。它看起来像这样。

&#13;
&#13;
var data = require('.../testdata.json');

describe('homepage Test', function() {

  it('candidate login', function() {
    var promises = [];
    browser.driver.get('https://abcxyz.com');
    for (i in data.testdata) {
      promises.push(expect(logon(data.testdata[i].username, data.testdata[i].password)).to.equal(true));
      promises.push(console.log(i));
    }
    Promise.all(promises);
  });
});

/**
 * Logon
 * @params {string} username
 * @params {string} password
 * @return {boolean}
 */
function logon(username, password) {
  element(by.id('tool_btn3')).click();\
  return browser.getTitle().then(function(title) {
    console.log("Title: " + title)
    if (title === "<page title>") {
      browser.driver.sleep(3000);
      element(by.id('email_input')).sendKeys(username);
      element(by.id('pwd_input')).sendKeys(password);
      element(by.xpath('//*[@id="signIn_btn"]/div[2]')).click();
      browser.sleep(3000);
      element(by.id('setting_img')).click();
      browser.sleep(2000);
      return element(by.id('logout_div')).click()
        .then(function() {
          return Promise.resolve(true);
        });
    } else {
      return Promise.resolve(false);
    }
  });
}
&#13;
&#13;
&#13;

如果您使用的是节点7,则可以使用async/await,或使用Babel来转换代码。如果您可以编写TypeScript,您还可以获得async/await