Навигация по иерархии DOM в WatiN - PullRequest
1 голос
/ 07 марта 2012

У меня есть страница, содержащая список списков, и я хотел бы перемещаться по ней с помощью 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>

Я не знаю, как перебрать только прямые потомки Элемента. Я думал, что это будет работать (обратите внимание на использование 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 голосов
/ 15 марта 2012

Хорошо, на самом деле это более сложный вопрос, чем я предполагал, но вот частичное решение.

Функция ChildrenOfType может получить прямого потомка некоторых элементов, включая Div, List и ListItem.Я включил пример того, как это работает.

Однако проблема с этим примером заключается в том, что при отображении текста ListItem с использованием .Text отображается не только непосредственный текст, но и тексттакже дочерние элементы.

По крайней мере, этот пример кода предоставит способ просмотра иерархии списка.Вы можете вывести текст только в том случае, если 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 голосов
/ 07 марта 2012

Поскольку внутренние списки также являются частью 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);
                    }
                }
...