当我使用WatiN进行测试时,我喜欢保存屏幕截图。有时候我并不需要整个浏览器窗口的图片 - 我只想要一张我正在测试的元素的图片。
我尝试使用下面的代码保存元素的图片会导致块框的图片,因为elementBounds.Top指向通过屏幕底部的像素位置。 elementBounds.Width和.Height值似乎也应该是它们的一半。
这是一个WatiN错误,还是这些属性采用不同的度量单位,我必须以某种方式转换为像素?
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);
}
}
答案 0 :(得分:1)
看起来这是一个WatiN错误。正如WatiN issue tracker site所讨论的,Internet Explorer元素的“get bounds”方法如下所示:
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);
}
错误在于它将offsetWidth和offsetHeight除以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”的大小,因此元素截图比它应该更向下和向右。
在我弄清楚如何弥补这一点之前,我通过在拍摄屏幕截图之前将浏览器设置为“全屏”模式来避免它。