【问题标题】:Selenium can't handle multiple ChromiumWebBrowser instances in C#Selenium 无法在 C# 中处理多个 ChromiumWebBrowser 实例
【发布时间】:2017-08-12 15:35:15
【问题描述】:

我的 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;
    }
}

最后,一些可视化的屏幕截图:

非常感谢您对这个问题的一些帮助。如果我错过了一些重要信息,请随时询问。提前致谢!

问候, 类型

【问题讨论】:

    标签: c# winforms selenium visual-studio-2012 chromium


    【解决方案1】:

    行为是正确的。您只有一个调试地址,而 CEF 只能有一个调试地址。这意味着当您使用 Selenium 时,它只会看到一个浏览器。

    默认情况下,Selenium 将向当前活动的选项卡或窗口发送命令。现在,在您的情况下,您嵌入了多个 Chrome 视图,但从技术上讲,它们是您放置在同一表单上的 Chrome 选项卡/Windows。

    所以如果你运气好,下面的代码应该能够将你移动到你感兴趣的窗口

    driver.SwitchTo().Window(driver.WindowHandles.Last());
    

    看看它是否有效。如果没有,那么您唯一的其他解决方法是更改​​添加 ChromiumWebBrowser 的顺序,这应该会反转它所在的窗口。

    以下是一些您应该从上到下阅读的重要主题。与您的问题/请求非常相关

    https://code.google.com/archive/p/chromiumembedded/issues/421 https://github.com/cefsharp/CefSharp/issues/1076

    【讨论】:

    • 一个非常准确的答案:给定的代码就像一个魅力!我对选项卡的设置一无所知,所以很高兴了解一下。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多