2012-09-07 7 views
125

मैं सेलेनियम (पाइथन इंटरफेस का उपयोग करके, और कई ब्राउज़रों में) के साथ एक जटिल जावास्क्रिप्ट इंटरफेस का परीक्षण करने की कोशिश कर रहा हूं।मैं उस तत्व को कैसे ढूंढूं जिसमें सेलेनियम वेबड्राइवर (पायथन) में विशिष्ट टेक्स्ट शामिल है?

<div>My Button</div> 

मैं "मेरा बटन" आधारित बटन के लिए खोज करने के लिए (या समर्थ गैर केस-संवेदी होना चाहते हैं, इस तरह के "मेरे बटन" के रूप में आंशिक मिलान मैं फार्म के बटन की एक संख्या है या "बटन")

मुझे यह आश्चर्यजनक मुश्किल मिल रही है, जिस हद तक मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रही है। अब तक की सबसे अच्छी बात यह है कि:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]') 

हालांकि यह मामला संवेदनशील है। दूसरी चीज मैंने कोशिश की है पृष्ठ पर सभी divs के माध्यम से, और element.text संपत्ति की जांच कर रहा है।

<div class="outer"><div class="inner">My Button</div></div> 

div.outer भी पाठ के रूप में "मेरे बटन" है: हालांकि, हर बार जब आप फार्म की एक स्थिति मिलता है। इसे ठीक करने के लिए, मैंने यह देखने की कोशिश की है कि div.outer div.inner का अभिभावक है, लेकिन यह नहीं पता कि यह कैसे करें (element.get_element_by_xpath ('..') किसी तत्व के माता-पिता को लौटाता है, लेकिन यह परीक्षण div.outer के बराबर नहीं है)। साथ ही, पृष्ठ पर मौजूद सभी तत्वों के माध्यम से कम से कम क्रोम वेबड्राइवर का उपयोग करके, वास्तव में धीमा प्रतीत होता है।

विचार?

संपादित करें: यह प्रश्न थोड़ा अस्पष्ट आया। यह पूछने पर (और जवाब) एक अधिक विशिष्ट संस्करण यहाँ: How to get text of an element in Selenium WebDriver (via the Python api) without including child element text?

+0

वर्तमान जवाब मेरे लिए काम नहीं किया। इसने किया: http://sqa.stackexchange.com/a/2486 – alejandro

उत्तर

19

आप एक xpath तरह की कोशिश कर सकते:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text) 
+0

धन्यवाद ... ताकि आंतरिक को आंतरिक से अलग करने में मदद मिलती है, लेकिन वास्तव में यह xpath के साथ ठीक काम करता है, मुझे केवल सभी divs के माध्यम से यह समस्या होती है। Xpath के साथ मेरी समस्या यह है कि मैं यह समझ नहीं सकता कि इसे केस-असंवेदनशील कैसे बनाया जाए? – josh

+1

xpath 2.0 में लोअर-केस फ़ंक्शन है, इसलिए यह काम करना चाहिए: '// div [इसमें शामिल है (लोअर-केस (टेक्स्ट()), "{0}")]। प्रारूप (टेक्स्ट) – andrean

+0

धन्यवाद! हालांकि, मेरी समझ यह है कि xpath 2.0 प्रमुख ब्राउज़रों में समर्थित नहीं है ... – josh

162

निम्नलिखित का प्रयास करें:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]") 
+1

के लिए एक आधुनिक प्रतिस्थापन उत्तर के लिए धन्यवाद, यह मैं क्या जरूरत का 50% था (मिला मुझे शुरू कर दिया)। जिस रूप में मैं आया वह यह है "(// * [इसमें (टेक्स्ट(), '" + टेक्स्ट + "')] // // [@ value = '" + text + "']]" यह खोज करेगा दिए गए पाठ न केवल तत्व नोड्स के अंदर, बल्कि इनपुट तत्वों के अंदर भी जिनके पाठ को 'मान' विशेषता यानी <बटन मूल्य = "मेरा बटन" /> के माध्यम से सेट किया गया था। हालांकि ध्यान दें, मूल्य केवल सख्त मिलान होना चाहिए, न कि टेक्स्ट को शामिल करें। –

+7

इसके अलावा अन्य खोज इंजन आगंतुकों के लिए उल्लेख के लायक: यदि आप एक कड़ी के लिए देख रहे हैं, वहाँ 'find_element (रों) _by_link_text' और' find_element (रों) _by_partial_link_text' तरीकों –

+2

क्या होगा अगर पाठ गतिशील है कर रहे हैं? यही है, उद्धरण हो सकता है। क्या वह इस समाधान को तोड़ नहीं देगा? – IcedDante

-12

इस प्रयास करें। यह बहुत आसान है:

driver.getPageSource().contains("text to search"); 

यह वास्तव में सेलेनियम वेब ड्राइवर में मेरे लिए काम करता है।

+6

यदि पाठ जावास्क्रिप्ट द्वारा उत्पन्न होता है तो यह काम नहीं करता है। – palacsint

+2

यह जांचने का एक बहुत ही तरीका है, क्योंकि आप तार पर पृष्ठ की पूरी सामग्री को स्थानांतरित कर रहे हैं। बहुत छोटे पृष्ठों के लिए यह स्वीकार्य है लेकिन बहुत बड़े पृष्ठों के लिए आप फ़ाइल की सभी सामग्री को स्थानांतरित कर रहे हैं और सर्वर की तरफ देख रहे हैं। Xpath, जावास्क्रिप्ट या सीएसएस के साथ क्लाइंट पक्ष पर ऐसा करने का एक बेहतर तरीका होगा। –

+0

मुझे लगता है कि ब्राउज़र के लिए पूरे पेज स्रोत को तार पर स्थानांतरित करने की आवश्यकता होगी? –

3

तुम भी साथ पृष्ठ वस्तु पैटर्न इसका इस्तेमाल कर सकते हैं, उदाहरण के लिए:

इस कोड का प्रयास करें:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]") 
WebElement buttonBestChoice; 
1
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText"); 
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere"));