2011-10-14 16 views
11

मैं टेक्स्ट का उपयोग कर वेब पेज पर एक तत्व ढूंढना चाहता हूं।
मुझे पता है कि एक विधि नाम उदाहरण के लिए, ऐसा करने के लिए होता है:सेलेनियम: सटीक टेक्स्ट मिलान का उपयोग करके नोड का पता कैसे लगाएं

tr[contains(.,'hello')]/td 

लेकिन अगर मैं दो तत्वों हैलो नाम और hello1 तो इस समारोह ठीक से काम नहीं करता है समस्या है।

क्या तत्वों का पता लगाने के लिए सटीक स्ट्रिंग मिलान के लिए कोई अन्य विधि है?

+0

"ठीक से काम नहीं करता" के साथ आपका क्या मतलब है? अप्रत्याशित व्यवहार क्या है? –

+0

यदि हमारे पास टेक्स्ट हैलो और हैलो 1 के साथ दो तत्व हैं और जब हम उपयोग करते हैं (।, 'हैलो') तो यह विधि हमेशा हैलो की तलाश करेगी। समस्या अगर ये तत्व एक टेबल में हैं और हैलो 1 पहला तत्व है और हैलो दूसरा है और जब हम उपयोग करते हैं तो हैलो यह हमेशा हैलो 1 को इंगित करेगा क्योंकि यह पहला तत्व है और इसमें हैलो है लेकिन हम हैलो खोजना चाहते हैं कि मुझे सटीक क्यों चाहिए मिलान विधि –

उत्तर

1

ठीक है, आपकी समस्या यह है कि आप tr में टेक्स्ट खोज रहे हैं (जो वैसे भी सही नहीं है) और इससे contains फ़ंक्शन में कोई समस्या आती है जो पाठ की एक सूची स्वीकार नहीं कर सकता है। इसके बजाय इस स्थान पथ का उपयोग करने का प्रयास करें। इसे आप जो चाहते हैं उसे पुनः प्राप्त करना चाहिए।

//tr/td[contains(./text(),"hello")] 

यह स्थान पथ उस नोड का एक सेट पुनर्प्राप्त करेगा जिस पर आपको टेक्स्ट प्राप्त करने के लिए पुनरावृत्ति करना है। आप

/text() 

संलग्न करने के लिए कोशिश कर सकते हैं, लेकिन इस कारण होगा (कम से कम अपने परीक्षण पर) एक परिणाम के एक स्ट्रिंग जो सभी मिलान तार का एक संयोजन है कि।

+0

'शामिल ('का उपयोग करने में कुछ भी गलत नहीं है।, जो भी हो) 'एक टीआर तत्व पर, हालांकि शायद यह नहीं है कि अभिनव वास्तव में क्या चाहता है। '। ™ 'वंश :: या स्वयं :: पाठ()' के लिए नहीं,' self :: नोड() 'के लिए संक्षेप है, इसलिए इसके परिणामस्वरूप टीआर और उसके सभी वंशज स्ट्रिंग्स, कंटेनेटेड और तुलना में परिवर्तित हो रहे हैं , मेल खाने वाले एक पाठ नोड की तलाश करने के बजाय। –

+0

@RossPatterson तथ्य यह है कि यदि आप एक अच्छा कोड बना रहे हैं, तो एक टी के नीचे कोई पाठ नहीं है बल्कि केवल एक (या अधिक) टीडी है। इस बात को ध्यान में रखते हुए मैंने कहा "जो भी वैसे भी सही नहीं है"। –

16
tr[.//text()='hello']/td 

इस उस में साथ बिल्कुल 'हैलो' एक बच्चा होने सब टीआर सभी तत्वों का टीडी बच्चे तत्वों का चयन करेंगे। ऐसा एक XPath अभी भी मेरे लिए अजीब लगता है।

मुझे विश्वास है कि यह अधिक समझ में आता है:

tr/td[./text()='hello'] 

क्योंकि यह केवल टीडी कि पाठ शामिल चयन करता है।

क्या यह मदद करता है?

3

यह सब अपने HTML वास्तव में इसमें इस बात पर निर्भर करता है, लेकिन अपने tr[contains(.,'hello')]/td XPath चयनकर्ता (या, और अधिक सही, "" पहली पंक्ति स्ट्रिंग 'हैलो' के भीतर कहीं भी यह शामिल के प्रथम कक्ष "का अर्थ है टीआर तत्व में पहला टीडी तत्व जिसमें के भीतर कहीं भी स्ट्रिंग 'हैलो' होता है, क्योंकि सेलेनियम को पता नहीं है कि तत्व वास्तव में क्या करते हैं)। यही कारण है कि जब "हैलो" और "हैलो 1" वाली पंक्तियां होती हैं तो गलत परिणाम मिल रहा है - दोनों में "हैलो" होता है।

चयनकर्ता tr[. ='hello']/td अधिक सटीक होगा, लेकिन यह थोड़ा असामान्य है (क्योंकि एचटीएमएल टीआर तत्वों में टेक्स्ट नहीं होना चाहिए - टेक्स्ट टीआर के भीतर TH या TD तत्वों में होना चाहिए), और शायद यह जीता काम नहीं करते (क्योंकि किसी अन्य कोशिका में पाठ तुलना तोड़ देगा)। आप शायद चाहतेtr[td[.='hello']]/td, जिसका अर्थ है "पहले टीडी तत्व टी.आर. तत्व है कि एक टीडी तत्व स्ट्रिंग 'हैलो' के रूप में यह पूरा पाठ है है कि शामिल है में निहित"।

+0

बस इस पोस्ट के लिए धन्यवाद। = 'टेक्स्ट' चाल धन्यवाद। धन्यवाद @ रॉस पैटरसन! इस मामले में आप किसी भी टीडी सेल को सटीक 'हैलो' युक्त खोजने के लिए //td[.='hello '] के साथ पृष्ठ पर किसी भी टीडी से सटीक मिलान कर सकते हैं। टी संभवतः तब तक जरूरी नहीं है जब तक आप यह सुनिश्चित नहीं करना चाहते कि टीडी एक टी के अंदर है। –

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