2012-03-26 15 views
14

मैं वेब अनुप्रयोगों का परीक्षण करने के लिए स्वचालित स्क्रिप्ट लिखता हूं जो AJAX पर बहुत भारी हैं। उदाहरण के लिए, सेटिंग्स को सहेजते समय "Saving..." टेक्स्ट के साथ एक मोडल संवाद प्रदर्शित होता है, जबकि एक लाइटबॉक्स शेष पृष्ठ को बाहर करता है।सेलेनियम वेबड्राइवर - यह निर्धारित करें कि क्या तत्व क्लिक करने योग्य है (यानी डोजो मोडल लाइटबॉक्स द्वारा अस्पष्ट नहीं)

मेरी टेस्ट स्क्रिप्ट संदेश गायब होने से पहले परीक्षण में अगले लिंक पर क्लिक करने की कोशिश कर रहे हैं।

Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (99.5, 118.5). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" dojoattachpoint="node" id="lfn10Dijit_freedom_widget_common_environment_Dialog_8_underlay" style="width: 1034px; height: 1025px; "></div> (WARNING: The server did not provide any stacktrace information) 

यह इसलिए होता है क्योंकि लाइटबॉक्स तत्व मैं पर क्लिक करें अस्पष्ट बना रहा है: यह लगभग हमेशा जब Firefox ड्राइविंग, लेकिन जब क्रोम ड्राइविंग निम्न त्रुटि प्रदर्शित किया जाता है काम करता है। मैं लिंक पर क्लिक करने से पहले लाइटबॉक्स गायब होने का इंतजार करना चाहता हूं।

लाइटबॉक्स के लिए अब मौजूद नहीं है, यह वैध कामकाज नहीं है क्योंकि कभी-कभी, मोडल संवाद और लाइटबॉक्स के कई स्तर होते हैं, और उनके बीच अंतर करने का कोई आसान तरीका नहीं होता है।

क्या सेलेनियम में यह पता लगाने का कोई तरीका है कि तत्व क्लिक करने योग्य है (कोई अन्य तत्व इसे अस्पष्ट नहीं करता है)? एक कोशिश/पकड़ एक कामकाज होगा, लेकिन अगर यह संभव है तो मैं उचित जांच करना पसंद करूंगा।

उत्तर

18

WebDriverWait स्थितियों का उपयोग करें। अपने तत्व क्लिक किया जा करने में सक्षम होने के लिए

WebDriverWait wait = new WebDriverWait(yourWebDriver, 5); 
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//xpath_to_element"))); 

Webdriver 5 सेकंड के लिए इंतजार करेंगे।

+14

पिछली बार मैंने क्रोम के साथ इसे करने की कोशिश यह काम नहीं किया: "क्लिक करने योग्य" शर्त पूरी होने मैं कोशिश() पकड़() आप कोड द्वारा इसे बनाया क्लिक को अवरुद्ध करने वाली अन्य परतें होने के बावजूद। – anttix

+3

फ़ायरफ़ॉक्स 20, सेलेनियम-फ़ायरफ़ॉक्स-ड्राइवर 2.31.0 के साथ काम नहीं कर रहा है। जब तत्व एक मॉडल संवाद – skong

+0

द्वारा अवरोधित किया जाता है तो elementToBeClickable वापस सही होता है 2.31 के रिलीज़ नोट्स में फ़ायरफ़ॉक्स 20 के बारे में कुछ भी नहीं है। क्या यह फ़ायरफ़ॉक्स 1 9 में काम करता है? –

2

आप जब तक तत्व एक टाइमआउट के साथ क्लिक करने योग्य है कि एक WebDriver प्रतीक्षा करता है एक clickUntil समारोह/विधि बना सकते हैं। यह तत्व पर क्लिक करने का प्रयास करेगा, और जब तक यह क्लिक या समय समाप्त नहीं हो जाता है, तब तक "एलिमेंट क्लिक करने योग्य नहीं" त्रुटि संदेश फेंक देगा।

यह सुनिश्चित नहीं है कि डोजो में इसे कैसे लिखना है, लेकिन यह एक विचार है।

6

आप ExpectedConditions.invisibilityOfElementLocated(By by) तरीका है जिसके इंतजार कर रहा है जब तक तत्व या तो अदृश्य या डोम पर मौजूद नहीं है का उपयोग कर सकते हैं।

WebDriverWait wait = new WebDriverWait(yourWebDriver, 10); 
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("yourSavingModalDialogDiv"))); 

तो, पर कितना समय अपने मॉडल संवाद अदृश्य या डोम बंद होने के लिए ले जाता है निर्भर करता है, webdriver इंतजार करेंगे। प्रतीक्षा अधिकतम 10 सेकंड के लिए है।

0

स्काला में:

  1. इंतजार कर (दृश्यता/अदर्शन) लॉग में

    (new WebDriverWait(remote, 45)).until(
        ExpectedConditions.visibilityOf(remote.findElement(locator)) 
    ) 
    Thread.sleep(3000) 
    
  2. अधिक दृश्यता के लिए स्टैंडर्ड कोड:

    while (remote.findElement(locator).isDisplayed) { 
        println(s"isDisplayed: $ii $a : " + remote.findElement(locator).isDisplayed) 
        Thread.sleep(100) 
    } 
    
  3. आप अतुल्यकालिक जावा स्क्रिप्ट प्रक्रियाओं है टाइमस्टैम्प के साथ वेब-तत्वों का उपयोग करें:

    val oldtimestamp = remote.findElements(locator).get(0).getAttribute("data-time-stamp") 
    
    while (oldtimestamp == remote.findElements(locator).get(0).getAttribute("data-time-stamp")) { 
        println("Tstamp2:" + remote.findElements(locator).get(0).getAttribute("data-time-stamp")) 
        Thread.sleep(200) 
    } 
    
0

मैं भी यही समस्या है, लेकिन मैं साइट में कई इनपुट का परीक्षण किया। एक क्लिक करने योग्य है जिसे मैंने परीक्षण किया और अन्य - क्लिक करने योग्य नहीं बस एक छोड़ दिया।

for(){ // for all my input 
try { 
    driver.findElement(By.xpath("...." 
           + "//input)["+(i+1)+"]")).click(); 

    ... tests... 


} catch(Exception e) { 
    if(e.getMessage().contains("is not clickable at point")) { 

      System.out.println(driver.findElement(By.xpath(locator)). 
      getAttribute("name")+" are not clicable"); 
    } else { 
      System.err.println(e.getMessage()); 
    } 
} 

और अधिक सुरुचिपूर्ण:

@SuppressWarnings("finally") 
     public boolean tryClick(WebDriver driver,String locator, locatorMethods m) { 

      boolean result = false; 
      switch (m) { 

      case xpath: 
      try { 
       driver.findElement(By.xpath(locator)).click(); 
       result= true; 
      } catch (Exception e) { 
        if(e.getMessage().contains("is not clickable at point")) { 
         System.out.println(driver.findElement(By.xpath(locator)).getAttribute("name")+" are not clicable"); 
        } else { 
         System.err.println(e.getMessage()); 
        } 
      } finally { 
       break; 
      } 
     case id: 
      try { 
       driver.findElement(By.id(locator)).click(); 
       return true; 
      } catch (Exception e) { 
       if(e.getMessage().contains("is not clickable at point")) { 
        System.out.println(driver.findElement(By.id(locator)).getAttribute("name")+" are not clicable"); 
       } else { 
        System.err.println(e.getMessage()); 
       } 
      } finally { 
       break; 
      } 

      default: 
       System.err.println("Unknown locator!"); 

     } 
      return result; 
    } 
संबंधित मुद्दे