2008-10-29 13 views
101

युक्त टेक्स्ट खोजने के लिए XPATH का उपयोग करके मैं HTML पृष्ठ पर अपने XPATH अभिव्यक्तियों को देखने के लिए XPather Browser का उपयोग करता हूं। 

मेरा अंतिम लक्ष्य मेरे उपयोगकर्ता इंटरफेस के परीक्षण के लिए सेलेनियम में इन अभिव्यक्तियों का उपयोग करना है।

मैं इस के समान एक सामग्री के साथ एक HTML फ़ाइल मिल गया:

 
<tr> 
    <td>abc</td> 
    <td>&nbsp;</td> 
</tr> 

मैं स्ट्रिंग "&nbsp;" वाला एक पाठ के साथ एक नोड का चयन करना चाहते।

"एबीसी" जैसी सामान्य स्ट्रिंग के साथ कोई समस्या नहीं है। मैं एक XPATH का उपयोग //td[text()="abc"] के समान करता हूं।

जब मैं एक XPATH के साथ //td[text()="&nbsp;"] की कोशिश करता हूं तो यह कुछ भी नहीं देता है। क्या "&" ग्रंथों से संबंधित एक विशेष नियम है?

+0

क्या आपका वास्तविक एक्सएसएल रूपांतरण कुछ भी वापस नहीं करता है? या केवल Xpather? –

उत्तर

82

ऐसा लगता है कि OpenQA, सेलेनियम के पीछे के लोगों ने पहले से ही इस समस्या को संबोधित किया है। उन्होंने स्पष्ट रूप से सफेद जगहों से मेल खाने के लिए कुछ चर परिभाषित किए। मेरे मामले में, मुझे //td[text()="${nbsp}"] के समान XPATH का उपयोग करने की आवश्यकता है।

एचटीएमएल स्वचालित रूप से तत्वों के भीतर खाली स्थान के को सामान्य अग्रणी अनदेखी/एक में रिक्त स्थान अनुगामी और अतिरिक्त स्पेस, टैब और नई-पंक्तियों परिवर्तित:

मैं यहाँ इस मुद्दे (here पाया जाता है) के विषय में OpenQA से पाठ reproduced एकल स्थान। जब सेलेनियम पाठ पढ़ता पेज से बाहर, यह करने का प्रयास इस व्यवहार नकल ताकि आप अपने HTML में सभी टैब और नई-पंक्तियों पर ध्यान न दें और के आधार पर दावे करते हैं कि पाठ ब्राउज़र में दिखता है, जब गाया जा सकता है। हम एकल स्थान के साथ सभी गैर-दृश्यमान व्हाइटस्पेस ( गैर-ब्रेकिंग स्पेस "&nbsp;") को प्रतिस्थापित करके ऐसा करते हैं। सभी दृश्यमान न्यूलाइन (<br>, <p>, और <pre> स्वरूपित नई लाइनें) संरक्षित की जानी चाहिए।

हम एचटीएमएल सेलेनीज़ टेस्ट केस टेबल के पाठ पर पर समान सामान्यीकरण तर्क का उपयोग करते हैं। इसमें फायदे हैं। सबसे पहले, आपको की आवश्यकता नहीं है पृष्ठ के HTML स्रोत को पर देखें कि आपके अनुमानों को होना चाहिए; "&nbsp;" प्रतीक अंतिम उपयोगकर्ता के लिए अदृश्य हैं, और इसलिए को सेलेनीज़ परीक्षण लिखते समय उनके बारे में चिंता करने की ज़रूरत नहीं है। (आप एक क्षेत्र है कि "&nbsp;" शामिल हैं पर assertText करने के लिए अपने परीक्षण का मामला में "&nbsp;" मार्कर लगाने की जरूरत नहीं है।) आप भी अपनी Selenese <td> टैग में नई-पंक्तियों और रिक्त स्थान अतिरिक्त पड़ सकती है; चूंकि हम टेक्स्ट पर पाठ पर उसी सामान्यीकरण तर्क का उपयोग करते हैं, हम सुनिश्चित कर सकते हैं कि दावा और निकाले गए पाठ बिल्कुल मेल खाते हैं।

