我有一个包含列表列表的页面,我想用WatiN导航它:
<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>
我不知道如何遍历Element的直接后代。我认为这样可行(注意使用Lists和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 :(得分:0)
由于内部列表也是listOfLists的一部分,因此会为它们打印行。一个小的if解决了这个问题:
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);
}
}
答案 1 :(得分:0)
好吧,这实际上是一个比我意识到的更难的问题,但这是一个部分解决方案。
ChildrenOfType函数可以获取某些元素的直接子元素,包括Div,List和ListItem。我已经提供了一个如何工作的样本。
但是,此示例的问题在于,当您使用.Text显示ListItem的文本时,不仅会显示即时文本,还会显示子元素的文本。
至少,这个示例代码将提供一种浏览列表层次结构的方法。如果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);
}