Похоже, это ошибка WatiN. Как обсуждалось на сайте *1001* для отслеживания проблем 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);
}
Ошибка в том, что она делит 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);
}
Единственная оставшаяся проблема заключается в том, что свойства top и left не компенсируют размер "хрома" окна браузера, поэтому скриншот элемента находится ниже и вправо, чем должно быть.
Пока я не выясню, как это компенсировать, я избегаю этого, переводя браузер в полноэкранный режим, прежде чем делать снимок экрана.