使用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();
- 简单方法:把ChromeDriver放到系统PATH里(Windows丢
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
相关产品推荐
相关产品推荐

