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

pbaranski
źródło

Odpowiedzi:

294

W Javie lub JavaScript:

driver.navigate().refresh();

Powinno to odświeżyć stronę.

Manpreet Singh
źródło
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.

Izaak
źródło
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.
54

W Pythonie

Korzystanie z metody wbudowanej

driver.refresh()

lub wykonując JavaScript

driver.execute_script("location.reload()")
Md. Nazmul Haque Sarker
źródło
Jak możemy odświeżyć strony modalne?
hamed baziyad
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");
    
Sandeep
źródło
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

AugustRush
źródło
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
11

Oto nieco inna wersja C #:

driver.Navigate().Refresh();
dmeehan
źródło
5

Alternatywny dla Odśwież stronę (F5)

driver.navigate().refresh();

(lub)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();
Prashanth Sams
źródło
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.

prochowiec
źródło
Odpowiedź z prawdziwą wartością ... Dzięki.
Ogmios
3

Możesz też spróbować

Driver.Instance.Navigate().Refresh();
user5320606
źródło
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);
}
Jasio
źródło
2

W PHP:

$driver->navigate()->refresh();
MegaCasper
źródło
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.

RyanskyHeisenberg
źródło
1

W R możesz użyć metody refresh, ale na początek przechodzimy do adresu URL metodą navigate:

remDr$navigate("https://...")
remDr$refresh()
Tiago Martins Peres 李大仁
źródło