如何将 Selenium ChromeDriver 连接到 WPF 应用程序中的嵌入式 CefSharp 浏览器?

Jel*_*Ama 3 wpf selenium selenium-chromedriver chromium-embedded cefsharp

我的 MainWindow.xaml 中有一个 ChromiumWebBrowser 控件:

<cefSharp:ChromiumWebBrowser x:Name="chromiumBrowser" Address="https://www.github.com/"/>
Run Code Online (Sandbox Code Playgroud)

我试图通过附加 Selenium ChromeDriver 来驱动它:

    ChromeOptions options = new ChromeOptions();
    options.BinaryLocation = AppDomain.CurrentDomain.FriendlyName;
    options.AddArguments("disable-extensions");
    options.AddArguments("disable-plugins");

    ChromeDriver chromeDriver = new ChromeDriver(options);
    chromeDriver.Url = "http://www.reddit.com";
Run Code Online (Sandbox Code Playgroud)

这是正确的做法吗?它似乎几乎可以工作,因为当驱动程序尝试连接嵌入式控件时,嵌入式控件会闪烁一次,但随后我从 ChromeDriver 控制台收到以下错误:

[1006/220430.356:错误:cache_util_win.cc(21)] 无法移动缓存:访问被拒绝。(0x5) [1006/220430.357:错误:cache_util.cc(139)] 无法将缓存文件夹 GPUCache 移动到 old_GPUCache_000

编辑

显然,使用 options.BinaryLocation 附加驱动程序将不幸地始终启动可执行文件的新实例。从下面的评论中,我了解到正确的方法是通过调试端口附加驱动程序。所以我通过代码创建我的浏览器控件:

CefSettings settings = new CefSettings();
settings.RemoteDebuggingPort = 9222;
settings.UserDataPath = "C:/Temp";
Cef.Initialize(settings);
browserControl = new ChromiumWebBrowser("chrome://version");
Run Code Online (Sandbox Code Playgroud)

但是当我尝试附加它时:

    ChromeOptions options = new ChromeOptions();
    options.AddArguments("--remote-debugging-port=9222");

    ChromeDriver driver = new ChromeDriver(options);
    driver.Url = "http://www.reddit.com";
Run Code Online (Sandbox Code Playgroud)

现在的错误是: System.InvalidOperationException:“会话不是从断开连接创建的:无法连接到渲染器(会话信息:chrome = 85.0.4183.121)(SessionNotCreated)”

这可能是由于 chrome 版本不匹配造成的,因为 CefSharp 目前仅支持 v84。我使用的是 v84 chromedriver,所以我不知道这个 85 警告来自哪里。

Jel*_*Ama 5

在经历了大量脱发后,我发现这很有效:

CefSettings settings = new CefSettings();
settings.RemoteDebuggingPort = 9222;
settings.UserDataPath = "C:/Temp";
Cef.Initialize(settings);
browserControl = new ChromiumWebBrowser("chrome://version");
Run Code Online (Sandbox Code Playgroud)

这是如何光荣地附加到嵌入式 ChromiumWebBrowser:

ChromeOptions options = new ChromeOptions();
options.DebuggerAddress = "localhost:9222";

ChromeDriverService service = ChromeDriverService.CreateDefaultService();
service.HideCommandPromptWindow = true;

ChromeDriver driver = new ChromeDriver(service, options);
Run Code Online (Sandbox Code Playgroud)

诀窍是使用 ChromeOptions.DebuggerAddress 而不是 ChromeOptions.AddArguments("--remote-debugging-port=XXXX")