[英]Selenium can't handle multiple ChromiumWebBrowser instances in C#
我的WinForms項目(Visual Studio 2012)中有兩個ChromiumWebBrowser實例。 我的目標是讓第二個瀏覽器實例“復制”第一個瀏覽器實例中用戶輸入的行為。 我可以從第一個瀏覽器成功檢索到輸入,並且我也設法將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;
}
}
最后是一些可視化的屏幕截圖:
在這個問題上的一些幫助將不勝感激。 如果我錯過了一些關鍵信息,請隨時提出要求。 提前致謝!
蒂布斯·格蕾茲
行為是正確的。 您只有一個調試地址,而CEF只能有一個調試地址。 這意味着當您使用Selenium時,只會看到一個瀏覽器。
默認情況下,Selenium將向當前活動的Tab或Window發送命令。 現在,就您而言,您已經嵌入了多個Chrome視圖,但從技術上講,它們是您放置在同一表單上的Chrome Tab / Windows。
因此,如果您很幸運,下面的代碼應該可以將您移至您感興趣的窗口
driver.SwitchTo().Window(driver.WindowHandles.Last());
看看是否可行。 如果不是這樣,那么您唯一的其他解決方法是更改“添加ChromiumWebBrowser”的順序,這應該會反轉其工作的窗口。
下面是一些重要的線程,您應該從上至下閱讀。 與您的問題/要求非常相關
https://code.google.com/archive/p/chromiumembedded/issues/421 https://github.com/cefsharp/CefSharp/issues/1076
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.