从Selenium webdriver的当前窗口GUID获取窗口句柄(IntPtr)

我正在尝试捕获整个浏览器屏幕的截图(例如,使用任何工具栏,面板等),而不仅仅是整个页面,所以我有这样的代码:

using (FirefoxDriver driver = new FirefoxDriver()) { driver.Navigate().GoToUrl(url); ScreenCapture sc = new ScreenCapture(); // How can I find natural IntPtr handle of window here, using GUID-like identifier returning by driver.currentWindowHandle? Image img = sc.CaptureWindow(...); MemoryStream ms = new MemoryStream(); img.Save(ms, ImageFormat.Jpeg); return new FileStreamResult(ms, "image/jpeg"); } 

您可以使用Process.GetProcesses获取窗口句柄:

 using (FirefoxDriver driver = new FirefoxDriver()) { driver.Navigate().GoToUrl(url); string title = String.Format("{0} - Mozilla Firefox", driver.Title); var process = Process.GetProcesses() .FirstOrDefault(x => x.MainWindowTitle == title); if (process != null) { var screenCapture = new ScreenCapture(); var image = screenCapture.CaptureWindow(process.MainWindowHandle); // ... } } 

这当然假设您有一个具有该特定标题的浏览器实例。

只是和黑客的想法。 您可以使用Reflection方法来获取firefox实例的进程。 首先声明从FirefoxDriverinheritance的FirefoxDriverEx类 – 访问封装Process实例的受保护的Binary属性:

  class FirefoxDriverEx : FirefoxDriver { public Process GetFirefoxProcess() { var fi = typeof(FirefoxBinary).GetField("process", BindingFlags.NonPublic | BindingFlags.Instance); return fi.GetValue(this.Binary) as Process; } } 

您可能获得访问MainWindowHandle属性的流程实例

 using (var driver = new FirefoxDriverEx()) { driver.Navigate().GoToUrl(url); var process = driver.GetFirefoxProcess(); if (process != null) { var screenCapture = new ScreenCapture(); var image = screenCapture.CaptureWindow(process.MainWindowHandle); // ... } } 

开箱即用,selenium不公开驱动程序进程ID或浏览器hwnd,但它是可能的。 以下是获得hwnd的逻辑

  • 初始化驱动程序时,获取集线器的URL并提取端口号
  • 从端口号,找到使用此端口进行监听的进程ID,即。 驱动程序的PID
  • 导航后,从iexplore的所有实例中找到父PID匹配驱动程序的pid,即浏览器pid。
  • 找到浏览器hwnd后得到浏览器pid的Hwnd,你可以使用win32 api将selenium带到前台。

它不可能在这里发布完整代码,将浏览器放在前面的完整工作解决方案(C#)在我的博客上

http://www.pixytech.com/rajnish/2016/09/selenium-webdriver-get-browser-hwnd/