2011-01-19 10 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 के लिए WATN दस्तावेज़ के साथ संगत है जो कहता है: "इस तत्व के आंतरिक टेक्स्ट (और इस तत्व में निहित सभी तत्वों के आंतरिक टेक्स्ट) प्राप्त करता है"।

चूंकि पृष्ठ के भीतर सभी पाठ <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.ElementOfType<Body>(Find.First()).Element बजाय लिखा सिर्फ ie.Element की। यह काम करना चाहिए, लेकिन यह नहीं है। मुझे लगता है कि यह एक बग है। मैंने इसके बारे में वाटीएन मेलिंग सूची पर एक पोस्ट लिखा और मुझे जवाब मिलने पर इस जवाब को अपडेट कर दिया जाएगा।

+0

अच्छा समाधान है, धन्यवाद! अगर एचटीएमएल को

हैलो दुनिया में संशोधित किया गया था तो मुझे वास्तव में इसे काम करने की आवश्यकता होगी!

'लेकिन मैंने यह नहीं बताया कि सवाल में, तो यह जवाब सही है। यह केवल उचित है कि मैं इसे अब स्वीकार किए गए उत्तर के रूप में चिह्नित करता हूं। :) –

+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')")); 
संबंधित मुद्दे