javascript - For 循环立即打印所有循环的 console.log() ,而循环的其余部分仍然运行?

标签 javascript node.js selenium asynchronous

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

为什么我的测试 for 循环会立即将所有 console.log() 行打印到控制台,而整个函数仍在运行?我不明白这一点。我认为 Node 需要被 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);

即使浏览器在此之前尚未启动,控制台也会向我显示 10x“angezeigt”。因此,当浏览器尚未启动时,isDisplayed() 函数会返回 true。此外,据我了解,for 循环不是同步工作的。

如果有任何帮助,我将不胜感激!

最佳答案

很确定驱动程序只是一个包装器 - 告诉它 sleep 将意味着驱动程序将在执行其队列中的任何其他内容之前等待,但这与Javascript线程完全分离。如果您希望 console.log 间隔 1 秒出现,则应使用 Promises 和 await (这是基于 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);

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

关于javascript - For 循环立即打印所有循环的 console.log() ,而循环的其余部分仍然运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51005647/

相关文章:

angularjs - 部分用于应用程序

javascript - Express JS 中的 POST 函数

python - 从数据框中读取网络链接会引发 "stale element reference: element is not attached to the page document"错误

javascript - 如何使用 Slim 在 html <head> 标签中添加带有 id 的 javascript 代码?

javascript - 为什么 ScriptDb 查询结果对象不同

javascript - Angularjs:在服务中加载数据然后将其加载到 Controller

java - Selenium 一次性填写所有输入字段 Java

javascript - 简单的 AI - JavaScript(使用 jQuery 制作动画)

javascript - for 循环内的 async.waterfall 逃脱了 for 循环

selenium - PageFactory 中的 StaleElementReference 异常