2017-08-12 7 views
0

WinFormsプロジェクト(Visual Studio 2012)にChromiumWebBrowserのインスタンスが2つあります。私の目標は、第2のブラウザインスタンスに、第1のブラウザインスタンスにおけるユーザ入力の挙動を「コピー」させることである。私は最初のブラウザからの入力を正常に取得することができ、私はプロジェクトでSeleniumを接続することもできました。C#で複数のChromiumWebBrowserインスタンスを処理できない

しかし、私は1つの問題があります。 Seleniumがコマンドを送信するたびに、最初のブラウザが応答します。私の人生にとって、私は第2のブラウザをどのように応答させるかを理解できないようです。最初のブラウザを完全に削除すると、2番目のブラウザは正しく応答し始めますが、最初のブラウザをもう一度追加すると、最初のブラウザでSeleniumコマンドを使用するようになります。私は、ブラウザがフォームに追加された瞬間を切り捨てようとしましたが、役に立たなかったのです。利用可能な2つがあるときはいつでも、間違ったものが反応します。

関連するコード:

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

問題といくつかの助けがあることでしょう非常に高く評価。私がいくつかの重要な情報を見逃した場合は、それを求めて自由に感じてください。前もって感謝します!

Greetz、 Tybs

答えて

1

行動は正しいです。 1つのデバッグアドレスがあり、CEF用に1つのデバッグアドレスしか持てません。つまり、Seleniumを使用すると、ブラウザが1つしか表示されません。

デフォルトでは、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

+0

非常に正確な答えに非常に関連しました!私は、タブの設定については何の手掛かりも持っていなかったので、少し勉強していいです。どうもありがとうございました! – Tybs

関連する問題