javascript - 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
,据我了解,循环不同步工作。
我将不胜感激任何帮助!
解决方案
很确定驱动程序只是一个包装器 - 告诉它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);
但是,如果可能的话,将异步限制在驱动程序方面仍然会更好。
推荐阅读
- reactjs - 可以无限期地推送到 React Router 历史记录吗?
- mysql - 每个日期和时间每个入口卡的 mysql 出勤记录
- python - 在任何情况下,附加到列表是比填写列表更好的方法吗?
- java - ShadowJar:如何包含特定目录?
- android - 如何引用泛型类型的变量?
- python - 不是所有的列都显示使用pandas来显示sqlite3查询结果
- reactjs - ReactJS:将事件侦听器添加到 HTML 正文元素并在这些侦听器中使用组件的状态
- reactjs - React - 如何将 node_modules 样式导入组件以在本地设置样式
- java - 如何使用流代替循环并从中受益
- r - 为什么我不能更改 RStudio 中的工作目录?