Selenium 无法处理 C# 中的多个 ChromiumWebBrowser 实例
Selenium can't handle multiple ChromiumWebBrowser instances in C#
我的 WinForms 项目中有两个 ChromiumWebBrowser 实例 (Visual Studio 2012)。我的目标是让第二个浏览器实例 "copy" 用户在第一个浏览器实例中输入的行为。我可以成功地从第一个浏览器检索输入,并且我也设法在项目中连接了 Selenium。
但是,我遇到了一个问题。每当 Selenium 发送它的命令时,第一个浏览器就是响应它们的浏览器。对于我的生活,我似乎无法弄清楚如何让第二个浏览器响应。每当我完全删除第一个浏览器时,第二个浏览器就会开始正确响应,但是再次添加第一个浏览器将使只有第一个浏览器使用 Selenium 命令。我什至试图切换浏览器添加到表单的时刻,但无济于事:只要有两个可用,错误的响应。
相关代码:
public BrowserManager(Controller controller, string startingUrl)
{
_controller = controller;
var settings = new CefSettings { RemoteDebuggingPort = 9515 };
Cef.Initialize(settings);
// Input browser
inputBrowser = new ChromiumWebBrowser(startingUrl);
var obj = new XPathHelper(this);
inputBrowser.RegisterJsObject("bound", obj); //Standard object registration
inputBrowser.FrameLoadEnd += obj.OnFrameLoadEnd;
// Output browser
var browserSettings = new BrowserSettings();
var requestContextSettings = new RequestContextSettings { CachePath = "" };
var requestContext = new RequestContext(requestContextSettings);
outputBrowser = new ChromiumWebBrowser(startingUrl);
outputBrowser.RequestContext = requestContext;
outputBrowser.AddressChanged += InitializeOutputBrowser;
outputBrowser.Enabled = false;
outputBrowser.Name = "outputBrowser";
}
硒部分:
public class SeleniumHelper
{
public SeleniumHelper()
{
DoWorkAsync();
}
private Task DoWorkAsync()
{
Task.Run(() =>
{
string chromeDriverDir = @"ActionRecorder\bin\x64\Debug\Drivers";
var chromeDriverService = ChromeDriverService.CreateDefaultService(chromeDriverDir);
chromeDriverService.HideCommandPromptWindow = true;
ChromeOptions options = new ChromeOptions();
options.BinaryLocation = @"ActionRecorder\bin\x64\Debug\ActionRecorder.exe";
options.DebuggerAddress = "127.0.0.1:9515";
options.AddArguments("--enable-logging");
using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options))
{
driver.Navigate().GoToUrl("http://www.google.com");
var query = driver.FindElement(By.Name("q"));
query.SendKeys("A google search test");
query.Submit();
}
});
return null;
}
}
最后,一些可视化的屏幕截图:
我们将不胜感激。如果我错过了一些重要信息,请随时提出要求。提前致谢!
您好,
Tybs
行为正确。你有一个调试地址,你只能有一个 CEF 的调试地址。这意味着当您使用 Selenium 时,它只会看到一个浏览器。
默认情况下,Selenium 会向当前活动的 Tab 或 Window 发送命令。现在,在您的情况下,您嵌入了多个 Chrome 视图,但从技术上讲,它们是 Chrome Tab/Windows,您已将它们放在同一个表单上。
因此,如果您幸运的话,下面的代码应该能够将您转到您感兴趣的 Window
driver.SwitchTo().Window(driver.WindowHandles.Last());
看看它是否有效。如果没有,那么您唯一的其他解决方法是更改添加 ChromiumWebBrowser 的顺序,这应该会反转它工作的 window。
以下是您应该从头到尾阅读的一些重要话题。与您的 issue/request
非常相关
https://code.google.com/archive/p/chromiumembedded/issues/421
https://github.com/cefsharp/CefSharp/issues/1076
我的 WinForms 项目中有两个 ChromiumWebBrowser 实例 (Visual Studio 2012)。我的目标是让第二个浏览器实例 "copy" 用户在第一个浏览器实例中输入的行为。我可以成功地从第一个浏览器检索输入,并且我也设法在项目中连接了 Selenium。
但是,我遇到了一个问题。每当 Selenium 发送它的命令时,第一个浏览器就是响应它们的浏览器。对于我的生活,我似乎无法弄清楚如何让第二个浏览器响应。每当我完全删除第一个浏览器时,第二个浏览器就会开始正确响应,但是再次添加第一个浏览器将使只有第一个浏览器使用 Selenium 命令。我什至试图切换浏览器添加到表单的时刻,但无济于事:只要有两个可用,错误的响应。
相关代码:
public BrowserManager(Controller controller, string startingUrl)
{
_controller = controller;
var settings = new CefSettings { RemoteDebuggingPort = 9515 };
Cef.Initialize(settings);
// Input browser
inputBrowser = new ChromiumWebBrowser(startingUrl);
var obj = new XPathHelper(this);
inputBrowser.RegisterJsObject("bound", obj); //Standard object registration
inputBrowser.FrameLoadEnd += obj.OnFrameLoadEnd;
// Output browser
var browserSettings = new BrowserSettings();
var requestContextSettings = new RequestContextSettings { CachePath = "" };
var requestContext = new RequestContext(requestContextSettings);
outputBrowser = new ChromiumWebBrowser(startingUrl);
outputBrowser.RequestContext = requestContext;
outputBrowser.AddressChanged += InitializeOutputBrowser;
outputBrowser.Enabled = false;
outputBrowser.Name = "outputBrowser";
}
硒部分:
public class SeleniumHelper
{
public SeleniumHelper()
{
DoWorkAsync();
}
private Task DoWorkAsync()
{
Task.Run(() =>
{
string chromeDriverDir = @"ActionRecorder\bin\x64\Debug\Drivers";
var chromeDriverService = ChromeDriverService.CreateDefaultService(chromeDriverDir);
chromeDriverService.HideCommandPromptWindow = true;
ChromeOptions options = new ChromeOptions();
options.BinaryLocation = @"ActionRecorder\bin\x64\Debug\ActionRecorder.exe";
options.DebuggerAddress = "127.0.0.1:9515";
options.AddArguments("--enable-logging");
using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options))
{
driver.Navigate().GoToUrl("http://www.google.com");
var query = driver.FindElement(By.Name("q"));
query.SendKeys("A google search test");
query.Submit();
}
});
return null;
}
}
最后,一些可视化的屏幕截图:
我们将不胜感激。如果我错过了一些重要信息,请随时提出要求。提前致谢!
您好, Tybs
行为正确。你有一个调试地址,你只能有一个 CEF 的调试地址。这意味着当您使用 Selenium 时,它只会看到一个浏览器。
默认情况下,Selenium 会向当前活动的 Tab 或 Window 发送命令。现在,在您的情况下,您嵌入了多个 Chrome 视图,但从技术上讲,它们是 Chrome Tab/Windows,您已将它们放在同一个表单上。
因此,如果您幸运的话,下面的代码应该能够将您转到您感兴趣的 Window
driver.SwitchTo().Window(driver.WindowHandles.Last());
看看它是否有效。如果没有,那么您唯一的其他解决方法是更改添加 ChromiumWebBrowser 的顺序,这应该会反转它工作的 window。
以下是您应该从头到尾阅读的一些重要话题。与您的 issue/request
非常相关https://code.google.com/archive/p/chromiumembedded/issues/421 https://github.com/cefsharp/CefSharp/issues/1076