2011-11-30 11 views
5

मैं सेलेनियम 2.12 का उपयोग कर रहा हूं। वेबड्राइवर एपीआई का उपयोग करके, मान लें कि मेरे पास एक वेबइलेमेंट है जो एक तालिका का प्रतिनिधित्व करता है (<table>)। उस तत्व का उपयोग करके, मैं पहले कॉलम में सभी टीडी का चयन कैसे करूं? मुझे लगता है कि एक xpath अभिव्यक्ति यहां क्रम में है।सेलेनियम वेबड्राइवर में मैं सभी कॉलम प्रथम कक्ष (टीडीएस) का चयन कैसे करूं?

बेहतर, टेबल संरचना को समझने के अगर मैं से मेरी tableElement WebElement ...

String html = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", tableElt); 

एचटीएमएल मिल मैं नीचे गड़बड़ी मिलता है। सूचना के लिए मुख्य बात वहाँ 6 टीआर की और 16 टीडी के ...

<thead><tr><th colspan="1" class="GCSPOWVGE GCSPOWVEE GCSPOWVEF GCSPOWVFF"><div style="padding-left: 17px;position:relative;zoom:1;"><div style="left:0px;margin-top:-4px;position:absolute;top:50%;line-height:0px;"><img onload='this.__gwtLastUnhandledEvent="load";' src="http://localhost:9080/cme-productplus-web/productplus/clear.cache.gif" style="width: 11px; height: 7px; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAiklEQVR42mNgwALyKrumFRf3iDAQAvmVXVVAxf/zKjq341WYV95hk1fZ+R+MK8C4HqtCkLW5FZ2PQYpyK6AaKjv/5VV1OmIozq3s3AFR0AXFUNMrO5/lV7WKI6yv6mxCksSGDyTU13Mw5JV2qeaWd54FWn0BRAMlLgPZl/NAuBKMz+dWdF0H2hwCAPwcZIjfOFLHAAAAAElFTkSuQmCC) no-repeat 0px 0px;" border="0"></div><div>GUID</div></div></th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung Ratio</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung type</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung Date Offset</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF GCSPOWVOE">Days To Retain</th></tr></thead><colgroup><col><col><col><col><col></colgroup><tbody><tr onclick="" class="GCSPOWVAE"><td class="GCSPOWVPD GCSPOWVBE GCSPOWVCE"><div style="outline:none;" tabindex="0">  DSSUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">  10  </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">    </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">  </div></td><td class="GCSPOWVPD GCSPOWVBE GCSPOWVME"><div style="outline:none;">   </div></td></tr><tr onclick="" class="GCSPOWVAF"><td class="GCSPOWVPD GCSPOWVBF GCSPOWVCE"><div style="outline:none;">  ETTUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;">  30  </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;">    </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;">  </div></td><td class="GCSPOWVPD GCSPOWVBF GCSPOWVME"><div style="outline:none;">   </div></td></tr><tr onclick="" class="GCSPOWVAE"><td class="GCSPOWVPD GCSPOWVBE GCSPOWVCE"><div style="outline:none;">  FCCUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">  20  </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">    </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;">  </div></td><td class="GCSPOWVPD GCSPOWVBE GCSPOWVME"><div style="outline:none;">   </div></td></tr></tbody><tbody style="display: none;"><tr><td colspan="5" align="center"><div><div style="width: 100%; height: 100%; padding: 0px; margin: 0px; display: none;"><div style="width: 100%; height: 100%; display: none;"></div></div><div style="width: 100%; height: 100%; padding: 0px; margin: 0px; display: none;"><div class="GCSPOWVPE" style="width: 100%; height: 100%; display: none;"><img class="gwt-Image" onload='this.__gwtLastUnhandledEvent="load";' src="http://localhost:9080/cme-productplus-web/productplus/clear.cache.gif" style="width: 43px; height: 11px; background: url(data:image/gif;base64,R0lGODlhKwALAPEAAP///0tKSqampktKSiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAKwALAAACMoSOCMuW2diD88UKG95W88uF4DaGWFmhZid93pq+pwxnLUnXh8ou+sSz+T64oCAyTBUAACH5BAkKAAAALAAAAAArAAsAAAI9xI4IyyAPYWOxmoTHrHzzmGHe94xkmJifyqFKQ0pwLLgHa82xrekkDrIBZRQab1jyfY7KTtPimixiUsevAAAh+QQJCgAAACwAAAAAKwALAAACPYSOCMswD2FjqZpqW9xv4g8KE7d54XmMpNSgqLoOpgvC60xjNonnyc7p+VKamKw1zDCMR8rp8pksYlKorgAAIfkECQoAAAAsAAAAACsACwAAAkCEjgjLltnYmJS6Bxt+sfq5ZUyoNJ9HHlEqdCfFrqn7DrE2m7Wdj/2y45FkQ13t5itKdshFExC8YCLOEBX6AhQAADsAAAAAAAAAAAA=) no-repeat 0px 0px;" border="0"></div></div></div></td></tr></tbody><tfoot style="display: none;"><tr><th colspan="5" class="GCSPOWVFE GCSPOWVDE GCSPOWVNE"></th></tr></tfoot> 

