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

无法将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。

  1. 修改CefSharp程序的初始化代码,添加远程调试参数:
// C#示例,VB.NET可对应转换语法
var settings = new CefSettings();
settings.RemoteDebuggingPort = 20480; // 和你之前使用的端口一致
Cef.Initialize(settings);
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42