2010-10-20 24 views
6

Với html sau:Làm thế nào để có được con của một Tử trong Watin?

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

Tôi có thể lấy yếu tố ul với:

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

Làm thế nào để lặp qua các con cái của search-results?

tôi đã quản lý để có được như xa như:

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

Nhưng điều này không giúp tôi khẳng định điều về H3 hoặc span chứa trong li 's.

+0

Tôi nghĩ bạn có nghĩa là "hậu duệ ", không phải" trẻ em ". Tôi đề nghị thay đổi điều này chỉ cho các tìm kiếm của người dùng trong tương lai. – prostynick

+0

con cháu ngụ ý rằng tôi quan tâm đến * tất cả * các nút trong 'kết quả tìm kiếm', ban đầu tôi muốn chỉ tìm thấy con cháu có nút cha là 'kết quả tìm kiếm'. Sự kết hợp này với jQuery giống như jQuery. –

+0

Vì vậy, bạn chỉ quan tâm đến các yếu tố 'li'? Bởi vì 'h3' và' span' không có 'ul' làm cha mẹ. Chúng có 'ul' làm tổ tiên và' li' làm cha mẹ. Cũng lưu ý rằng 'Elements' trong' IElementContainer' sẽ cung cấp cho bạn con cháu, không phải con cái. – prostynick

Trả lời

8

* OPTION1: * Dựa trên mã của bạn, bạn có thể thử một cái gì đó như:

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

bạn sẽ cần phải lặp qua từng nhịp.

* OPTION2: * Dựa trên một số gợi ý từ danh sách email Watin (tương tự như câu trả lời của riêng bạn cũng):

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

Sau đó, bạn phân tích thông qua elem.Element

+0

Cảm ơn, điều này khá giống với câu trả lời của riêng tôi ... Tôi không thể tin rằng một Element không thể tìm thấy con của riêng nó –

+0

@Gareth: cập nhật câu trả lời của tôi, đó là những gì chúng tôi có thể nhận được cho đến nay ... – Bolu

7

Current Hack tốt nhất mà tôi có thể nghĩ đến là:

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

Nó hoạt động nhưng chắc chắn có một lý do tại sao thích hợp để làm điều này?

And there is a correct way to do this từ danh sách WatiN chỉ gửi thư:

Trong ví dụ của tôi:

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

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

Giải pháp tuyệt vời cho câu hỏi của riêng bạn! Tôi sẽ đưa Children on Element vào bản phát hành tiếp theo của WatiN. Đã được triển khai cho bản phát hành tiếp theo là hỗ trợ cho ol và ul bởi browser.List() và hỗ trợ cho các phần tử li của trình duyệt.ListItem(). HTH, Jeroen. –

+3

công cụ tuyệt vời, WatiN là một thư viện tuyệt vời, cảm ơn tất cả nỗ lực –

Các vấn đề liên quan