首页 > 解决方案 > For循环立即打印所有循环的console.log(),而循环的其余部分仍在运行?

问题描述

我对 Selenium 和 Nodejs 还很陌生,所以请不要对我评头论足。我想弄清楚,为什么在我的循环console.log()中似乎是异步的(?) ?!for

为什么我的测试for循环会立即将所有 console.log() 行打印到控制台,而整个功能仍在运行?我不明白这一点。我认为节点需要被告知setTimeout()做异步工作?

我的代码片段:

function cycleClicks(j) {
    for (let i = 0; i < j; i++) {
        tabStrategyTester.click();
        driver.sleep(1000);
        if (tabStrategyTester.isDisplayed()) {
            console.log("angezeigt");
        }
        else {
            console.log("nicht angezeigt");
        }
    }
}
cycleClicks(10);

即使浏览器直到那时还没有启动,控制台也会向我显示 10 倍“angezeigt”。因此,该isDisplayed()函数true在浏览器未启动时返回。此外for,据我了解,循环不同步工作。

我将不胜感激任何帮助!

标签: javascriptnode.jsseleniumasynchronous

解决方案


很确定驱动程序只是一个包装器 - 告诉它sleep意味着驱动程序将在执行其队列中的任何其他内容之前等待,但这与 Javascript 线程完全分开。如果您希望您console.log的 s 间隔 1 秒出现,您应该使用 Promisesawait代替(这是基于 Javascript 的异步,而不是基于 Selenium 的异步):

const sleep = ms => new Promise(res => setTimeout(res, ms));

async function cycleClicks(j) {
  for (let i = 0; i < j; i++) {
    tabStrategyTester.click();
    await sleep(1000);
    if (tabStrategyTester.isDisplayed()) {
      console.log("angezeigt");
    }
    else {
      console.log("nicht angezeigt");
    }
  }
}
cycleClicks(10);

但是,如果可能的话,将异步限制在驱动程序方面仍然会更好。


推荐阅读