2011-06-23 21 views
5

मैं अपेक्षाकृत सरल कार्य करने की कोशिश कर रहा हूं: एक पृष्ठ रीडायरेक्ट पूरा होने तक प्रतीक्षा करने के लिए। बस देखा गया another विषय पर सवाल का जवाब दिया, जहां एक सलाह है कि बाद वाले पृष्ठ पर किसी विशेष पाठ के लिए प्रतीक्षा करें (अगर मुझे यह सही हो गया है)। यदि हां, तो window.location तक प्रतीक्षा करने के बारे में कैसे बदला जाएगा? क्या यह बेहतर है? और भी बुरा? कम लागू? कोई अन्य विचार? सिर्फ उत्सुक, यदि आवश्यक हो, तो इस प्रश्न को एक समुदाय विकी के रूप में चिह्नित कर सकते हैं।सेलेनियम में एक पृष्ठ रीडायरेक्ट के लिए कैसे प्रतीक्षा करें?

धन्यवाद!

उत्तर

1

मूल्य की निगरानी, ​​driver.get_location वापस लौटा मेरे लिए पूरी तरह से काम किया। जाहिर है, कोड में चिपकने वाले मेरे 5 मिनट में जो मैंने समझा है, वह है कि window.location.href मूल्य की निगरानी हुड के नीचे की जाती है।

+4

क्या आप मूल्य की निगरानी कैसे कर सकते हैं इस पर कुछ और बता सकते हैं? – emery

+0

क्या आप इसे विस्तृत कर सकते हैं –

1

हाँ सेलेनियम का उपयोग करते समय मुझे कई बार इस समस्या का सामना करना पड़ा है। इस समस्या के आसपास मैंने 2 तरीके काम किए हैं। सबसे पहले आप वास्तव में निहित प्रतीक्षा समय बदल सकते हैं।

Actions builder = new Actions(driver); 
builder.click(driver.findElement(By.className("lala"))).perform(); 

इस कोड को अगर बात यह कहा जाता है पर कोई तत्व "लाला" वर्ग मिलान करने के लिए पाया जा सकता है कर रहे हैं एक अपवाद फेंक देगा: उदाहरण के लिए कोड के इस टुकड़े दिए गए। आप इस अंतर्निहित प्रतीक्षा समय को बदल सकते हैं:

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

यह ड्राइवर को सीधे विफल होने की बजाय 5 सेकंड के लिए मतदान करता है। यदि तत्व अभी भी 5 सेकंड के बाद स्थित नहीं हो सकता है तो कार्रवाई विफल हो जाएगी। बेशक आप उस सेटिंग को बदल सकते हैं। मैंने पाया कि यह विधि अधिकांश समय ठीक काम करती है। अधिकांश समय आप पूरे पेज लोडिंग की परवाह नहीं करते हैं, बस एक निश्चित हिस्सा।

मैं भी एक और समारोह जो GetElementByClassAndText है जो एक तत्व पर निहित इंतजार के रूप में ही करना होगा लिखा था सिवाय यह भी युक्त पाठ की जाँच करता है और साथ ही बेहतर आप क्या चाहते हैं की अनुमति देने के लिए ब्यौरा:

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

    for(WebElement e : driver.findElements(by)) { 
     if(e.getText().equals(text)) { 
      Actions builder = new Actions(driver); 
      builder.click(e).perform(); 
      return; 
     } 
    } 
} 

और इसी समारोह का उपयोग करता है:

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

मुझे सच में यकीन नहीं है कि यह प्रश्न का उत्तर देता है: क्या आपके कोड लागू होने वाली रणनीति के प्रकार का उपयोग करने के बजाय विंडो में स्थान परिवर्तन की आवश्यकता है? – emery

-3

आप इस फ़ंक्शन का उपयोग कर सकते हैं, यह वर्तमान पृष्ठ को फिर से लोड करेगा (रीडायरेक्ट किए जाने के बाद): driver.getCurrentUrl();

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