2011-06-16 20 views
7

फ़ायरफ़ॉक्स ड्रायवर के साथ सेलेनियम 2.0b3 जावा एपीआई वाले बटन पर क्लिक करते समय मुझे कोई समस्या है। बटन पर क्लिक करने से वेबसर्वर को एक फॉर्म भेजता है और फिर फॉर्म जमा करने के परिणामस्वरूप ब्राउजर एक नए पेज पर जाता है।सेलेनियम 2: पृष्ठ लोड को बाधित करें

element.click() के साथ किसी तत्व पर क्लिक करते समय, सेलेनियम ब्राउज़र के संचालन को पूरा करने का इंतजार कर रहा है। ब्राउज़र लोड होने तक ब्राउज़र प्रतीक्षा करता है। लेकिन, कभी-कभी पृष्ठ लोड कुछ विज्ञापन अनुरोधों के कारण बहुत अधिक समय लेता है।

element.click() और पृष्ठ लोड के बीच सिंक्रनाइज़ेशन के आसपास कैसे काम करें?

संपादित करें:

रूप WebElement javadoc में विस्तार से बताया:

इस तत्व पर क्लिक करें। यदि यह नया पृष्ठ लोड करने का कारण बनता है, तो यह विधि पृष्ठ लोड होने तक ब्लॉक होगी।

धन्यवाद

उत्तर

1

driver.get() वास्तव में जब तक पेज लोड हो जाए, ब्लॉक करने के लिए माना जाता है। हालांकि कभी-कभी यह उदाहरण के लिए नहीं है यदि मुख्य HTML लोड होने के बाद जावास्क्रिप्ट लोड हो रहा है। इस मामले में आपको कभी-कभी उन तत्वों पर क्लिक करने में समस्याएं आती हैं जो अभी तक दिखाई नहीं दे रही हैं। आप WebDriverWait() का उपयोग कर सकते प्रतीक्षा करने के लिए तत्व दिखाई देते हैं या साथ अंतर्निहित प्रतीक्षा समय को बढ़ाने के लिए के लिए:

public void waitAndClick(WebDriver driver, By by) { 
    WebDriverWait wait = new WebDriverWait(driver, 10000); 
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by); 
    wait.until(waitForElement); 

    Actions builder = new Actions(driver); 
    builder.click(driver.findElement(by)).perform(); 
} 

और waitForElement वर्ग:

driver.manage().timeouts().implicitlyWait(X, TimeUnit.SECONDS); 

यहाँ बराबर का उपयोग कर WebDriverWait है

public class waitForElement implements Function<WebDriver, Boolean> { 
    private final By by; 

    private String text = null; 

    public waitForElement(By by) { 
     this.by = by; 
    } 

    public waitForElement(By by, String text) { 
     this.by = by; 
     this.text = text; 
    } 

    @Override 
    public Boolean apply(WebDriver from) { 
     if (this.text != null) { 
      for (WebElement e : from.findElements(this.by)) { 
       if (e.getText().equals(this.text)) { 
        return Boolean.TRUE; 
       } 
      } 

      return Boolean.FALSE; 
     } else { 
      try { 
       from.findElement(this.by); 
      } catch (Exception e) { 
       return Boolean.FALSE; 
      } 

      return Boolean.TRUE; 
     } 
    } 
} 
+0

माइक, मैंने सवाल संपादित किया। समस्या निहित प्रतीक्षा नहीं है। मैं प्रकट होने के लिए एक तत्व के लिए प्रतीक्षा नहीं कर रहा हूँ। मैं एक तत्व पर क्लिक कर रहा हूं और केवल तभी एक पृष्ठ लोड होता है। वह भार मुझे परेशान कर रहा है क्योंकि मेरे परीक्षण के लिए बेकार तत्वों को लोड करने में पूरा होना लंबा हो सकता है। – djondal

+0

मुझे एसिंक्रोनस प्राप्त करने के तरीके के बारे में पता नहीं है()। आप इसे आसानी से कर सकते हैं हालांकि प्राप्त करने के लिए एक नया धागा लॉन्च करके() –

0

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

protected static void maybeAsyncClick(WebElement element, WebDriver driver) 
{ 
    Actions builder = new Actions(driver); 
    Action newClick = builder.moveToElement(element) 
          .click() 
          .build(); 
    newClick.perform(); 
} 
2

firefoxdriver विकि पृष्ठ के अंतिम खंड में सूचीबद्ध केवल Firefox के लिए बीटा सुविधा आज़माएं http://code.google.com/p/selenium/wiki/FirefoxDriver

आपको कम से कम संस्करण 2.9, मैं नवीनतम 2.18 (2.0b3 के साथ जा रहा करने की अनुशंसा की आवश्यकता होगी लगभग एक साल पुराना अब!)

+0

यह एक आकर्षण की तरह काम करता है! मैंने इसे लगभग 30 सेकंड तक इंतजार किया (एक तेज इंटरनेट कनेक्शन के लिए पर्याप्त होना चाहिए) और यह लगी तत्वों के इंतजार किए बिना आगे बढ़ने में सक्षम था। आपके लिए +1 महोदय – samxli

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