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

使用Selenium ChromeDriver遇ECONNREFUSED错误及搜索栏异常求解决

Selenium Chrome驱动问题:自动填入data;,及ECONNREFUSED错误解决

问题场景

运行这段Node.js的Selenium代码时,Chrome浏览器倒是能自动打开,但地址栏莫名被填了data;,(我代码里根本没设置这个啊),而且控制台还一堆ECONNREFUSED的错误警告:

(node:15384) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:61227
(node:15384) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:15384) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:61227
(node:15384) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:61227
(node:15384) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 5): Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:61227
(node:15384) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:61227

原代码是这样的:

var webdriver = require('selenium-webdriver'), By = webdriver.By, until = webdriver.until; 
var driver =new webdriver.Builder() 
  .forBrowser('chrome') 
  .build(); 
driver.get('http://www.google.com/ncr'); 
driver.findElement(By.name('q')).sendKeys('wiki'); 
driver.findElement(By.name('btnG')).click(); 
driver.wait(check_title,1000); 
function check_title(){ 
  var promise = driver.getTitle().then((title)=>{ 
    if(title === 'wiki - Google Search'){ 
      console.log('success!'); 
      return true; 
    }else{ 
      console.log("failed!!"); 
    } 
  }); 
  return promise; 
}

问题原因及解决方法

我之前也踩过类似的坑,主要是ChromeDriver版本不兼容、异步操作没处理好这两个核心问题,一步步来解决:

1. 先搞定ChromeDriver和Chrome的版本匹配

这是最常见的元凶!Selenium对ChromeDriver的版本要求特别严格,必须和你本地Chrome浏览器的主版本号完全一致:

  • 先查Chrome版本:打开Chrome,点右上角三个点 → 帮助 → 关于Google Chrome,就能看到你的版本号(比如118.0.5993.70)
  • 下载对应版本的ChromeDriver:找和Chrome主版本(前三位)一致的ChromeDriver,比如Chrome是118.x,就下118.x的驱动
  • 配置驱动路径:
    • 简单方法:把ChromeDriver放到系统PATH里(Windows丢C:\Windows\System32,macOS丢/usr/local/bin)
    • 或者直接在代码里指定路径,修改Builder部分:
      var driver = new webdriver.Builder()
        .forBrowser('chrome')
        .setChromeOptions(new webdriver.ChromeOptions().setChromeBinaryPath('/你的ChromeDriver绝对路径'))
        .build();
      

2. 重构代码处理异步操作

Selenium的所有操作都是异步Promise,你原来的代码没等待前一步完成就执行下一步,时序完全乱了,还没处理错误,所以才会有一堆未处理的Promise拒绝警告。建议用async/await重构,逻辑清晰还不容易错:

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

async function runGoogleSearchTest() {
  let driver;
  try {
    // 初始化驱动,等待完成
    driver = await new Builder().forBrowser('chrome').build();
    // 等待页面加载完成
    await driver.get('http://www.google.com/ncr');
    
    // 等待搜索框加载出来再操作,超时5秒
    const searchBox = await driver.wait(until.elementLocated(By.name('q')), 5000);
    await searchBox.sendKeys('wiki');
    
    // 同样等待搜索按钮出现再点击
    const searchBtn = await driver.wait(until.elementLocated(By.name('btnG')), 5000);
    await searchBtn.click();
    
    // 等待标题符合预期,不用自己写判断函数,Selenium自带的until.titleIs更靠谱
    await driver.wait(until.titleIs('wiki - Google Search'), 5000);
    console.log('success!');
  } catch (error) {
    // 捕获所有错误,避免控制台警告
    console.error('测试出错了:', error);
  } finally {
    // 不管成功失败,都关闭浏览器释放资源
    if (driver) await driver.quit();
  }
}

// 执行测试
runGoogleSearchTest();

这样改完:

  • 用async/await保证每一步操作都等前一步完成,不会出现时序问题
  • 用Selenium自带的until方法等待元素和标题,比自己写判断更稳定
  • 加了try/catch处理所有异常,再也不会有UnhandledPromiseRejectionWarning
  • 最后确保浏览器关闭,不会残留进程

3. 解决地址栏data;,的问题

这个其实是ChromeDriver初始化时的临时空白页面,只要前面的版本匹配和异步问题解决了,driver.get()会正常跳转到Google页面,这个临时页面会被覆盖。如果还是能看到,可以加几个启动参数优化:

const chromeOptions = new webdriver.ChromeOptions();
chromeOptions.addArguments('start-maximized'); // 启动就最大化窗口
chromeOptions.addArguments('disable-infobars'); // 禁用"Chrome正被自动化软件控制"的提示

driver = await new Builder()
  .forBrowser('chrome')
  .setChromeOptions(chromeOptions)
  .build();

总结

先优先检查ChromeDriver和Chrome的版本是否匹配,这是90%的概率会碰到的问题;然后用async/await重构代码处理异步和错误,最后加必要的等待和启动参数,这些问题就能全部解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:36