2010-10-20 9 views
6

Dato il seguente codice HTML:Come ottengo i figli di un elemento in 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> 

posso ottenere l'elemento ul con:

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

Come posso iterare i bambini della search-results?

Sono riuscito a ottenere, per quanto:

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

Ma questo non mi aiuta affermare cose circa l'H3 o luce contenuta nei 's li.

+0

Penso che volevi dire "discendenti ", non" bambini ". Suggerisco di cambiarlo solo per le ricerche dell'utente futuro. I discendenti – prostynick

+0

implicano che sono interessato a * tutti * i nodi in 'risultati di ricerca', inizialmente voglio trovare solo i discendenti il ​​cui nodo genitore è 'risultati di ricerca'. Questo consistente con API come jQuery. –

+0

Quindi sei interessato solo agli elementi 'li'? Poiché 'h3' e' span' non hanno 'ul' come genitore. Hanno 'ul' come antenato e' li' come genitore. Nota anche che 'Elements' in' IElementContainer' ti darà discendenti, non figli. – prostynick

risposta

8

* Option1: * Basato sul codice, si può provare qualcosa di simile:

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

sarà necessario eseguire il loop su ciascuna span.

* Option2: * Sulla base dei suggerimenti dall'elenco di posta Watin (simili alla propria risposta pure):

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

Poi si analizza attraverso elem.Element

+0

Grazie, è molto simile alla mia risposta ... Non riesco a credere che un elemento non possa trovare i propri figli –

+0

@Gareth: aggiornata la mia risposta, questo è quello che possiamo ottenere di gran lunga ... – Bolu

7

migliore attuale mod mi viene in mente è:

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

Funziona, ma sicuramente c'è una vera e propria perché per fare questo?

And there is a correct way to do this dalla Watin mailing list:

Nel mio esempio:

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

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

Ottima soluzione alla tua stessa domanda! Includerò Children on Element per la prossima versione di WatiN. Già implementato per la prossima versione è il supporto per ol e ul da browser.List() e supporto per elementi li da browser.ListItem(). HTH, Jeroen. –

+3

grandi cose, WatiN è una grande biblioteca, grazie per tutto lo sforzo –

Problemi correlati