2012-07-17 756 views
8

我试图捕获整个浏览器屏幕(例如任何工具栏,面板等)的屏幕截图,不仅整个页面,所以我得到了这个代码:从Selenium webdriver的当前窗口获取窗口句柄(IntPtr)GUID

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"); 
} 

回答

3

可能会导致你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); 
     // ... 
    } 
} 

当然,这假设你有特定标题单个浏览器实例。

+0

好的技巧,顺便说一句,但如果有两个不同具有相同标题的FireFox实例? – kseen 2012-07-20 10:47:22

+0

@kseen您可以用['SingleOrDefault']替换['FirstOrDefault'](http://msdn.microsoft.com/zh-cn/library/bb549039)(http://msdn.microsoft.com/zh-cn//library/bb549274),这样如果有两个具有相同标题的浏览器实例,则会得到一个异常。如果你在测试案例中,你可以断言它。 – 2012-07-20 11:29:30

+0

@PaoloMoretti我怎样才能得到当前窗口(手动打开的现有窗口),这是不是由驱动程序打开意味着我无法使用driver.getWindowHandle(); – 2015-10-10 09:21:46

2

只是和黑客的想法。你可以使用Reflection方法来获取firefox实例的进程。首先声明从FirefoxDriver继承FirefoxDriverEx类 - 访问受保护的二进制属性,它封装流程实例:

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); 
       // ... 
      } 
     } 
+0

您能否在FireFox浏览器中添加另外一种查找窗口的方法,例如IE,Chrome,Safari在Selenium中?问题是我找不到'ChromeBinary'或者其他像'FireFoxBinary'的东西。 – kseen 2012-08-09 19:12:52

+0

此方法不适用于IE或Chrome,因为在这些情况下,浏览器的进程由外部硒服务控制,例如IEDriverServer.exe和chromedriver.exe。这种方法只是黑客和'按原样'工作。对于查找工作方法,您可以查看硒驱动程序的来源,并可能构建自己的版本。 – necrostaz 2012-08-10 09:20:58

+0

所以,只有一个robuts方法存在用于获取浏览器窗口的句柄,这是通过部分窗口标题找到使用WinAPI的窗口? – kseen 2012-08-10 13:41:27

0

开箱即用,硒不暴露驱动程序进程ID或浏览器HWND,但它是可能的。 下面是获得HWND

  • 当驱动程序初始化,得到中心的网址,并提取端口号
  • 从端口号,发现其正在使用此端口进行监听,即进程ID的逻辑。驱动程序的PID
  • 导航后,从iexplore的所有实例中查找父PID与驱动程序的pid匹配,即浏览器pid。
  • 获取浏览器pid的Hwnd 一旦找到浏览器hwnd,您可以使用win32 API将硒带到前台。

它不可能在这里发布完整的代码,完整的工作液(C#),使浏览器在前面我的博客上

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