You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js结合Selenium-WebDriver时出现NoSuchSessionError错误的技术求助

解决Selenium-Webdriver中的NoSuchSessionError问题

我来帮你拆解这个错误的根源,以及对应的修复方案:

错误原因

这个NoSuchSessionError主要由两个问题导致:

  • 重复终止会话:你先调用了driver.close(),这个方法会关闭当前浏览器窗口并结束对应的会话,之后再调用driver.quit()时,已经没有可用的会话连接了,自然会抛出“未建立连接就执行命令”的错误。
  • 异步操作处理不当:Selenium的所有核心操作(比如页面跳转、驱动关闭)都是异步的Promise操作,但你用了同步的setTimeout来控制流程,这会导致代码执行顺序混乱——比如页面还没加载完成就开始执行后续操作,或者会话状态已经变更但定时器还在触发旧的操作,进一步加剧了会话异常。

修复后的代码

推荐使用async/await来处理Selenium的异步流程,这也是官方建议的写法:

const { Builder, By } = require('selenium-webdriver');

// 用async函数封装整个爬虫流程
async function runScraper() {
    // 初始化驱动,await确保驱动建立连接后再执行后续操作
    let driver = await new Builder().forBrowser('firefox').build();
    try {
        // 等待页面加载完成
        await driver.get('https://www.google.com/');
        console.log('Scrapping the Page...');
        
        // 如果需要固定等待时间,用Selenium自带的sleep方法(返回Promise)
        await driver.sleep(3000);
        
        // 这里可以添加你的页面爬取逻辑,比如查找元素、提取数据
        // 示例:await driver.findElement(By.name('q')).sendKeys('selenium', Key.ENTER);
    } finally {
        // 只用quit就够了,它会关闭所有窗口并终止会话,是标准退出方式
        await driver.quit();
        console.log('The Driver is set to off...');
    }
}

// 执行流程并捕获可能的错误
runScraper().catch(err => console.error('操作出错:', err));

关键修正点

  • 用async/await管控异步流程:确保所有Selenium操作按预期顺序执行,避免异步时序问题。
  • 移除多余的driver.close():driver.quit()会自动关闭所有浏览器窗口并终止会话,是退出驱动的正确方式,不需要额外调用close。
  • 替换自定义pause为driver.sleep():Selenium自带的sleep方法返回Promise,能更好地融入异步流程;如果需要更可靠的等待(比如等待元素加载),推荐使用until条件等待(比如await driver.wait(until.elementLocated(By.name('q')), 5000))。
  • try/finally保障资源释放:确保无论流程中是否出现错误,驱动都会被正确关闭,避免浏览器进程残留。

内容的提问来源于stack exchange,提问作者Manishyadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:44:06