2014-07-25 7 views
5

पर काम नहीं कर रहा है, तो मैं एक स्क्रिप्ट तैयार कर रहा हूं जिसमें एक रिकॉर्ड खोजना और फिर रिकॉर्ड अपडेट करना शामिल है। खोज स्क्रीन पर, उपयोगकर्ता के पास उन्नत खोज विकल्प देखने का विकल्प होता है। उन्नत खोज को दिखाने या छिपाने के लिए टॉगल करने के लिए एक बटन द्वारा नियंत्रित किया जाता है।सेलेनियम वेबड्राइवर - isDisplayed() का उपयोग कर रहा है यदि कथन

जब उन्नत खोज img src छिपा हुआ है "/ शैलियाँ/_Images साथ समाप्त होता है:

<a title="Searches" href="javascript:expandFilters()"><img border="0" align="absmiddle" alt="Advanced" src="****MASKED URL****"></a> 

खोज बटन जब यह दिखा या उन्नत खोज छिपा है के गुणों के बीच फर्क सिर्फ इतना है img src है /advanced_button.jpg ", जब उन्नत खोज दिखाई दे रही है, तो IMG src" /Styles/_Images/basic_button.png "

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

<input type="text" value="" maxlength="30" size="30" name="guiSystemID"> 

यदि बयान क्षेत्रों है कि मैं में डेटा दर्ज करने की आवश्यकता के लिए लग रहा है, और अगर क्षेत्र तो मौजूद नहीं है कि संकेत मिलता है कि उन्नत विकल्प मैं बटन पर क्लिक करें विस्तार करने के लिए की जरूरत दिखाई नहीं देते हैं खोज विकल्प

मैंने निम्नलिखित IF कथन बनाया है।

 if (!driver.findElement(By.name("guiSystemID")).isDisplayed()) { 
     driver.findElement(By.cssSelector("img[alt='Advanced']")).click(); 
    } 

जब मैं स्क्रिप्ट चलाता हूं और उन्नत खोज का विस्तार होता है तो स्क्रिप्ट सफलतापूर्वक चलती है। हालांकि, जब मैं स्क्रिप्ट चलाता हूं और उन्नत खोज का विस्तार नहीं होता है, तो स्क्रिप्ट विफल हो जाती है, मुझे सलाह दी जाती है कि यह ऑब्जेक्ट "guiSystemID" नहीं ढूंढ सका। यह निराशाजनक है क्योंकि अगर इसे नहीं मिल रहा है तो मैं स्क्रिप्ट जारी रखना चाहता हूं, IF कथन के सही रास्ते में प्रवेश करना चाहता हूं।

क्या किसी को इस बारे में कोई सुझाव मिला है कि यदि फ़ील्ड स्क्रिप्ट विफल होने के बिना दिखाई दे रहा है तो मैं और कैसे मूल्यांकन कर सकता हूं क्योंकि यह फ़ील्ड नहीं ढूंढ सकता है।

अग्रिम धन्यवाद

साइमन

उत्तर

15

मुझे इसका जवाब देने में देर हो सकती है, लेकिन यह किसी और की तलाश में मदद कर सकती है।

मुझे हाल ही में एक ही समस्या का सामना करना पड़ा है जिसमें प्रदर्शन किया गया है()। मेरे कोड इस

if(driver.findElement(By.xpath(noRecordId)).isDisplayed())                           
{   
    /**Do this*/  
}  
else  
{  
    /**Do this*/  
} 

की तरह कुछ इस कोड को बहुत अच्छी तरह से काम करता है जब तत्व यह है कि isDisplayed खोजने की कोशिश कर रहा है मौजूद है था। लेकिन जब तत्व अनुपस्थित है, तो वह इसकी तलाश जारी रखता है और इसलिए अपवाद "नोशच एलिमेंटफाउंड" फेंकता है। तो ऐसा कोई रास्ता नहीं था कि मैं दूसरे भाग का परीक्षण कर सकूं।

मैंने इस के साथ काम करने का एक तरीका निकाला ({if, else} के आस-पास की कोशिश करें और पकड़ने के ब्लॉक के साथ, इस तरह कुछ कहें।

public void deleteSubVar() throws Exception 
{   
    try 
    {  
    if(driver.findElement(By.xpath(noRecordId)).isDisplayed())  
    {  
     /**when the element is found do this*/  
    }  
    }  
    catch(Exception e)  
    {  
    /**include the else part here*/  
    }  
}   

आशा इस मदद करता है :)

+0

धन्यवाद .... इससे मेरी मदद की। –

+0

काफी मददगार! धन्यवाद – Deep

+0

यह समाधान मेरे लिए काम किया। धन्यवाद। – Automationtested

2

मैंने पहले भी .isDisplayed() के साथ मिश्रित परिणाम मिला है। चूंकि डीओएम पर तत्व छिपाने के लिए कई विधियां हैं, इसलिए मुझे लगता है कि यह एक लचीलापन मुद्दा है जो डिस्प्लेड() के साथ उबलता है। मैं इसके अपने समाधान के साथ आना चाहता हूं। मैं कुछ चीजें साझा करूंगा जो मैं करता हूं, फिर अपने परिदृश्य के लिए सिफारिश करें।

