2015-10-26 14 views
8

क्या सेलेनियम के लिए सभी एजेक्स सामग्री लोड होने तक प्रतीक्षा करने के लिए एक सार्वभौमिक दृष्टिकोण है? (एक विशिष्ट वेबसाइट से बंधा नहीं - तो यह हर ajax वेबसाइट के लिए काम करता है)सेलेनियम अजाक्स सामग्री को लोड करने के लिए प्रतीक्षा करें - सार्वभौमिक दृष्टिकोण

उत्तर

14

आपको लोडिंग समाप्त करने के लिए जावास्क्रिप्ट और jQuery की प्रतीक्षा करनी होगी। jQuery.active0 और document.readyStatecomplete है, जिसका अर्थ है कि जेएस और jQuery लोड पूरा हो गया है, यह जांचने के लिए जावास्क्रिप्ट निष्पादित करें।

public boolean waitForJSandJQueryToLoad() { 

    WebDriverWait wait = new WebDriverWait(driver, 30); 

    // wait for jQuery to load 
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
     try { 
      return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0); 
     } 
     catch (Exception e) { 
      // no jQuery present 
      return true; 
     } 
     } 
    }; 

    // wait for Javascript to load 
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
     return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState") 
     .toString().equals("complete"); 
     } 
    }; 

    return wait.until(jQueryLoad) && wait.until(jsLoad); 
} 
+0

धन्यवाद :) क्या यह प्रत्येक वेबसाइट या केवल jQuery का उपयोग कर वेबसाइटों के साथ काम करेगा? –

+0

किसी भी वेबसाइट पर काम करेगा, यह Jquery और JS – LINGS

+0

की मौजूदगी और अनुपस्थिति को संभालता है धन्यवाद - मैं अब इसे –

2

के रूप में मार्क कोलिन अपनी पुस्तक "मास्टरिंग सेलेनियम Webdriver", का उपयोग JavascriptExecutor आप एक वेबसाइट jQuery का उपयोग कर AJAX कॉल

बनाने समाप्त हो गया है कि क्या यह पता लगाने जाने में वर्णित
public class AdditionalConditions { 

    public static ExpectedCondition<Boolean> jQueryAJAXCallsHaveCompleted() { 
    return new ExpectedCondition<Boolean>() { 

     @Override 
     public Boolean apply(WebDriver driver) { 
      return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);"); 
     } 
    }; 
    } 
} 
+0

आपके संकेत के लिए धन्यवाद। लेकिन क्या होगा यदि कोई पक्ष jQuery का उपयोग नहीं करता है? –

+0

ठीक है अगर आपके पास अन्य जावास्क्रिप्ट लाइब्रेरी है तो आपको उस पर भरोसा करना होगा। उसी पुस्तक में उनके पास AngularJS के लिए उदाहरण है, अन्यथा मैं एक और उत्तर से सहमत हूं कि आपको डोमेन विशिष्ट होना चाहिए, और [स्पष्ट और लागू वेट्स] का उपयोग करें (http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit -और-निहित-प्रतीक्षा करता है) –

0

मुझे विश्वास नहीं है कि बॉक्स से एक सार्वभौमिक दृष्टिकोण है। मैं आम तौर पर एक विधि बनाता हूं जो .waituntilrowcount(2) या waituntilvisible() करता है जो एक तत्व को चुनाव करता है।

+0

एचएम - dammn। क्या कोई अन्य लाइब्रेरी है जो AJAX वेबसाइटों को क्रॉल करने में सक्षम है? सेलेनियम, एचटीएमएल्यून और क्रॉलजैक्स का प्रयास किया। समस्या htmlunit: त्रुटि के खिलाफ बहुत संवेदनशील है और आप इसे बंद नहीं कर सकते हैं। क्रॉलजैक्स: शायद एजेक्स को क्रॉल करने में सक्षम है लेकिन आपको वेबपृष्ठ का HTML नहीं मिल सकता है - ouch सेलेनियम: प्रश्न देखें;) –

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