दुर्भाग्य यह है कि, इन दोनों भाव सही परिणाम नहीं है।

 // This returns zero td's 
     final List<WebElement> tds = tableElt.findElements(By.xpath("/tr/td[1]")); 

     ... 

     // This returns 238 td's (I think that's everything in my document) 
     final List<WebElement> tds = tableElt.findElements(By.xpath("//td[1]")); 

उत्तर

4

उपयोग करने के लिए सटीक अभिव्यक्ति अपने दस्तावेज़ की वास्तविक संरचना पर निर्भर करता है।

सबसे सामान्य स्थिति में - एक तालिका के प्रथम स्तंभ कोशिकाओं के सभी का चयन - आप निम्नलिखित अभिव्यक्ति इस्तेमाल कर सकते हैं:,

<path_to_table>//td[1] 

उदाहरण के लिए इस दस्तावेज़ पर:

<table> 
    <tr> 
     <td>1</td> 
     <td>2</td> 
     <td>3</td> 
     <td>4</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
    </tr> 
    <tr> 
     <td>i</td> 
     <td>ii</td> 
     <td>iii</td> 
     <td>iv</td> 
    </tr> 
</table> 

यह अभिव्यक्ति:

/table//td[1] 

देता है:

<td>1</td> 
<td>a</td> 
<td>i</td> 

