2010-05-17 3 views
2

Lorsque je teste avec WatiN, j'aime sauvegarder les captures d'écran. Parfois, je n'ai pas vraiment besoin d'une image de toute la fenêtre du navigateur - je veux juste une image de l'élément que je suis en train de tester.WatiN NativeElement.GetElementBounds() - Quelle est l'unité de mesure?

Ma tentative pour enregistrer une image d'un élément avec le code ci-dessous a abouti à une image d'une boîte de bloc, car elementBounds.Top pointe vers une position de pixel au-delà du bas de l'écran. Les valeurs elementBounds.Width et .Height semblent également représenter environ la moitié de ce qu'elles devraient être.

Est-ce un bogue WatiN, ou ces propriétés dans une unité de mesure différente que je dois convertir en pixels d'une manière ou d'une autre?

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

Qu'est-ce que 'ScrollIntoView'? Je ne peux pas le trouver .. – Marco

+0

Marco, cet article de blog contient tout le code pour cette classe: http://geekswithblogs.net/brians/archive/2010/05/31/watin-screenshot-saver.aspx –

Répondre

1

On dirait que c'est un bug WatiN. Comme nous l'avons sur le WatiN issue tracker site, la méthode « obtenir des limites » pour les éléments d'Internet Explorer ressemble à ceci:

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

Le bug est qu'il est divisant le offsetWidth et offsetHeight par 2.

j'ai remplacé l'appel à l'élément .NativeElement.GetElementBounds d'appeler ma propre méthode « getElementBounds », et il fonctionne comme je le veux à: problème

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

le seul reste est que les propriétés haut et à gauche ne compensent pas la taille de la navigateur windo w est "chrome", donc la capture d'écran de l'élément est plus loin et vers la droite qu'elle ne devrait l'être. Jusqu'à ce que je comprenne comment compenser cela, je l'évite en mettant le navigateur en mode "plein écran" avant de prendre la capture d'écran.