जब तक मेरे पास कुछ विशिष्ट नहीं है, तो मैं एक रैपर विधि का उपयोग करता हूं जो दृश्यता के लिए कई चेक करता है। यहां अवधारणा है, मैं आपको वास्तविक कार्यान्वयन दृष्टिकोण छोड़ दूंगा। यहां सामान्य उदाहरणों के लिए, बस "लोकेटर" मान लें कि आपकी चुनी गई विधि (सीएसएस, XPath, नाम, आईडी, आदि) है।

पहला, और सबसे आसान जांच यह देखने के लिए है कि तत्व डोम पर मौजूद है या नहीं। यदि यह मौजूद नहीं है, तो यह निश्चित रूप से दिखाई नहीं दे रहा है।

boolean isPresent = driver.findElements(locator).size() > 0; 

फिर, यह है कि अगर सच देता है, मैं तत्व के आयामों की जांच करेंगे:

Dimension d = driver.findElement(locator).getSize(); 
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0); 

अब, आयाम, समय पर, एक झूठी सकारात्मक है, तो तत्व वास्तव में करता है लौट सकते हैं ऊंचाई और चौड़ाई शून्य से अधिक है, लेकिन, उदाहरण के लिए, एक और तत्व लक्ष्य तत्व को कवर करता है, जिससे इसे पृष्ठ पर छिपाया जाता है (कम से कम, मुझे अतीत में कुछ बार सामना करना पड़ता है)। तो, एक अंतिम जाँच (यदि आयाम की जांच सही रिटर्न) के रूप में, मैं तत्व की शैली विशेषता (यदि कोई परिभाषित किया गया है) को देखो और तदनुसार एक बूलियन का मान सेट:

String elementStyle = driver.findElement(locator).getAttribute("style"); 
boolean isVisible = !(elementStyle.equals("display: none;") || elementStyle.equals("visibility: hidden;")); 

के लिए कार्य करते हैं तत्व दृश्यता परिदृश्यों में से अधिकांश का सामना करना पड़ता है, लेकिन ऐसे समय होते हैं जहां आपका फ्रंट एंड देव कुछ अलग करता है जिसे स्वयं ही संभाला जाना चाहिए।

एक आसान परिदृश्य तब होता है जब एक सीएसएस क्लास होता है जो तत्व दृश्यता को परिभाषित करता है। इसे कुछ भी नामित किया जा सकता है, इसलिए आइए हम "छुपे हुए" मान लें जो हमें देखने की ज़रूरत है। इस मामले में, 'क्लास' विशेषता का एक सरल जांच उपयुक्त परिणाम चाहिए (यदि ऊपर तरीकों में से किसी भी ऐसा करने के लिए असफल): अपनी स्थिति के अनुसार अब

boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden"); 

,, जानकारी आप 'के आधार पर मैंने ऊपर दिया है, मैं "src" विशेषता के मूल्यांकन के आधार पर एक बूलियन मान सेट करने की अनुशंसा करता हूं। यह ऊपर की सीएसएस कक्षा की जांच के लिए एक समान दृष्टिकोण होगा, लेकिन थोड़ा अलग संदर्भ में उपयोग किया जाता है, क्योंकि हम जानते हैं कि दोनों राज्यों के बीच वास्तव में क्या विशेषता बदलती है। ध्यान दें कि यह केवल इस फैशन में काम करेगा यदि तत्व के दो राज्य हैं (उन्नत और मूल, जैसा आपने नोट किया है)। यदि अधिक राज्य हैं, तो मैं एक enum मूल्य या कुछ की तरह स्थापित करने के लिए देखता हूँ। तो, तत्व संभालने का प्रतिनिधित्व करता है या तो उन्नत या मूल:

boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg"); 

इन तरीकों में से किसी से, एक बार आप अपने बूलियन मान है, तो आप अपने यदि/तो तर्क के हिसाब से शुरू कर सकते हैं।

इस के साथ लंबे समय तक घुमाने के लिए मेरी माफ़ी, लेकिन उम्मीद है कि यह आपको सही रास्ते पर लाने में मदद करता है।

+2

जबकि मैं आपके साथ "अजीबता" पर सहमत हूं जो 'प्रदर्शन किया गया है' ला सकता है, आप वास्तव में जो कुछ भी कर रहे हैं, वास्तव में नकल कर रहे हैं। सेलेनियम सभी के बाद खुला स्रोत है, जेएस कोड जीवन का उपयोग करता है [यहां] (https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L557)। यह वही काम करता है जैसा आप कर रहे हैं (यानी ऊंचाई और चौड़ाई, प्रदर्शन शैलियों आदि की जांच)। आप WebDriver spec भी देख सकते हैं जहां यह [इन चरणों का विवरण] (http://www.w3.org/TR/webdriver/#determining-visibility)। निजी तौर पर, यह वहां आने के लिए नीचे आता है "इसे आकार देने का एक आकार" नहीं होता है। – Arran

1

कोशिश पकड़ने का प्रयोग का उपयोग किए बिना isdisplayed() यदि शर्त के रूप में प्रयोग किया जाता है, एक कोड के नीचे लिख सकते हैं का उद्देश्य खारिज कर देता है "अगर"

try{ 
driver.findElement(By.xpath(noRecordId)).isDisplayed(); 
//Put then statements here 
    } 
Catch(Exception e) 
{//put else statement here.} 
-2

isDisplayed() बूलियन विधि है यानी, यह सच या गलत देता है। असल में इस विधि का उपयोग यह पता लगाने के लिए किया जाता है कि तत्व वेब पेज पर प्रदर्शित किया जा रहा है या नहीं।

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