Как получить детей Элемента в Ватине? - PullRequest
6 голосов
/ 20 октября 2010

С учетом следующего HTML:

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

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

Как перебрать детей из search-results?

Мне удалось добраться до:

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

Но это не помогает мне утверждать что-то о H3 или диапазоне, содержащемся в li.

Ответы [ 2 ]

8 голосов
/ 20 октября 2010

* Option1: * В зависимости от вашего кода, вы можете попробовать что-то вроде:

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

вам нужно будет циклически проходить каждый интервал.1008 * Вариант 2: * На основании некоторых предложений из списка рассылки Watin (аналогично вашему собственному ответу):

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

Затем вы анализируете elem.Element

7 голосов
/ 20 октября 2010

Текущий лучший взлом, который я могу придумать:

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

Это работает, но, безусловно, есть правильное, зачем это делать?

И есть правильный способ сделать это из списка рассылки watin:

В моем примере:

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

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