C# WatiN NativeElement.GetElementBounds()-度量单位是什么?

C# WatiN NativeElement.GetElementBounds()-度量单位是什么?,c#,.net,watin,C#,.net,Watin,当我使用WatiN进行测试时,我喜欢保存屏幕截图。有时我并不需要整个浏览器窗口的图片,我只需要测试元素的图片 我试图用下面的代码保存一个元素的图片,结果得到了一个块框的图片,因为elementBounds.Top指向屏幕底部以外的像素位置。elementBounds.Width和.Height的值似乎也只有它们应该的一半左右 这是一个WatiN bug,还是这些属性在不同的度量单位中,我必须以某种方式转换为像素 public static void SaveElementScreenshot

当我使用WatiN进行测试时,我喜欢保存屏幕截图。有时我并不需要整个浏览器窗口的图片,我只需要测试元素的图片

我试图用下面的代码保存一个元素的图片,结果得到了一个块框的图片,因为elementBounds.Top指向屏幕底部以外的像素位置。elementBounds.Width和.Height的值似乎也只有它们应该的一半左右

这是一个WatiN bug,还是这些属性在不同的度量单位中,我必须以某种方式转换为像素

public static void SaveElementScreenshot
    (WatiN.Core.IE ie, WatiN.Core.Element element, string screenshotPath)
{
    ScrollIntoView(ie, element);
    ie.BringToFront();

    var ieClass = (InternetExplorerClass) ie.InternetExplorer;

    Rectangle elementBounds = element.NativeElement.GetElementBounds();
    int left = ieClass.Left + elementBounds.Left;
    int top = ieClass.Top + elementBounds.Top;
    int width = elementBounds.Width;
    int height = elementBounds.Height;

    using (var bitmap = new Bitmap(width, height))
    {
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            graphics.CopyFromScreen
                (new Point(left, top), Point.Empty, new Size(width, height));
        }

        bitmap.Save(screenshotPath, ImageFormat.Jpeg);
    }
}

看起来像是一只WatiN虫子。如上所述,Internet Explorer元素的“获取边界”方法如下所示:

internal static Rectangle GetHtmlElementBounds(IHTMLElement element)
{
    int offsetLeft = element.offsetLeft;
    int offsetTop = element.offsetTop;
    for (IHTMLElement element2 = element.parentElement; element2 != null; element2 = element2.parentElement)
    {
        offsetLeft += element2.offsetLeft;
        offsetTop += element2.offsetTop;
    }
    int width = element.offsetWidth / 2;
    return new Rectangle(offsetLeft, offsetTop, width, element.offsetHeight / 2);
}
错误在于它将偏离网络的宽度和视线除以2

我将对element.NativeElement.GetElementBounds的调用替换为调用我自己的“GetElementBounds”方法,并且它按照我希望的方式工作:

private static Rectangle GetElementBounds(Element element)
{
    var ieElem = element.NativeElement as WatiN.Core.Native.InternetExplorer.IEElement;
    IHTMLElement elem = ieElem.AsHtmlElement;

    int left = elem.offsetLeft;
    int top = elem.offsetTop;

    for (IHTMLElement parent = elem.offsetParent; parent != null; parent = parent.offsetParent)
    {
        left += parent.offsetLeft;
        top += parent.offsetTop;
    }

    return new Rectangle(left, top, elem.offsetWidth, elem.offsetHeight);
}
剩下的唯一问题是,顶部和左侧属性不能补偿浏览器窗口“chrome”的大小,因此元素屏幕截图比它应该的位置更靠下和右边


在我弄清楚如何补偿之前,我会在截图前将浏览器设置为“全屏”模式,以避免出现这种情况。

什么是
ScrollIntoView
?我找不到..Marco,这篇博文包含了该类的所有代码: