10

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

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

3 回答 3

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

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

于 2012-07-20T09:20:44.763 回答
2

只是和黑客的想法。您可以使用反射方法来获取 firefox 实例的进程。首先声明从 FirefoxDriver 继承的 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);
                // ...
            }
        }
于 2012-07-26T10:10:22.387 回答
1

开箱即用,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/

于 2016-09-09T00:29:37.003 回答