2012-03-07 59 views
1

我有一個頁面,包括列出的清單,我想與華廷瀏覽它:導航的DOM層次結構在華廷

<div id="NestedLists"> 
    <ul> 
     <li> 
      <ul> 
       <li>Sweet</li> 
       <li>Sour</li> 
       <li>Salty</li> 
      </ul> 
     </li> 
     <li> 
      <ul> 
       <li>Red</li> 
       <li>Yellow</li> 
      </ul> 
     </li> 
    </ul> 
</div> 

我不知道如何來遍歷只是直接元素的後代。我認爲這會工作(注意使用列表和listItems中的):

var treeControl = browser.Div(Find.ById("NestedLists")); 
var listOfLists = treeControl.Lists.First(); 

Console.WriteLine("Outer List:"); 
foreach (var list in listOfLists.ListItems) 
{ 
    Console.WriteLine("\tInner List:"); 
    foreach(var listItem in list.ListItems) 
    { 
     Console.WriteLine("\t\tList Item: " + listItem.Text); 
    } 
} 

但是,這給:

Outer List: 
    Inner List: 
     List Item: Sweet 
     List Item: Sour 
     List Item: Salty 
    Inner List: 
    Inner List: 
    Inner List: 
    Inner List: 
     List Item: Red 
     List Item: Yellow 
    Inner List: 
    Inner List: 

回答

0

好吧,其實這是一個艱難的問題比我意識到,但這裏有一個部分解決方案。

ChildrenOfType函數可以獲取包括Div,List和ListItem在內的一些元素的直接子元素。我已經包含了一個如何工作的樣本。

但是,此示例的問題是,當您使用.Text顯示ListItem的文本時,不僅會顯示直接文本,還會顯示子元素的文本。

至少,這個示例代碼將提供一種方式來衝浪列表heirarchy。如果listItem沒有子元素,你只能輸出文本,但我不知道你的情況效果如何。

public static void listSurfer(Div div) 
    { 
     Console.WriteLine("Outer List:"); 
     var innerLists = div.ChildrenOfType<List>(); 
     var innerListItems = div.ChildrenOfType<ListItem>(); 
     if (innerListItems.Count > 0) 
     { 
      foreach (var innerlist in innerLists) 
      { 
       Console.WriteLine("List Item: " + innerlist.Text); 
      } 
     } 
     listSurfer(innerLists, 1); 
    } 

    public static void listSurfer(ElementCollection<List> lstCollect, int depth) 
    { 
     foreach (List lst in lstCollect) 
     { 
      Console.WriteLine(tabNumber(depth) + "innerlist"); 
      var innerLists = lst.ChildrenOfType<List>(); 
      var innerListItems = lst.ChildrenOfType<ListItem>(); 
      if (innerListItems.Count > 0) 
      { 
       foreach (var innerlist in innerListItems) 
       { 
        Console.WriteLine(tabNumber(depth + 1) + "List Item: " + innerlist.Text); 
        var subLists = innerlist.ChildrenOfType<List>(); 
        if (subLists.Count > 0) 
         listSurfer(subLists, depth + 1); 
       } 
      } 
      if (innerLists.Count > 0) 
      { 
       listSurfer(innerLists, depth + 1); 
      } 
     } 
    } 

    public static String tabNumber(int count) 
    { 
     String tabs = ""; 
     for (int i = 0; i < count; i++) 
     { 
      tabs = tabs + "\t"; 
     } 
     return tabs; 
    } 
    private static int Main(string[] args) 
    { 
     Browser browser = new IE(@"C:\test.html"); 

     var treeControl = browser.Div(Find.ById("NestedLists")); 
     listSurfer(treeControl); 
    } 
+0

ChildrenOfType只是我需要的東西。謝謝你的幫助! – MrBlueSky 2012-03-16 10:38:55

0

由於內部列表也行打印對他們listOfLists的一部分。一個小的,如果解決了這個問題:

   var treeControl = browser.Div(Find.ById("NestedLists")); 
       var listOfLists = treeControl.Lists.First(); 

       Console.WriteLine("Outer List:"); 
       foreach (var list in listOfLists.ListItems) 
       { 
        if(list.ListItems.Count != 0) 
        { 
         Console.WriteLine("\tInner List:"); 
        } 
        foreach (var listItem in list.ListItems) 
        { 
         Console.WriteLine("\t\tList Item: " + listItem.Text); 
        } 
       } 
+0

這當然可以修復這個例子。但是,我希望有一個解決方案,讓我可以走等級制度,所以我只需要找到直接的後代。例如,如果我的顏色列表條目每個都有一個子列表(例如「陰影」),那麼簡單的「if」修復將不起作用(我認爲)。 – MrBlueSky 2012-03-08 10:00:08