यह उन दुर्लभ अवसरों जब आप वास्तव में चाहते हैं /अपने परीक्षण के मामले में अतिरिक्त व्हाइट सम्मिलित करने के लिए की जरूरत पर एक समस्या का एक सा पैदा करता है। उदाहरण के लिए, आप को जैसे फ़ील्ड में टेक्स्ट टाइप करने की आवश्यकता हो सकती है: "foo"। लेकिन अगर आप <td>foo </td> अपने सेलेनीज़ टेस्ट केस में लिखते हैं, तो हम आपके अतिरिक्त रिक्त स्थान को केवल एक स्थान के साथ बदल देंगे।

इस समस्या का एक सरल कामकाज है। हमने सेलेनीज़, ${space} में एक चर परिभाषित किया है, जिसका मान एक स्थान है। आप ${space} से का उपयोग कर सकते हैं ऐसी जगह डालें जो स्वचालित रूप से छंटनी नहीं होगी, जैसे: <td>foo${space}${space}${space}</td>। हमने एक चर ${nbsp} भी शामिल किया है, जिसे आप को एक गैर-ब्रेकिंग स्पेस डालने के लिए उपयोग कर सकते हैं।

ध्यान दें कि XPaths व्हाइटसाइट को सामान्य तरीके से सामान्य करें। आप जरूरत //div[text()="hello world"] की तरह एक XPath लिखने के लिए लेकिन लिंक के एचटीएमएल वास्तव में "hello&nbsp;world" है, तो आप सम्मिलित एक असली "&nbsp;" अपने Selenese परीक्षण मामले में इससे मिलते हुए प्राप्त करने के लिए करने की आवश्यकता होगी, इस तरह: //div[text()="hello${nbsp}world"]

0

&nbsp; या केवल nbsp के लिए खोजें - क्या आपने इसे आजमाया?

+0

मुझे पता है कि यह काम करना चाहिए, लेकिन मुझे यह पता नहीं है कि मुझे क्या मिल रहा है। मैं जो खोज रहा हूं उससे मेल खाने के लिए एक निश्चित तरीके से एन्कोड करने के लिए XPATH में एक तरीका होना चाहिए। – Bergeroy

+0

शायद मुझे नियमित अभिव्यक्ति की ओर देखना चाहिए। – Bergeroy

3

नामित इकाई के बजाय दशमलव इकाई &#160; का उपयोग करने का प्रयास करें। यदि यह काम नहीं करता है, तो आप &nbsp; इकाई के बजाय unicode character for a non-breaking space का उपयोग करने में सक्षम होना चाहिए।

(नोट:। मैं XPather में यह कोशिश नहीं की है, लेकिन मैं ऑक्सीजन में यह कोशिश की थी)

16

मैंने पाया मैं मैच कर सकते हैं जब मैं इनपुट एक हार्ड-कोडेड नॉन-ब्रेकिंग स्पेस (U + 00A0) दो कोट्स के बीच विंडोज़ पर Alt + 0160 टाइप करके ...

//table[@id='TableID']//td[text()=' '] 

विशेष char के साथ मेरे लिए काम किया।

जो मैंने समझा, उससे XPath 1.0 मानक यूनिकोड वर्णों से बचने में संभाल नहीं करता है। ऐसा लगता है कि XPath 2.0 में इसके लिए फ़ंक्शंस लगता है लेकिन ऐसा लगता है कि फ़ायरफ़ॉक्स इसका समर्थन नहीं करता है (या मैंने कुछ गलत समझा है)। तो आपको स्थानीय कोडपेज के साथ करना है। बदसूरत, मुझे पता है।

