Selenium WebDriver循环打开浏览器时如何等待函数执行完成
解决方案:让循环等待异步操作完成后再执行下一次迭代
你的代码问题在于,for循环是同步执行的,而里面的自执行async函数返回的是Promise,但循环并没有等待这个Promise完成,所以150个浏览器实例会被瞬间启动。要解决这个问题,我们需要把整个循环逻辑放到一个异步函数中,让每次迭代都等待当前的浏览器操作完成后再进行下一次。
修改后的代码示例
const { Builder, By, Key, until } = require('selenium-webdriver'); require('chromedriver'); // 封装整个流程到异步函数中 async function runSequentialBrowsers() { for (let index = 0; index < 150; index++) { let driver; try { // 等待浏览器实例创建完成 driver = await new Builder().forBrowser('chrome').build(); // 等待页面加载完成 await driver.get('https://www.google.com/'); // 这里可以添加你需要的其他操作,比如等待页面元素加载 // 示例:等待页面标题包含"Google",超时5秒 // await driver.wait(until.titleContains('Google'), 5000); } catch(err) { console.log(`第 ${index + 1} 个浏览器操作出错:`, err); } finally { // 确保每个浏览器实例都被正确关闭,避免残留进程 if (driver) { await driver.quit(); } } // 可选:如果需要在两次操作之间添加延迟,避免资源耗尽或给目标网站过大压力 // await new Promise(resolve => setTimeout(resolve, 1000)); // 间隔1秒 } } // 启动执行 runSequentialBrowsers().catch(err => console.error('整体执行失败:', err));
关键修改点说明
- 将循环放入异步函数:通过把整个循环逻辑包裹在
async函数中,我们可以在每次迭代里使用await来等待所有异步操作完成,确保一个浏览器的整个生命周期(创建、访问页面、关闭)结束后,再启动下一个。 - 显式关闭浏览器:添加
await driver.quit()是非常重要的,否则执行完后会残留大量Chrome进程,消耗系统资源。 - 可选延迟:如果你的场景允许,可以在每次迭代结束后添加一个延迟,避免短时间内创建过多浏览器实例导致系统卡顿或被目标网站限制访问。
内容的提问来源于stack exchange,提问作者Native Coder
相关产品推荐
相关产品推荐

