2011-01-19 4 views
6

주어진 다음의 HTML 페이지 : 나는 일부 텍스트를 검색 할 수 있도록하고 싶습니다WatiN : 텍스트를 찾을 때 포함하는 요소에 대한 참조를 얻으려면 어떻게해야합니까?

<html> 
<head> 
    <title>WatiN Test</title> 
</head> 
<body> 
<div> 
    <p>Hello World!</p> 
</div> 
</body> 
</html> 

는 (이 케이스 <p> 요소) 부모 요소에 대한 참조를 얻을 수 ("World" 말할 수 있습니다). 내가하려고하면


이 :

var element = ie.Element(Find.ByText(t => t.Contains("World"))) 

나이 :

var element = ie.Element(e => e.Text != null && e.Text.Contains("World")); 

나는 다시 <html> 요소를 얻을. 이는 Element.Text에 대한 WatiN 설명서와 일치하며 "이 요소의 innertext 및이 요소에 포함 된 모든 요소의 innertext를 가져옵니다.".

페이지 내의 모든 텍스트가 <html> 요소 내에 포함되어 있기 때문에, 바로 부모 대신이 정보를 얻을 수 있습니다.


텍스트가 포함 된 요소 바로 아래의 텍스트 만 가져올 수있는 방법이 있습니까?

다른 방법이 있습니까?

감사합니다.

답변

2

벨로 코드는 "세계"를 포함하는 텍스트로 <body/> 내부의 첫 번째 요소를 찾을 수 있습니다. 요소 컨테이너로 분류되고 자식 요소가있는 요소는 생략됩니다.

var element = ie.ElementOfType<Body>(Find.First()).Element(e => 
{ 
    if (e.Text != null && e.Text.Contains("World")) 
    { 
     var container = e as IElementContainer; 
     if (container == null || container.Elements.Count == 0) 
      return true; 
    } 
    return false; 
}); 

: 난 그냥 ie.Element 대신 ie.ElementOfType<Body>(Find.First()).Element을 썼다 왜 궁금 수 있습니다. 이것은 효과가 있지만 작동하지 않습니다. 나는 그것이 버그라고 생각한다. 나는 WatiN 메일 링리스트에 그것에 관한 글을 적었고 대답을 받으면이 대답을 업데이트 할 것이다.

+0

니스 솔루션, 감사합니다! HTML이'

안녕하세요 세계로 수정 된 경우 실제로 그것을 작동하는 데 필요한 것입니다!

'하지만 그 질문에 대해서는 언급하지 않았으므로이 대답은 정확합니다. 지금 내가 인정한 대답으로 표시하는 것이 공평한 것입니다. :) –

+0

그래, 나중에 생각해 봤지만,이 대답은 뭔가 더 좋은 무언가에 좋은 시작이라고 생각합니다.) – prostynick

1

나는 뭔가 효과가 있다고 생각해 왔지만 약간은 해킹되고 매우 비효율적입니다.

이것은 기본적으로 가장 깊게 들어있는 요소의 길이가 가장 짧습니다 (InnerHtml). 즉, 직접적인 부모를 포함하는 다른 모든 요소는 HTML을 포함하므로 더 길어집니다!

public static Element FindElementContaining(IElementsContainer ie, string text) 
{ 
    Element matchingElement = null; 

    foreach (Element element in ie.Elements) 
    { 
     if (element.Text == null) continue; 

     if (!element.Text.ToLower().Contains(text.ToLower())) continue; 

     // If the element found has more inner html than the one we've already matched, it can't be the immediate parent! 
     if (matchingElement != null && element.InnerHtml.Length > matchingElement.InnerHtml.Length) continue; 

     matchingElement = element; 
    } 

    return matchingElement; 
} 
3

당신은 Find.BySelector

를 사용할 수
var element = ie.Element(Find.BySelector("p:contains('World')")); 
관련 문제