वेबड्राइवर द्वारा वेब पेज को रीफ्रेश करना जब विशिष्ट स्थिति की प्रतीक्षा कर रहा हो


154

मैं परीक्षण के दौरान वेबपेज को रीफ्रेश करने के लिए अधिक सुरुचिपूर्ण तरीके की तलाश कर रहा हूं (मैं सेलेनियम 2 का उपयोग करता हूं)। मैं सिर्फ F5 कुंजी भेजता हूं लेकिन मुझे आश्चर्य है कि अगर ड्राइवर के पास पूरे वेबपेज को रीफ्रेश करने की विधि है तो यहां मेरा कोड है

    while(driver.findElements(By.xpath("//*[text() = 'READY']")).size() == 0 )
        driver.findElement(By.xpath("//body")).sendKeys(Keys.F5);
        //element appear after text READY is presented      
    driver.findElement(By.cssSelector("div.column a")).click();    

शायद मैन्युअल रूप से ताज़ा किए गए पृष्ठ पर तत्व खोजने के लिए कुछ बेहतर समाधान है

जवाबों:


294

जावा या जावास्क्रिप्ट में:

driver.navigate().refresh();

यह पृष्ठ ताज़ा करना चाहिए।


प्रसन्न! इसने आपकी मदद की। वैकल्पिक रूप से यदि आप विशुद्ध रूप से सेलेनियम RC या एक WebDriverBackedSelenium का उपयोग कर रहे हैं तो आप भी उपयोग कर सकते हैं: selenium.refresh ();
मनप्रीत सिंह

47
यह बिल्कुल F5 दबाने के बराबर नहीं है। driver.navigate().refresh()इसके अनुरोध में हेडर "नो-कैश" कहता है और, परिणामस्वरूप, बिना शर्त सभी सामग्री को पुनः लोड करता है। जबकि F5 दबाने से "इफ़-मोडिफाइड-चूंकि" अनुरोध हो सकता है, जिसे "304 नॉट मॉडिफ़ाइड" प्रतिक्रिया मिल सकती है। यदि आप लोड परीक्षण करते हैं, तो आपको उस अंतर को ध्यान में रखना होगा।
Vsevolod Golovanov

@ मनप्रीत समाधान के लिए धन्यवाद। यह अपवोट के योग्य है।
RNS

75

पायथन में ऐसा करने के लिए एक विधि है driver.refresh():। यह जावा में समान नहीं हो सकता है।

वैकल्पिक रूप से, आप कर सकते हैं driver.get("http://foo.bar");, हालांकि मुझे लगता है कि ताज़ा विधि को ठीक काम करना चाहिए।


1
यदि आप उपयोग कर रहे हैं तो driver.get("http://foo.bar")बस उपयोग कर सकते हैंdriver.get(driver.current_url)
मैट एम।


21

सेलेनियम वेबड्राइवर का उपयोग करके वेबपेज को रीफ्रेश करने के 5 अलग-अलग तरीके

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

  1. SendKeys.Keys विधि का उपयोग करना

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. नेविगेट का उपयोग कर रहे हैं। सर्फ़ेश () विधि

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. नेविगेट (।) विधि का उपयोग करना

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. का उपयोग कर () विधि

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. SendKeys () पद्धति का उपयोग करना

    driver.get("https://accounts.google.com/SignUp"); 
    driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
    

16

सेलेनियम में आवेदन को ताज़ा करने के लिए विभिन्न दृष्टिकोण पाए गए: -

1.driver.navigate().refresh();
2.driver.get(driver.getCurrentUrl());
3.driver.navigate().to(driver.getCurrentUrl());
4.driver.findElement(By.id("Contact-us")).sendKeys(Keys.F5); 
5.driver.executeScript("history.go(0)");

लाइव कोड के लिए, कृपया http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html लिंक देखें