असल में, ऐसा लगता है कि मानक सही यूनिकोड एस्केप अनुक्रम प्रदान करने के लिए XPath का उपयोग कर प्रोग्रामिंग भाषा पर निर्भर है ... तो, किसी भी तरह, मैंने सही काम किया।

+0

फ़ायरफ़ॉक्स 2 में Xpather 1.4.1 का उपयोग करके, // td [text() = ''] कोई परिणाम नहीं देता है। –

+0

क्षमा करें। यह मेरे लिए काम नहीं करता है। मेरा अंतिम लक्ष्य अपने वेब इंटरफेस के परीक्षणों के लिए सेलेनियम में इसका उपयोग करना है। सेलेनियम खुद ही एक्सएमएल संरचना में परीक्षण अभिव्यक्ति रखता है और Alt Windows टाइपिंग रास्ते में खो जाता प्रतीत होता है। इसके अलावा, मेरे   एक्सएमएल में एक के रूप में लौटाता है। – Bergeroy

+0

जैक, जैसा कि मैंने लिखा है, आपको Alt + 0160 (संख्यात्मक कीपैड पर) द्वारा उत्पादित चरित्र द्वारा दो उद्धरणों के बीच की जगह को प्रतिस्थापित करना होगा। – PhiLho

1

मैं एक मैच Xpather का उपयोग नहीं कर प्राप्त कर सकते हैं, लेकिन माइक्रोसॉफ्ट के एक्सएमएल नोटपैड में सादे एक्सएमएल और XSL फाइलों के साथ मेरे लिए काम किया है:

<xsl:value-of select="count(//td[text()='&nbsp;'])" /> 

दिए गए मान 1 है, जो अपने परीक्षण में सही मान है मामला।

हालांकि, मैं का उपयोग कर के बाद मेरे XML में मौजूद एक इकाई के रूप में और XSL nbsp घोषित करने के लिए किया:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]> 

मुझे नहीं लगता है कि अगर आप में मदद करता है, लेकिन मैं वास्तव में करने में सक्षम था एक XPath अभिव्यक्ति का उपयोग कर nbsp ढूंढें।

संपादित करें: मेरे कोड नमूने में वास्तव में वर्ण '& nbsp;' लेकिन जावास्क्रिप्ट सिंटैक्स हाइलाइट इसे स्पेस कैरेक्टर में बदल देता है। गुमराह मत बनो!

+0

के साथ आप अपने कोड नमूना को संपादित कर सकते हैं जैसे कि यह मेरे प्रश्न में नमूने के लिए किया गया था। अपनी इकाई को & nbsp; द्वारा बदलें। – Bergeroy

1
मन में

भालू है कि मानकों का अनुपालन करने XML प्रोसेसर किसी भी संस्था एक्सएमएल के पांच मानक वाले (&amp;, &gt;, &lt;, &apos;, &quot;) समय से लक्ष्य एन्कोडिंग में इसी चरित्र के साथ के अलावा अन्य संदर्भों जगह ले ली है जाएगा XPath अभिव्यक्तियों का मूल्यांकन किया जाता है। उस व्यवहार को देखते हुए, फिलोहो और जेसुलाक के सुझाव हैं यदि आप एक्सएमएल टूल्स के साथ काम करना चाहते हैं तो जाने का तरीका है। जब आप XPath अभिव्यक्ति में &#160; दर्ज करते हैं, तो इसे XPath अभिव्यक्ति लागू करने से पहले संबंधित बाइट अनुक्रम में परिवर्तित किया जाना चाहिए।

+1

यदि आप एक्सपीएथ (जीयूआई) में या जावास्क्रिप्ट में XPath का उपयोग नहीं करते हैं (संस्थाओं का कोई ऑटो-प्रतिस्थापन नहीं है, क्योंकि हम एक्सएमएल में नहीं हैं)। अन्य एक्सएमएल वातावरण में अच्छी सलाह (एक्सएसटीएल?)। – PhiLho

संबंधित मुद्दे