& Nbsp युक्त पाठ खोजने के लिए XPATH का उपयोग करना;


120

मैं एक HTML पृष्ठ पर अपने XPATH अभिव्यक्ति की जांच करने के लिए XPather ब्राउज़र का उपयोग करता हूं।

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

मुझे इसके समान एक सामग्री के साथ एक HTML फ़ाइल मिली:

<Tr>
  <Td> एबीसी </ td>
  <Td> & nbsp; </ td>
</ Tr>

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

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

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


क्या आपका वास्तविक XSL परिवर्तन कुछ भी नहीं लौटाता है? या केवल Xpather?
ज़ैक द ह्यूमन

जवाबों:


89

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

मैंने इस मुद्दे से संबंधित OpenQA के पाठ को यहां पुन: प्रस्तुत किया ( यहां पाया गया ):

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

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

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

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

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


1
OpenQA लिंक अब अधिक सफलतापूर्वक लोड नहीं हो रहा है
kjosh

1
मैं सिर्फ यह नोट करना चाहता हूं कि सेलेनियम या क्रोम देव टूल्स में $ {nbsp} मेरे लिए काम नहीं कर रहा है, न ही है \u00a0। मेरे लिए जो काम किया गया वह मैक पर एक गैर-ब्रेकिंग स्पेस टाइप करना था Alt+Shift+Space। वेब खोज Alt+0160विंडोज़ पर कहती है।
Cynic

25

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

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

मेरे लिए स्पेशल चार के साथ काम किया।

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

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


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

माफ़ करना। यह मेरे लिए काम नहीं करता है। मेरा अंतिम लक्ष्य मेरे वेब इंटरफेस के परीक्षणों के लिए सेलेनियम में इसका उपयोग करना है। सेलेनियम खुद को एक्सएमएल संरचना में परीक्षण के भाव रखता है और Alt विंडोज टाइपिंग रास्ते में खो जाता है। इसके अलावा, मेरा & # 160; XML में रिटर्न के रूप में।
बर्जरॉय

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

4
PHP के साथ इसे सफलतापूर्वक काम करने के लिए समझे:$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");
hakre

@Bergory यह सेलेनियम ड्राइवर के साथ प्रोट्रैक्टर का उपयोग करके काम करता है
डेमियन ग्रीन

4

&#160;नामित इकाई के बजाय दशमलव इकाई का उपयोग करने का प्रयास करें । यदि वह काम नहीं करता है, तो आपको इकाई के बजाय गैर-ब्रेकिंग स्पेस के लिए यूनिकोड वर्ण का उपयोग करने में सक्षम होना चाहिए &nbsp;

(नोट: मैंने XPather में यह कोशिश नहीं की थी, लेकिन मैंने इसे Oxygen में आज़माया था।)


2

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


1
यदि आप XPather (GUI) या जावास्क्रिप्ट में XPath का उपयोग / उपयोग नहीं करते हैं (संस्थाओं का कोई ऑटो-प्रतिस्थापन, क्योंकि हम XML में नहीं हैं)। अन्य XML वातावरण (XSTL?) में अच्छी सलाह।
फीलो

1

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

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

लौटाया गया मान 1 है, जो मेरे परीक्षण के मामले में सही मूल्य है।

हालांकि, मैं घोषणा की क्या ज़रूरत थी nbsp मेरी एक्सएमएल और XSL निम्नलिखित का उपयोग कर के भीतर एक इकाई के रूप में:

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

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

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


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

1

&nbsp;या केवल के लिए खोजें nbsp- क्या आपने यह कोशिश की?


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

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

1

आपके द्वारा दिए गए HTML के अनुसार:

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

स्ट्रिंग के साथ नोड का पता लगाने के लिए &nbsp;आप निम्नलिखित में से किसी एक का उपयोग कर सकते हैं आधारित समाधान:

  • का उपयोग कर text():

    "//td[text()='\u00A0']"
  • का उपयोग कर contains():

    "//td[contains(., '\u00A0')]"

हालाँकि, आदर्श रूप से आप NO-BREAK स्पेस कैरेक्टर से बचना पसंद कर सकते हैं और निम्नलिखित लोकेटर स्ट्रैटेजीज में से किसी एक का उपयोग कर सकते हैं :

  • मूल <tr>नोड का उपयोग करना और following-sibling:

    "//tr//following-sibling::td[2]"
  • का उपयोग कर starts-with():

    "//tr//td[last()]"
  • पूर्ववर्ती <td>नोड और followingnode andनिम्न-सिबलिंग का उपयोग करना :

    "//td[text()='abc']//following::td[1]"

संदर्भ

आप एक प्रासंगिक विस्तृत चर्चा पा सकते हैं:


tl; डॉ

यूनिकोड वर्ण 'NO-BREAK अंतरिक्ष' (U + 00A0)


-2

आप सेलेनियम वेबड्राइवर में XPath युक्तियां, सिबलिंग, पूर्वज कार्य का उपयोग कर सकते हैं, ऐसे तत्वों का पता लगाने के लिए जिन्हें पहचानने के लिए कोई अद्वितीय गुण नहीं हैं।

अधिक जानकारी के लिए, इस पृष्ठ को पढ़ें: https://www.guru99.com/using-contains-sbiling-ancestor-to-find-element-in-selenium.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.