2010-10-20 20 views
6

Dado el siguiente código HTML:¿Cómo obtengo los hijos de un elemento en Watin?

<ul id="search-results"> 
    <li> 
     <h3>Result 1</h3> 
     <span class="some-info">Tag line</span> 
    </li> 
    <li> 
     <h3>Result 2</h3> 
     <span class="some-info">Another bit</span> 
    </li> 
    <li> 
     <h3>Result 2</h3> 
     <span class="some-info">Another bit</span> 
    </li> 
</ul> 

yo puede conseguir con el elemento ul:

Element ul = ie.Element(Find.ById("search-results")); 

¿Cómo iterar sobre los niños de la search-results?

He conseguido llegar lo más lejos:

var allListItems = ie.Elements.Filter(e => e.Parent != null && e.Parent.Id == "search-results"); 

Pero esto no me ayuda a afirmar cosas sobre el lapso de H3 o contenida dentro de los li 's.

+0

creo que quería decir "descendientes ", no" niños ". Sugiero cambiar esto solo para futuras búsquedas de los usuarios. – prostynick

+0

descendientes implica que estoy interesado en * todos los nodos en 'resultados de búsqueda', inicialmente quiero encontrar solo los descendientes cuyo nodo padre es 'resultados de búsqueda'. Esto es compatible con api's como jQuery. –

+0

¿Entonces solo le interesan los elementos 'li'? Porque 'h3' y' span' no tienen 'ul' como padre. Tienen 'ul' como antecesor y' li' como padre. También tenga en cuenta que 'Elementos' en' IElementContainer' le dará descendientes, no hijos. – prostynick

Respuesta

8

* Opción 1: * Basado en el código, puede intentar algo como:

ie.Spans.Filter(Find.ByClass("some-info"))[0...2].PreviousSibling; 

tendrá que recorrer cada tramo.

* Opción 2: * Sobre la base de algunas sugerencias de la lista de correo Watin (similares a su propia respuesta también):

IElementContainer elem = (IElementContainer)ie.Element(Find.ById("search-results")); 

A continuación, analizar a través de elem.Element

+0

Gracias, esto es muy similar a mi propia respuesta ... Simplemente no puedo creer que un Elemento no pueda encontrar sus propios hijos –

+0

@Gareth: actualicé mi respuesta, eso es lo que podemos obtener con mucho ... – Bolu

7

actual mejor truco que se me ocurre es:

public static class WatinExtensions 
{ 
    public static ElementCollection Children(this Element self) 
    { 
     return self.DomContainer.Elements.Filter(e => self.Equals(e.Parent)); 
    } 
} 


ElementCollection results = ie.Element(Find.ById("search-results")).Children(); 

// and 

foreach(Element li in results) 
{ 
    Element info = li.Children().First(e => e.ClassName.Contains("some-info")); 
} 

Funciona, pero sin duda hay una razón por la adecuada para hacer esto?

And there is a correct way to do this de la lista de correo Watin:

En mi ejemplo:

var searchResults = (IElementContainer) ie.Element(Find.ById("search-results")); 

foreach (Element element in searchResults.Elements) { 
    // can do more here 
} 
+2

¡Gran solución a su propia pregunta! Incluiré Children on Element para el próximo lanzamiento de WatiN. Ya implementado para la próxima versión es compatible con ol y ul por browser.List() y soporte para elementos li por browser.ListItem(). HTH, Jeroen. –

+3

cosas geniales, WatiN es una gran biblioteca, gracias por todo el esfuerzo –

Cuestiones relacionadas