ध्यान दें कि मैं वंशज-या-स्वयं धुरी (//) का उपयोग कर रहा हूं क्योंकि HTML तालिका वैकल्पिक समूह तत्वों (उदा। <tbody>), जो वहां हो सकता है या नहीं भी हो सकता है। हालांकि, इसमें नेस्टेड टेबल से पहले कॉलम सेल भी शामिल होंगे। रिटर्न ऊपर से

<table> 
    <tr> 
     <td>1</td> 
     <td><table><td>test</td></table></td> 
     <td>3</td> 
     <td>4</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
    </tr> 
    <tr> 
     <td>i</td> 
     <td>ii</td> 
     <td>iii</td> 
     <td>iv</td> 
    </tr> 
</table> 

एक ही अभिव्यक्ति: इस इनपुट पर विचार करें

<td>1</td> 
<td>test</td> 
<td>a</td> 
<td>i</td> 

आप अपने विशिष्ट तालिका संरचना के बारे में अधिक पता है, तो आप एक अधिक विशिष्ट अभिव्यक्ति लिख सकते हैं। उदाहरण के लिए, पिछले इनपुट के, इस अभिव्यक्ति:

/table/tr/td[1] 

... केवल सबसे बाहरी तालिका से कोशिकाओं को प्रस्तुत करती है:

<td>1</td> 
<td>a</td> 
<td>i</td> 
+0

क्या है अभिव्यक्ति मुझे लिखने की आवश्यकता होगी यदि मेरे पास वेबलेमेंट है जो पहले से ही पी है प्रश्न में टेबल पर oints? तो, यह tableElement.findElement (By.xpath ("...") की तरह कुछ होगा) धन्यवाद, - डेव – Dave

+0

@ डेव - उस स्थिति में शायद यह '/ tr/td [1]' या '// टीडी [1] ', तालिका संरचना –

+0

के आधार पर हाय, दुख की बात है कि उनमें से प्रत्येक अभिव्यक्ति सही परिणाम प्राप्त करने में विफल रही है। मैंने अपनी वेबलेमेंट से तालिका संरचना को शामिल करने के लिए अपनी प्रतिक्रिया संपादित की। हालांकि यह एक गड़बड़ है, मेरा शब्द लें कि पहली अभिव्यक्ति (/ tr/td [1]) कॉल करते समय शून्य तत्व लौटाती है, "अंतिम सूची tds = tableElt.findElements (By.xpath ("/tr/td [1] "));"। दूसरा 238 रिटर्न देता है, जो मेरे एचटीएमएल दस्तावेज़ में प्रत्येक टीडी है, क्योंकि तालिका तत्व के भीतर केवल टीडी के विपरीत है। – Dave

1

प्रत्येक trtd की संख्या के बराबर हैं, तो आप की एक सूची बना सकते हैं सभी td तत्वों .findElements(By.tagName("td")) का उपयोग कर और उस सूची के हर nth तत्व के माध्यम से पुनरावृति जहां n प्रत्येक tr

में td तत्वों की संख्या के बराबर है
+0

मैं इस लड़के के साथ हूँ। कोड इस तरह काम नहीं कर सकता है लेकिन आपको विचार मिलता है। सभी टीडी या टी तत्व प्राप्त करें और अपने जावा कोड में उनके साथ काम करें जो xpath के विपरीत काफी तेज है। – hennr

0

आप पहले से ही है, तो एक WebElement के रूप में जमा की मेज तो तुम सब करने की जरूरत है, जैसे आप WebDriver WebElement पार्स है।

//The first part is just a reference for others to see the table element being caught 
WebElement TableElement = driver.findElement(By.tagName("table")); 

यह टीडी तत्वों की सूची बनाएगा (जो विशिष्ट तत्व आप चाहते हैं xPath धीमी पक्ष पर एक छोटे से हो जाता है के रूप में आप तत्व और राज्य के रिश्तेदार xPath निर्दिष्ट कर सकते हैं आप xpath का उपयोग करना चाहिए इसलिए यदि आप एक बड़े पृष्ठ को पार्स कर रहे हैं आप CssSelector साथ जाना चाहते हो सकता है: पहले की-प्रकार

List<WebElement> FirstColumns = TableElement.findElements(By.xPath("//tr/td[1]")); 
6
// This returns 238 td's (I think that's everything in my document)    
    final List<WebElement> tds = tableElt.findElements(By.xpath("//td[1]")); 

यह ठीक प्रति thw XPath W3c युक्ति के रूप में है और मीटर में से एक है XPath में अक्सर पूछे जाने वाले प्रश्न।

// छद्म-ऑपरेटर की प्राथमिकता (प्राथमिकता) [] ऑपरेटर की तुलना में कम है।

इसलिए, //SomeName[1]SomeName नामक सभी तत्वों का चयन करता है जो पहले SomeName उनके माता-पिता के बच्चे हैं - और ऐसे कई तत्व हो सकते हैं।

(//SomeName)[1] 

इस मामले में आप केवल एक दिया की पहली td वंशज हैं:

आप XML दस्तावेज में 1 SomeName तत्व का चयन करना चाहते हैं, तो आप स्पष्ट रूप से कोष्ठक का उपयोग कर डिफ़ॉल्ट ऑपरेटर पूर्वता ओवरराइड करने के लिए की जरूरत है तत्व - इसलिए उपर्युक्त सुधार के अतिरिक्त, आपको अपनी अभिव्यक्ति को रिश्तेदार - पूर्ण नहीं होना चाहिए। एक पूर्ण XPath अभिव्यक्ति (/ से शुरू होने पर हमेशा मूल्यांकन किया जाता है क्योंकि अतिरिक्त संदर्भ दस्तावेज़ नोड को नोड करता है)।

उपयोग:

(.//td)[1] 

आपके द्वारा चयनित वर्तमान नोड के सभी td वंश की जरूरत है, तो का उपयोग करें:

.//td 

और भी बेहतर:

.//descendant::td 
+0

यह अब तक का सबसे नज़दीकी उत्तर है। भाव (।// टीडी) [1] पहले कॉलम में सभी कोशिकाओं के विपरीत, पहले टीडी सेल को लौटाता है, जो मैं चाहता हूं। धन्यवाद, - – Dave

+0

@Dave: ओह, तो बस का उपयोग करें: '.// td' –

+0

@Dave: मैं अपनी टिप्पणी के लिए मेरा जवाब के साथ मेरा उत्तर अपडेट किया गया। –

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