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 警告来自哪里。
在经历了大量脱发后,我发现这很有效:
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")
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |