C# – WatiN generates empty pages

c++nunitwatin

When capturing images using WatiN the resulting images are just empty, solid black. The size of the images equals the screen size, though. For example the following snippet just saves two black images.

using (IE ie = new IE()) {
            ie.ClearCache();
            ie.BringToFront();
            ie.GoTo("http://localhost/");
            ie.CaptureWebPageToFile(imageDir + "\\localhost.png");
            WatiN.Core.CaptureWebPage capture = new CaptureWebPage(ie);
            capture.CaptureWebPageToFile(imageDir + "\\localhost.jpg", true, true, 100, 80);
            Assert.IsTrue(ie.ContainsText("Zend"));
        }

Other have reported this as well but I haven't seen any solution. See comments here:
http://www.codeproject.com/KB/graphics/IECapture.aspx?display=PrintAll&fid=192174&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=51&select=1810490

Hope any can shed some light on this.

Cheers
// John

Best Solution

I managed to get it working for my web pages under IE8 with the following changes:

Replace the following method:

private static IntPtr GetHwndForInternetExplorerServer(IntPtr hwnd)
{
    var sbc = new StringBuilder(256);
    hwnd = NativeMethods.GetWindow(hwnd, NativeMethods.GW_CHILD);
    while (hwnd != IntPtr.Zero)
    {
        NativeMethods.GetClassName(hwnd, sbc, 256);
        if (sbc.ToString().IndexOf("Shell DocObject View", 0) > -1) //IE6
        {
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
            break;
        }
        if (sbc.ToString().IndexOf("TabWindowClass", 0) > -1) //IE7
        {
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
            break;
        }
        if (sbc.ToString().IndexOf("Frame Tab", 0) > -1) // IE8
        {
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "TabWindowClass", IntPtr.Zero);
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
            hwnd = NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
            break;
        }
        hwnd = NativeMethods.GetWindow(hwnd, NativeMethods.GW_HWNDNEXT);
    }
    return hwnd;
}

Remove the method GetHwndContainingAShellDocObjectView and the call to it.