2012-03-21 11 views
6

मैं सेलेनियम वेबड्राइवर के लिए नया हूं, शायद यह सवाल स्पष्ट है। मैं इस तरह की स्थिति के बाद हूँ:,वेबड्राइवर का उपयोग यह देखने के लिए कि कोई तत्व अपवाद फेंकने के बिना मौजूद है या नहीं?

driver.findElement(By.id("...."])).click(); 

नहीं तो बाहर निकलने करता है इसे छोड़ और सूचकांक पृष्ठ पर वापस जाने: तत्व मौजूद है

हैं, तो इसे क्लिक करें और सूचकांक पृष्ठ पर वापस जाने। परीक्षण अभी भी बिना किसी अपवाद के चला जाता है।

driver.findElements(By.id("...")).size() != 0 

तो मैं करने की कोशिश की:

if(driver.findElements(By.id("....")).size() > 0) 
    { 
     driver.findElement(By.id("....")).click(); 
     driver.findElement(By.cssSelector("...")).click(); 
    } 
else 
    { 
     driver.findElement(By.cssSelector("....")).click(); 
    } 

यह वास्तव में बदसूरत हालांकि क्योंकि अगर इस बात की पुष्टि करने के लिए 10 तत्वों है, यह अगर हालत होने की जरूरत है पता चला

मैं इस के लिए एक समाधान पता 10 बार लिखा

इसे साफ करने के लिए कोई कामकाज?

उत्तर

1

समाधान कई हो सकता है लेकिन इससे आपके आर्किटेक्चर में बाधा आ सकती है।

  1. locator_keyword:: {मान:

    बस के रूप में तर्क के साथ कुछ उपयोगिता कक्षा में optionalClick() की तरह एक विधि बना सकते हैं या कहीं: आईडी या cssSelector या

    तो सबसे आसान समाधान के रूप में निम्नानुसार हो सकता है xpath आदि}

  2. locator: {मान: "q"}

कदम विधि में:

  1. पर locator_keyword और locator
  2. चेक आधारित तत्व प्राप्त करता है, तो तत्व है और इसे क्लिक करें
  3. अन्यथा कुछ भी

इस विधि इस्तेमाल किया जा सकता मत करो किसी भी प्रकार की वस्तुओं के लिए एक सामान्य प्रकार की चीज़ के रूप में।

+0

प्रतिक्रिया के लिए धन्यवाद !! एक और मुद्दा है, अगर सिंटैक्स बहुत धीमा है ... क्या इसे तेज बनाने का कोई तरीका है? – user1282634

+0

ठीक है तो अगर उस कथन के बजाय सभी कथन का उपयोग न करें तो कोशिश करें/कोशिश करें ब्लॉक को कोशिश करें: {WebElement elemnt = driver.findElement (By.ID ("..")); elemnt.click();} पकड़ें (अपवाद ई) {// कुछ करने के लिए नहीं} – Nayan

+0

इसे मिला ~~ धन्यवाद !! – user1282634

1

लूप के अंदर प्रयास-पकड़ स्थितियों का उपयोग करके अपवाद फेंकने के बिना तत्व ढूंढने के तरीके हैं। उदाहरण के लिए, इस विधि मैंने लिखा (आप के लिए करता है, तो क्या उपयोग पर निर्भर करता है सरल किया जा सकता है) एक WebElement वापस आ जाएगी और यह आप पर यह लौटने से पहले सुनिश्चित करें कि यह क्लिक करने योग्य बनाता है: का उपयोग करने पर सूचक के लिए

public static WebElement getElementByLocator(By locator) { 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    WebElement we = null; 
    boolean unfound = true; 
    int tries = 0; 
    while (unfound && tries < 10) { 
    tries += 1; 
    try { 
     we = driver.findElement(locator); 
     unfound = false; // FOUND IT 
    } catch (StaleElementReferenceException ser) {       
     unfound = true; 
    } catch (NoSuchElementException nse) {       
     unfound = true; 
    } catch (Exception e) { 
     staticlogger.info(e.getMessage()); 
    } 
    } 
    driver.manage().timeouts().implicitlyWait(DEFAULT_IMPLICIT_WAIT, 
     TimeUnit.SECONDS); 
    return we; 
} 
+1

erm किस तरह से अपवादों का उपयोग नहीं कर रहा है ?! –

+0

मैंने कहा "बिना फेंकने", "उपयोग किए बिना" नहीं। – djangofan

0

धन्यवाद findelements। मुझे लगता है कि आपको प्रतीक्षा तर्क की भी आवश्यकता होगी हालांकि यदि आप इसे बहुत जल्दी वापस नहीं करना चाहते हैं।

यहां सी # में मेरा समाधान है।

यह मूल रूप से सेलेनियम लाइब्रेरी में प्रतीक्षा तर्क को दोबारा लागू करता है - दुर्भाग्यवश, जिस तरीके से इंतजार करना पड़ता है (परेशान यह भी rethrows exceptions the wrong way और स्टैक निशान खो देता है!)।

आपको शायद इसे जावा के लिए थोड़ा संशोधित करना होगा - यह सुनिश्चित न करें कि सेलेनियम एपीआई क्या है जब आप केवल फ़ंक्शंस पास नहीं कर सकते हैं।

प्रतीक्षा reimplementation:

private IWebElement WaitAndSeeIf(Func<IWebElement> canGet) 
    { 
     var end = DateTime.Now.AddSeconds(1); 

     IWebElement element; 
     while (true) 
     { 
      element = canGet(); 

      if (element != null) 
       break; 

      var time = DateTime.Now; 
      if (time > end) 
       break; 

      Thread.Sleep(200); 
     } 
     return element; 
    } 

बुला कोड:

 var dashboardButton = WaitAndSeeIf(() => 
               { 
                var elements = Driver.FindElements(By.XPath("//button[contains(.//*,'Dashboard')]")); 
                return elements.Any() ? elements.Single() : null; 
               }); 

अब तक मैं स्थानों (ExtJS आदि में संवाद की उपस्थिति के लिए जाँच) के एक जोड़े में इस उपयोगी पाया है, लेकिन है अभी तक चारों ओर घूमने और इसे विन्यास करने की आवश्यकता थी। मुझे लगता है कि सबसे अच्छी बात यह है कि दूसरे जवाब में उल्लिखित अंतर्निहित प्रतीक्षा समय लेना होगा।

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

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