Odświeżanie strony internetowej przez WebDriver podczas oczekiwania na określony stan


154

Szukam bardziej eleganckiego sposobu na odświeżenie strony podczas testów (używam Selenium2). Po prostu wysyłam klawisz F5, ale zastanawiam się, czy sterownik ma metodę odświeżania całej strony. Oto mój kod

    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();    

Może jest lepsze rozwiązanie do znalezienia elementu na ręcznie odświeżanej stronie

Odpowiedzi:


294

W Javie lub JavaScript:

driver.navigate().refresh();

Powinno to odświeżyć stronę.


Zadowolony! to ci pomogło. Alternatywnie, jeśli używasz wyłącznie selenu RC lub WebDriverBackedSelenium, możesz również użyć: selenium.refresh ();
Manpreet Singh

47
Nie jest to jednak dokładnie równoważne naciśnięciu klawisza F5. driver.navigate().refresh()w nagłówku żądania jest napisane „no-cache” i w rezultacie bezwarunkowo przeładowuje całą zawartość. Podczas gdy naciśnięcie klawisza F5 może spowodować żądanie „If-Modified-Since”, to może otrzymać odpowiedź „304 Not Modified”. Musisz pamiętać o tej różnicy, jeśli przeprowadzasz testy obciążenia.
Vsevolod Golovanov

@ Manpreet Dzięki za rozwiązanie. Warto zagłosować za.
RNS

75

W Pythonie istnieje sposób to zrobić: driver.refresh(). W Javie może być inaczej.

Alternatywnie możesz driver.get("http://foo.bar");, chociaż myślę, że metoda odświeżania powinna działać dobrze.


1
Jeśli używasz, możesz driver.get("http://foo.bar")równie dobrze po prostu użyćdriver.get(driver.current_url)
Matt M.


21

5 różnych sposobów odświeżania strony internetowej za pomocą Selenium Webdriver

Nie ma specjalnego dodatkowego kodowania. Właśnie wykorzystałem istniejące funkcje na różne sposoby, aby działały. Tutaj są :

  1. Korzystanie z metody sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Korzystanie z metody navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Korzystanie z metody navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Korzystanie z metody get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Korzystanie z metody sendKeys ()

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

16

Znalazłem różne sposoby na odświeżenie aplikacji w selenie: -

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)");

Aby uzyskać kod na żywo, zapoznaj się z linkiem http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Miły! na wiele sposobów. findElement (By.id ("Contact-us")) nie jest dobrym sposobem. bardziej wiarygodny, zawsze obecny element jest dobry, np .: „/ html / body”. Czy to działa przy twardym odświeżaniu? a co, jeśli strona zawiera dane postów, wiadomo, że Firefox pokazuje okno dialogowe danych postów.
mrtipale


5

Alternatywny dla Odśwież stronę (F5)

driver.navigate().refresh();

(lub)

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

4

Ważną rzeczą do zapamiętania jest to, że wywołanie driver.navigate (). Refresh () czasami wydaje się być asynchroniczne, co oznacza, że ​​nie czeka na zakończenie odświeżania, po prostu „uruchamia odświeżanie” i nie blokuje dalszego wykonania podczas ponownego ładowania strony przez przeglądarkę.

Chociaż wydaje się, że zdarza się to tylko w nielicznych przypadkach, doszliśmy do wniosku, że lepiej jest upewnić się, że działa to w 100%, dodając ręczne sprawdzenie, czy strona naprawdę zaczęła się ponownie ładować.

Oto kod, który napisałem dla tego w naszej klasie obiektów strony bazowej:

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();
}

Kilka uwag:

  • Ponieważ przeładowujesz stronę, nie możesz po prostu sprawdzić istnienia danego elementu, ponieważ będzie on tam przed rozpoczęciem ponownego ładowania i po jego zakończeniu. Czasami może się to udać, ale strona nawet się jeszcze nie ładowała.
  • Po ponownym załadowaniu strony sprawdzenie WebElement.isDisplayed () spowoduje zgłoszenie wyjątku StaleElementReferenceException. Reszta dotyczy tylko wszystkich podstaw
  • getName (): wewnętrzna metoda pobierająca nazwę strony
  • getMaximumLoadTime (): wewnętrzna metoda, która zwraca czas wczytywania strony w ciągu kilku sekund
  • verify (): metoda wewnętrzna zapewnia, że ​​strona została faktycznie załadowana

Ponownie, w zdecydowanej większości przypadków pętla do / while jest uruchamiana jednorazowo, ponieważ kod poza navigate (). Refresh () nie jest wykonywany, dopóki przeglądarka nie załaduje całkowicie strony, ale widzieliśmy przypadki, w których w rzeczywistości przejście przez tę pętlę zajmuje kilka sekund, ponieważ funkcja navigate (). refresh () nie blokowała się, dopóki przeglądarka nie zakończy ładowania.


Odpowiedź z prawdziwą wartością ... Dzięki.
Ogmios


2

Istnieje również przypadek, gdy chcesz odświeżyć tylko określony element iframe na stronie, a nie całą stronę.

Robisz to w następujący sposób:

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


1

Inny sposób na odświeżenie bieżącej strony przy użyciu selenu w Javie.

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

Użycie tego spowoduje odświeżenie bieżącej strony, tak jak kliknięcie paska adresu przeglądarki i naciśnięcie klawisza Enter.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.