当前位置: 首页 > 面试题库 >

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

黄修永
2023-03-14
问题内容

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

        }

      });

    }

  });

});

问题答案:

您需要牢记,不能将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



 类似资料:
  • 我是NodeJs的初学者,请原谅。下面的lambda函数是在S3中压缩/压缩文件,并将压缩后的文件上传回S3。包含要压缩的键的列表。如果您注意到(listOfKeys中的const file)的

  • 问题内容: 我是JavaScript和node.js的新手。我想遍历目录并将所有文件统计信息(而不是其他目录)添加到数组中。如下所示,我的代码存在问题,因为回调可能在for循环完成后被调用,因此在回调方法中使用“ i”变量将不起作用。但是代码应如何显示,以便以下代码段起作用?它与闭包有关吗? 感谢帮助! 问题答案: 您需要使用闭包是正确的。您应该将循环的内容包装在一个自调用函数中,以保留每次迭代的

  • 问题内容: 这个问题已经在这里有了答案 : 循环内的JavaScript封闭-简单的实际示例 (44个答案) 2年前关闭。 我正在运行以下形式的事件循环: 我正在尝试显示一系列警报,显示从0到10的数字。问题是,当触发回调函数时,循环已经经历了几次迭代,并且显示了更高的值。有关如何解决此问题的任何建议? 问题答案: 在启动所有异步操作时,循环将立即运行到完成。当他们将来完成某个时间并调用其回调时,

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 问题内容: 当我在循环中使用Protractor时,循环索引()不是我期望的。 症状: 失败:索引超出范围。尝试访问索引为’x’的元素,但是只有’x’个元素 要么 索引是静态的,并且始终等于最后一个值 我的密码 例如: 要么 要么 问题答案: 发生这种情况的原因是因为量角器使用了诺言。 阅读https://github.com/angular/protractor/blob/master/docs

  • 问题内容: 我需要一个等待异步调用然后继续的循环。就像是: 我该怎么办?你有什么想法? 问题答案: 如果阻止脚本和浏览器,则无法在JavaScript中混合使用同步和异步。 您需要在此处采用完整的事件驱动方式,幸运的是我们可以将丑陋的东西藏起来。 编辑: 更新了代码。 这将为我们提供一个异步方法,您当然可以进一步修改它,例如使用一个检查循环条件的函数等。 现在进行测试: 并输出: