2010-10-20 77 views
6

考慮下面的HTML:如何獲得在華廷元素的孩子嗎?

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

如何遍歷search-results的孩子:

<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> 

我可以得到ul元素?

我已經成功地得到儘可能爲:

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

但是,這並不能幫助我可以斷言關於含有li的內H3或跨度的東西。

我能想到的
+0

分析,我認爲你的意思是「後裔「,而不是」孩子「。我建議改變這個只是爲了將來用戶的搜索。 – prostynick 2010-10-20 14:47:59

+0

後代意味着我下的「搜索結果」感興趣的*所有*節點,起初我只想要查找的父節點是「搜索結果」的後代。這與api的jQuery一致。 – 2010-10-20 19:10:31

+0

所以你只關心'li'元素呢?因爲'h3'和'span'沒有'ul'作爲父項。他們有'ul'作爲祖先和'li'作爲父母。還要注意'IElementContainer'中的'Elements'會給你後代,而不是孩子。 – prostynick 2010-10-21 21:47:07

回答

8

* 選項1: *基於您的代碼,你可以嘗試這樣的:

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

您需要遍歷每個跨度。

* 選項2: *基於來自華廷郵件列表中的一些建議(類似於你自己的答案也一樣):

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

然後你通過elem.Element

+0

謝謝,這是非常相似,我自己的答案......我簡直不敢相信,一個元素不能找到它自己的孩子 – 2010-10-20 14:06:39

+0

@Gareth:更新了我的答案,這是我們可以得到的... – Bolu 2010-10-20 14:24:34

7

目前最好的手段是:

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

它的工作原理,但肯定有一個正確的,爲什麼這樣做呢?

And there is a correct way to do this從華廷郵件列表:

在我的例子:

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

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

偉大的解決方案,您自己的問題!我將在下一個版本的WatiN中加入Children on Element。下一個版本中已經實現是通過由browser.ListItem爲browser.List醇和UL()的支持,並支持li元素()。 HTH,Jeroen。 – 2010-11-07 23:23:14

+3

偉大的東西,華廷是一個偉大的圖書館,感謝所有的努力 – 2010-11-08 12:09:10