2010-10-20 3 views
6

avec le code HTML suivant:Comment puis-je obtenir les enfants d'un élément dans 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> 

je peux obtenir l'élément ul avec:

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

Comment puis-je itérer sur les enfants du search-results?

J'ai réussi à aller aussi loin que:

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

Mais cela ne m'a pas aidé les choses au sujet de la affirmer H3 ou durée contenue dans les li « s.

+0

Je pense que vous vouliez dire « descendants ", pas" enfants ". Je suggère de changer cela juste pour les futures recherches de l'utilisateur. – prostynick

+0

descendants implique que je m'intéresse à * tous * les nœuds sous 'search-results', initialement je ne veux trouver que les descendants dont le nœud parent est 'search-results'. Ceci est cohérent avec l'API comme jQuery. –

+0

Vous n'êtes donc intéressé que par les éléments 'li'? Parce que 'h3' et' span' n'ont pas 'ul' comme parent. Ils ont «ul» comme ancêtre et «li» comme parent. Notez également que 'Elements' dans' IElementContainer' vous donnera des descendants, pas des enfants. – prostynick

Répondre

8

* Option1: * En fonction de votre code, vous pouvez essayer quelque chose comme:

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

vous devrez faire une boucle sur chaque travée.

* Option2: * Sur la base des suggestions de la liste de courrier Watin (similaire à votre propre réponse ainsi):

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

Ensuite, vous Parse par elem.Element

+0

Merci, c'est assez similaire à ma propre réponse ... Je ne peux pas croire qu'un élément ne peut pas trouver ses propres enfants –

+0

@Gareth: mis à jour ma réponse, c'est ce que nous pouvons obtenir de loin ... – Bolu

7

meilleur bidouille actuel, je peux penser est:

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

Il fonctionne mais sûrement il y a une bonne raison pour laquelle de faire cela?

And there is a correct way to do this de la liste de diffusion de Watin:

Dans mon exemple:

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

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

Grande solution à votre propre question! J'inclus Children on Element pour la prochaine version de WatiN. Déjà implémenté pour la prochaine version est le support pour ol et ul par browser.List() et le support des éléments li par browser.ListItem(). HTH, Jeroen. –

+3

de bonnes choses, WatiN est une grande bibliothèque, merci pour tous les efforts –

Questions connexes