2017-08-12 31 views
0

我的WinForms项目(Visual Studio 2012)中有两个ChromiumWebBrowser实例。我的目标是让第二个浏览器实例在第一个浏览器实例中“复制”用户输入的行为。我可以成功地从第一个浏览器检索输入,并且我也设法在项目中连接Selenium。Selenium无法在C#中处理多个ChromiumWebBrowser实例

但是,我有一个问题。每当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; 
    } 
} 

最后,对于一些可视化截图:

enter image description here

一些帮助,这个问题会非常感谢。如果我错过了一些关键信息,请随时索要。提前致谢!

格尔茨, TYBS

回答

1

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

默认情况下,Selenium会向当前活动的选项卡或窗口发送一个命令。现在,您可以嵌入多个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

+0

一个非常准确的答案:给定的代码就像一个魅力!我不知道有关标签的设置,所以很高兴了解一下它。非常感谢你! – Tybs

相关问题