1
अच्छा! इसे करने के कई तरीके। findElement (By.id ("संपर्क-हमसे") एक अच्छा तरीका नहीं है। अधिक विश्वसनीय हमेशा मौजूद तत्व अच्छा होता है, जैसे: '/ html / body'। क्या यह हार्ड रिफ्रेश के लिए काम करता है? और क्या होगा अगर पेज में पोस्ट डेटा है, फ़ायरफ़ॉक्स पोस्ट डेटा डायलॉग दिखाने के लिए जाना जाता है।
मर्तिपाले

11

यहाँ थोड़ा अलग सी # संस्करण है:

driver.Navigate().Refresh();

5

पेज रिफ्रेश के लिए वैकल्पिक (F5)

driver.navigate().refresh();

(या)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();

4

ध्यान देने वाली एक महत्वपूर्ण बात यह है कि Driver.navigate () ताज़ा करें () कॉल कभी-कभी अतुल्यकालिक लगती है, जिसका अर्थ है कि यह ताज़ा होने के लिए इंतजार नहीं करता है, यह सिर्फ "ताज़ा बंद किक" और आगे निष्पादन को अवरुद्ध नहीं करता है। जबकि ब्राउज़र पृष्ठ को पुनः लोड कर रहा है।

हालांकि यह केवल मामलों की अल्पमत में होता है, हमने सोचा कि यह सुनिश्चित करना बेहतर है कि यह मैन्युअल चेक जोड़कर 100% काम करता है कि क्या पेज वास्तव में पुनः लोड करना शुरू कर दिया है।

यहाँ मैंने उस कोड को हमारे आधार पृष्ठ ऑब्जेक्ट क्लास में लिखा है:

public void reload() {
    // remember reference to current html root element
    final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));

    // the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
    // but doesn't actually wait for the fresh to finish
    getDriver().navigate().refresh();

    // verify page started reloading by checking that the html root is not present anymore
    final long startTime = System.currentTimeMillis();
    final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
    boolean startedReloading = false;
    do {
        try {
            startedReloading = !htmlRoot.isDisplayed();
        } catch (ElementNotVisibleException | StaleElementReferenceException ex) {
            startedReloading = true;
        }
    } while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));

    if (!startedReloading) {
        throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
    }

    // verify page finished reloading
    verify();
}

कुछ नोट:

  • चूंकि आप पृष्ठ को पुनः लोड कर रहे हैं, आप किसी दिए गए तत्व के अस्तित्व की जांच नहीं कर सकते हैं, क्योंकि पुनः लोड शुरू होने से पहले और उसके बाद भी ऐसा किया जाएगा। इसलिए कभी-कभी आप सही हो सकते हैं, लेकिन पेज अभी तक लोड करना शुरू नहीं किया है।
  • जब पृष्ठ पुनः लोड होता है, तो WebElement.isDisplayed () की जाँच करके StaleElementReferenceException को फेंक दिया जाएगा। बाकी सभी आधारों को कवर करने के लिए है
  • getName (): आंतरिक विधि जिसे पेज का नाम मिलता है
  • getMaximumLoadTime (): आंतरिक विधि जो रिटर्न करती है कि सेकंड में लोड करने के लिए कितने लंबे पृष्ठ की अनुमति दी जानी चाहिए
  • सत्यापित करें (): आंतरिक विधि सुनिश्चित करती है कि पृष्ठ वास्तव में भरा हुआ है

फिर से, अधिकांश मामलों में, do / जबकि लूप एक बार चलता है क्योंकि नेविगेट से परे कोड (ताज़ा) (ताज़ा) तब तक निष्पादित नहीं होता है जब तक कि ब्राउज़र वास्तव में पृष्ठ को पूरी तरह से पुनः लोड नहीं करता है, लेकिन हमने ऐसे मामलों को देखा है जहां यह वास्तव में उस लूप के माध्यम से प्राप्त करने के लिए सेकंड लेता है क्योंकि नेविगेट () ताज़ा करें () तब तक ब्लॉक नहीं हुआ जब तक कि ब्राउज़र ने लोडिंग समाप्त नहीं कर दी।


सही मूल्य के साथ उत्तर ... धन्यवाद।
ओग्मियोस


2

एक ऐसा मामला भी है जब आप पृष्ठ पर केवल विशिष्ट iframe ताज़ा करना चाहते हैं न कि पूर्ण पृष्ठ।

आप इस प्रकार है:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}


1

जावा में सेलेनियम का उपयोग करके वर्तमान पृष्ठ को ताज़ा करने का दूसरा तरीका।

//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl(); 
//second: call the current URL
driver.get(currentURL); 

इसका उपयोग करने से वर्तमान पृष्ठ ताज़ा हो जाएगा जैसे ब्राउज़र के एड्रेस बार पर क्लिक करना और एंटर दबाना।


1

में आर आप ताज़ा विधि का उपयोग कर सकते हैं, लेकिन साथ हम एक यूआरएल नेविगेट विधि का उपयोग करने के लिए नेविगेट शुरू करने के लिए:

remDr$navigate("https://...")
remDr$refresh()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.