在WatiN中导航DOM层次结构

时间:2012-03-07 07:34:58

标签: watin

我有一个包含列表列表的页面,我想用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:

2 个答案:

答案 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);
    }