2012-05-30 19 views
6

का उपयोग कर पाठ पढ़ना मैं xpath का उपयोग करके अपने वेबपृष्ठ पर कुछ पाठ प्राप्त करने के लिए सेलेनियम का उपयोग कर रहा हूं।सेलेनियम वेबड्राइवर (xpath)

<span id="data" class="firefinder-match"> 
    Seat Height, Laden 
    <sup> 
    <a class="speckeyfootnote" rel="p7" href="#">7</a> 
    </sup> 
</span> 

अगर मैं निम्नलिखित कोड का उपयोग - -

driver.findElement(By.xpath("//span[@id='data']")).getText(); 

मैं परिणाम प्राप्त = Seat Height, Laden 7

लेकिन मैं पढ़ने से बचना चाहते हैं

पेज टैग संरचना इस प्रकार है <sup> टैग के भीतर पाठ और परिणाम Seat Height, Laden

कृपया मुझे बताएं कि मैं किस वांछित परिणाम प्राप्त करने के लिए उपयोग कर सकता हूं।

+3

उम। सादे XPath में (जो स्ट्रिंग्स को वापस करने में सक्षम होगा और न केवल वेबइलेमेंट्स), आप '// span [@ id = 'data']/text() [1]' कर सकते हैं। एक संभावित समाधान जो मैं जेएस का उपयोग करने के बारे में सोच सकता हूं, दूसरा पूरा पाठ प्राप्त करता है और फिर बाल तत्वों से सबकुछ हटा देता है। दोनों समाधान बदसूरत हैं और मैं एक अच्छा दिखना चाहता हूं। वैसे भी, अगर कुछ उचित समय में कोई जवाब नहीं है, तो मैं इसे पोस्ट करूंगा। –

+1

किसी भी कारण से xpath आपका एकमात्र विकल्प क्यों है? वेबड्राइवर xpath – Amey

+0

द्वारा तत्व को ढूंढने के लिए सबसे लंबा समय लेता है, ठीक है, मैं केवल xpath का उपयोग करता हूं क्योंकि मैं इसके साथ सहज हूं। अगर मेरी समस्या का समाधान करने का कोई अन्य तरीका है, तो मैं आभारी रहूंगा। –

उत्तर

7

मुझे सेलेनियम में ऐसा करने के किसी भी तरीके के बारे में पता नहीं है, इसलिए मेरा जेएस समाधान है। विचार तत्व के सभी बच्चों (टेक्स्ट नोड्स सहित) प्राप्त करना है और फिर केवल टेक्स्ट नोड्स का चयन करना है। अनियंत्रित रिक्त स्थान से छुटकारा पाने के लिए आपको कुछ .trim() (या जेएस समतुल्य) कॉल जोड़ने की आवश्यकता हो सकती है।

पूरे कोड:

WebElement elem = driver.findElement(By.id("data")); 
String text; 
if (driver instanceof JavascriptExecutor) { 
    text = ((JavascriptExecutor)driver).executeScript(
      "var nodes = arguments[0].childNodes;" + 
      "var text = '';" + 
      "for (var i = 0; i < nodes.length; i++) {" + 
      " if (nodes[i].nodeType == Node.TEXT_NODE) {" + 
      "  text += nodes[i].textContent;" + 
      " }" + 
      "}" + 
      "return text;" 
      , elem); 
} 

और बस बेहतर पठनीयता के लिए जे एस।

var nodes = arguments[0].childNodes; 
var text = ''; 
for (var i = 0; i < nodes.length; i++) { 
    if (nodes[i].nodeType == Node.TEXT_NODE) { 
     text += nodes[i].textContent; 
    } 
} 
return text; 
+0

जेएस के माध्यम से परिणाम प्राप्त करने के लिए बहुत अच्छा समाधान नहीं होगा। लेकिन मैं पूछना चाहता हूं कि क्या कुछ ऐसा है! एक्सपैथ में ऑपरेटर जिसके द्वारा हम कुछ टैग को अनदेखा कर सकते हैं। –

+1

हां, वहाँ है। हालांकि, यह इस विशेष मामले में काम नहीं करेगा क्योंकि आप अभी भी बाहरी तत्व का चयन कर रहे हैं और इसमें डिफ़ॉल्ट रूप से सभी बाल तत्व शामिल हैं। टेक्स्ट नोड भी इसका एक बाल तत्व है और एक सामान्य पार्सर इसे प्राप्त कर सकता है। WebDriver एक सामान्य पार्सर नहीं है और इसमें यह कार्यक्षमता नहीं है। फिर भी। यदि आप किसी विशेष XPath को जानना चाहते हैं, तो बेझिझक पूछें। –

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