无法将CefSharp与Selenium ChromeDriver绑定的解决方案咨询
问题:如何实现CefSharp与Selenium ChromeDriver的绑定?
我可以通过以下代码将CefGlue客户端与Selenium ChromeDriver绑定,但该方法对CefSharp无效:
Imports OpenQA.Selenium.Chrome Imports System.Threading Imports OpenQA.Selenium Imports OpenQA.Selenium.Support.Events Imports OpenQA.Selenium.Support.Extensions Imports OpenQA.Selenium.Support.PageObjects Imports OpenQA.Selenium.Support.UI Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Try Dim service = ChromeDriverService.CreateDefaultService("D:\chromedriver_win32") Dim chromeOptions As New OpenQA.Selenium.Chrome.ChromeOptions() chromeOptions.BinaryLocation() = "D:\cefsharp\net452\CefSharp.MinimalExample.WinForms.exe" chromeOptions.AddExcludedArgument("ignore-certifcate-errors") chromeOptions.AddArgument("test-type") chromeOptions.AddArgument("--allow-insecure-localhost") chromeOptions.AddArguments("start-maximized") ' open Browser In maximized mode chromeOptions.AddArguments("disable-infobars") ' disabling infobars chromeOptions.AddArguments("--disable-extensions") ' disabling extensions chromeOptions.AddArguments("--disable-gpu") ' applicable To windows os only chromeOptions.AddArguments("--disable-dev-shm-usage") ' overcome limited resource problems chromeOptions.AddArgument("--remote-debugging-port=20480") chromeOptions.AddArguments("--disable-dev-shm-usage") Dim driver As OpenQA.Selenium.Chrome.ChromeDriver = New OpenQA.Selenium.Chrome.ChromeDriver(service, chromeOptions, TimeSpan.FromSeconds(120)) driver.Navigate().GoToUrl("https://chromedriver.chromium.org/downloads") Thread.Sleep(5000) Catch ex As Exception MsgBox(Err.Description) End Try End Sub End Class
单独运行CefSharp时可正常浏览网页,但与Selenium结合时程序崩溃,ChromeDriver提示错误:
chromedriver
unknown error: Chrome failed to start: crashed.
(chrome not reachable)
(The process started from chrome location CefSharp.MinimalExample.WinForms.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)OK
我已尝试以下方案:
- 使用最新版本的ChromeDriver和CefSharp
- 以管理员身份运行代码
- 使用x86版本的CefSharp可执行文件
执行代码时生成的ChromeDriver控制台日志:
Starting ChromeDriver 107.0.5304.62 (1eec40d3a5764881c92085aaee66d25075c159aa-refs/branch-heads/5304@{#942}) on port 61991 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully. [0214/160638.323:VERBOSE1:pref_proxy_config_tracker_impl.cc(187)] 342B4700: set chrome proxy config service to 34238700 [0214/160638.403:VERBOSE1:webrtc_internals.cc(120)] Could not get the download directory. [0214/160638.407:VERBOSE1:media_stream_manager.cc(1100)] MSM::InitializeMaybeAsync([this=34260840]) [0214/160638.409:VERBOSE1:media_stream_manager.cc(1100)] MDM::MediaDevicesManager() [0214/160638.409:VERBOSE1:media_stream_manager.cc(1100)] MSM::MediaStreamManager([this=34260840])) DevTools listening on ws://127.0.0.1:20480/devtools/browser/d1d13b12-10ad-4cb6-ad07-b948e92d26d6 [0214/160638.481:VERBOSE1:component_installer.cc(285)] StartRegistration for Widevine Content Decryption Module [0214/160638.482:VERBOSE1:first_party_sets_handler_impl.cc(279)] Empty path. Failed initializing First-Party Sets database. [0214/160638.502:VERBOSE1:component_installer.cc(439)] FinishRegistration for Widevine Content Decryption Module [0214/160638.509:VERBOSE1:component_updater_service.cc(131)] CrxUpdateService starting up. First update attempt will take place in 60 seconds. Next update attempt will take place in 18000 seconds. [0214/160638.599:VERBOSE1:pref_proxy_config_tracker_impl.cc(187)] 342B6D80: set chrome proxy config service to 3423A800 [0214/160653.789:INFO:child_thread_impl.cc(918)] ChildThreadImpl::EnsureConnected()
Debug日志:
[0214/160638.323:VERBOSE1:pref_proxy_config_tracker_impl.cc(187)] 342B4700: set chrome proxy config service to 34238700 [0214/160638.403:VERBOSE1:webrtc_internals.cc(120)] Could not get the download directory. [0214/160638.407:VERBOSE1:media_stream_manager.cc(1100)] MSM::InitializeMaybeAsync([this=34260840]) [0214/160638.409:VERBOSE1:media_stream_manager.cc(1100)] MDM::MediaDevicesManager() [0214/160638.409:VERBOSE1:media_stream_manager.cc(1100)] MSM::MediaStreamManager([this=34260840])) [0214/160638.481:VERBOSE1:component_installer.cc(285)] StartRegistration for Widevine Content Decryption Module [0214/160638.482:VERBOSE1:first_party_sets_handler_impl.cc(279)] Empty path. Failed initializing First-Party Sets database. [0214/160638.502:VERBOSE1:component_installer.cc(439)] FinishRegistration for Widevine Content Decryption Module [0214/160638.509:VERBOSE1:component_updater_service.cc(131)] CrxUpdateService starting up. First update attempt will take place in 60 seconds. Next update attempt will take place in 18000 seconds. [0214/160638.599:VERBOSE1:pref_proxy_config_tracker_impl.cc(187)] 342B6D80: set chrome proxy config service to 3423A800 [0214/160653.789:INFO:child_thread_impl.cc(918)] ChildThreadImpl::EnsureConnected()
请问如何实现CefSharp与Selenium的绑定?
解决方案
核心问题原因
ChromeDriver是为标准Chrome浏览器设计的,直接指定CefSharp的WinForms程序作为BinaryLocation无法正常工作——因为CefSharp的宿主程序不是标准Chrome,它需要特定的初始化逻辑启动CEF内核,而ChromeDriver传递的命令行参数不会被CefSharp正确处理,导致内核启动失败后进程崩溃。
可行实现方案
方案1:启动CefSharp并开启远程调试端口,再用ChromeDriver连接
先自行启动CefSharp程序并开启DevTools远程调试端口,再让ChromeDriver通过该端口连接,而不是让ChromeDriver启动CefSharp。
- 修改CefSharp程序的初始化代码,添加远程调试参数:
// C#示例,VB.NET可对应转换语法 var settings = new CefSettings(); settings.RemoteDebuggingPort = 20480; // 和你之前使用的端口一致 Cef.Initialize(settings);
- 调整Selenium代码,不再指定
BinaryLocation,而是通过远程调试端口连接已运行的CefSharp实例:
Imports OpenQA.Selenium.Chrome Imports System.Threading Imports OpenQA.Selenium Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Try Dim service = ChromeDriverService.CreateDefaultService("D:\chromedriver_win32") Dim chromeOptions As New ChromeOptions() chromeOptions.AddArgument("--remote-debugging-port=20480") ' 连接已运行的CefSharp实例 Dim driver As New ChromeDriver(service, chromeOptions, TimeSpan.FromSeconds(120)) driver.Navigate().GoToUrl("https://chromedriver.chromium.org/downloads") Thread.Sleep(5000) Catch ex As Exception MsgBox(ex.Description) End Try End Sub End Class
注意:运行Selenium代码前,必须先启动开启了远程调试的CefSharp程序。
方案2:使用CefSharp自带的DevTools API替代Selenium
如果你的需求是自动化控制CefSharp,直接使用CefSharp内置的DevToolsClient API更可靠,不需要依赖ChromeDriver:
// C#示例,VB.NET可对应转换语法 var devToolsClient = chromiumWebBrowser.GetDevToolsClient(); // 导航到指定URL await devToolsClient.Page.NavigateAsync(new PageNavigateRequest { Url = "https://chromedriver.chromium.org/downloads" }); // 执行JS脚本 var result = await devToolsClient.Runtime.EvaluateAsync("document.title");
这种方式完全不需要Selenium,直接和CefSharp内核交互,稳定性更高。
额外注意事项
- 确保ChromeDriver的版本和CefSharp使用的CEF内核版本匹配(可查看CefSharp的NuGet包详情,找到对应的Chromium版本,下载同版本的ChromeDriver)。
- 避免重复设置相同的命令行参数(你之前的代码里重复添加了
--disable-dev-shm-usage)。
内容的提问来源于stack exchange,提问作者IT Researcher143
相关产品推荐
相关产品推荐

