簡體   English   中英

Selenium無法在C#中處理多個ChromiumWebBrowser實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM