一尘不染

量角器中for循环的异步工作

json

当我使用量角器执行以下代码时,它可以工作。我将嵌套的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");

        }

      });

    }

  });

});

阅读 209

收藏
2020-07-27

共1个答案

一尘不染

您需要牢记,不能将for-loop与promises一起使用。一切都是异步的,所以 最终它会咬到你 ,这意味着它it已经准备好了,但测试还没有。

根据您的示例,建议创建一个名为例如的方法logon(将其放置在Page Object或其他对象中)。它将为您完成登录和操作。添加一个空的promise-
container(数组)并将promise推入其中。

for-loop完成后,你可以一次解决全部承诺容器,它会在彼此之后执行所有的承诺1。它看起来像这样。

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);

    }

  });

}

例如,如果您使用的是Node
7,则可以使用async/await或使用Babel来翻译代码。如果您可以编写TypeScript,还可以获得async/await

2020-07-27