Node.js中用selenium-webdriver连接CEFSharp应用失败,求解决方案
问题分析与解决方案
为什么会出现这个错误?
你这里的核心问题是混淆了Selenium的服务端连接和Chrome/CEF的远程调试端口:
- CEFSharp监听的8088是它的Chrome DevTools协议(CDP)远程调试端口,用于直接和浏览器内核交互;
- 而Selenium的
usingServer()方法是用来连接Selenium Grid或者独立的ChromeDriver服务端的,它和CDP协议完全不同,直接连8088端口自然会报错newSession不支持——因为这个端口根本不提供Selenium的会话创建接口。
正确的解决步骤
1. 调整Selenium配置逻辑
你不需要用usingServer(),而是要通过ChromeOptions告诉ChromeDriver去连接已经运行的CEFSharp实例的远程调试端口。具体来说,要添加debuggerAddress参数。
2. 确保ChromeDriver版本匹配
一定要保证你PATH里的chromedriver.exe版本和CEFSharp内置的Chrome内核版本完全一致(大版本必须匹配,比如CEF用的是Chrome 114,那chromedriver也要用114.x的版本),版本不兼容会导致各种奇怪的连接问题。
3. 修改后的代码
const { Builder, By, until } = require('selenium-webdriver'); const chrome = require('selenium-webdriver/chrome'); async function runTest() { let o = new chrome.Options(); // 关键:指定CEFSharp的远程调试地址 o.debuggerAddress('localhost:8088'); let driver = await new Builder() .setChromeOptions(o) .forBrowser('chrome') // 移除usingServer,不需要连接Selenium服务端 .build(); try { // 这里可以操作CEFSharp中已打开的页面,比如定位元素 const element = await driver.findElement(By.id('q')); console.log('找到元素: ', element); } catch (error) { console.log('错误: ', error); } finally { // 如果不想关闭CEFSharp实例,可以注释掉quit(),改用close()关闭当前标签页 // await driver.close(); await driver.quit(); } } runTest();
额外注意事项
- 如果CEFSharp启动时已经打开了页面,ChromeDriver会直接接管这个已有的浏览器实例,而不是新建窗口;
- 如果你需要CEFSharp启动时就开启远程调试,确保你的CEFSharp代码里已经正确配置了
CefSettings.RemoteDebuggingPort = 8088; - 运行代码前,一定要确保CEFSharp应用已经启动并监听8088端口,否则ChromeDriver会找不到调试目标。
内容的提问来源于stack exchange,提问作者zhm
相关产品推荐
相关产品推荐

