2012-04-20 20 views
104

Poszukuję bardziej eleganckiego sposobu odświeżania strony podczas testów (korzystam z Selenium2). po prostu wysłać klawisz F5, ale zastanawiam się, czy kierowca ma sposobu na odświeżenie całą stronę Tu jest mój kodOdświeżająca strona WebDriver podczas oczekiwania na konkretny stan

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 jakiś lepszym rozwiązaniem dla znalezienia elementu ręcznie odświeżonej stronie

Odpowiedz

207

W Java lub JavaScript:

driver.navigate().refresh(); 

ten powinien odświeżyć stronę.

+0

Dobrze! to ci pomogło. Alternatywnie, jeśli używasz czystego selenu RC lub WebDriverBackedSelenium możesz również użyć: selenium.refresh(); –

+23

Nie jest to równoznaczne z naciśnięciem klawisza F5. 'driver.navigate(). refresh()' w nagłówku żądania mówi "no-cache", co w rezultacie bezwarunkowo przeładowuje całą zawartość. Podczas gdy naciśnięcie klawisza F5 może spowodować żądanie "If-Modified-Since", może pojawić się odpowiedź "Nie zmodyfikowano". Musisz pamiętać o tej różnicy, jeśli wczytujesz testy. –

+0

Dziękuję bardzo za tę odpowiedź :) Upvote – WEshruth

35

W Pythonie jest tam metoda wykonania tej czynności: driver.refresh(). To może nie być takie samo w Javie.

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

+0

uzyskać z tego samego adresu URL nie działa dla mnie z Java. – kirilloid

4

Alternatywny dla Odśwież stronę (F5)

driver.navigate().refresh(); 

(lub)

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

W python

za pomocą wbudowanego w metodzie

driver.refresh() 

lub wykonywanie JavaScript

driver.execute_script("location.reload()") 
0

Istnieje również przypadek, gdy chcesz odświeżyć tylko konkretne iframe na stronie, a nie pełną stronę.

zrobić 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); 
} 
12

Znaleziono różne podejścia, aby odświeżyć aplikację w selen: -

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

dla kodu na żywo, patrz link http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html

+0

Nice! wiele sposobów na zrobienie tego. findElement (By.id ("Contact-us")) nie jest dobrym sposobem. bardziej niezawodny zawsze obecny element jest dobry, np .: "/ html/body". Czy to działa w przypadku twardego odświeżania? i co jeśli strona ma dane pocztowe, firefox pokazuje okno dialogowe danych pocztowych. – mrtipale

5

Oto nieco inna wersja w języku C#:

driver.Navigate().Refresh(); 
2

Możesz także spróbować

Driver.Instance.Navigate().Refresh(); 
0

Jedną ważną rzeczą jest, aby pamiętać, że driver.navigate(). Odświeżania() nazywamy czasami wydaje się być asynchroniczny, co oznacza, że ​​nie czeka na odświeżenie do końca, to po prostu "rozpoczyna odświeżanie" i nie blokuje dalszego wykonywania, gdy przeglądarka ponownie ładuje stronę.

Chociaż zdarza się to tylko w niewielkiej liczbie przypadków, pomyśleliśmy, że lepiej jest upewnić się, że działa to w 100%, dodając ręczne sprawdzenie, czy strona naprawdę zaczęła się przeładowywać.

Oto kod, który napisałem dla naszego bazowego klasy strona obiektu:

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:

  • Skoro przeładowania strony, nie można po prostu sprawdzić istnienie dany element, ponieważ element będzie tam przed ponownym załadowaniem i po jego zakończeniu. Czasami możesz uzyskać prawdę, ale strona nie zaczęła jeszcze się ładować.
  • Po załadowaniu strony sprawdzenie WebElement.isDisplayed() spowoduje zgłoszenie wyjątku StaleElementReferenceException. Reszta to tylko na pokrycie wszystkich baz
  • getName(): metoda wewnętrzna że Pobiera nazwę strony
  • getMaximumLoadTime(): wewnętrzna metoda, która zwraca jak długo strona powinna mieć możliwość załadowania w sekundach
  • weryfikujących (): metoda wewnętrzna sprawia, czy strona faktycznie załadowane

Ponownie, w zdecydowanej większości przypadków, do/while działa jeden raz, ponieważ kod poza Nawigacja (odśwież)() nie zostanie wykonana. do momentu, gdy przeglądarka faktycznie całkowicie załaduje stronę, ale widzieliśmy przypadki, w których zajmie to kilka sekund, aby przejść przez tę pętlę, ponieważ funkcja navigate(). refresh() nie ock, dopóki przeglądarka nie zakończy ładowania.

4

5 różnych sposobów, aby odświeżyć stronę za pomocą selen Webdriver

Nie ma specjalnego ekstra kodowania. Właśnie użyłem istniejących funkcji na różne sposoby, aby to działało. Oto one:

  1. Stosując metodę

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

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

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

    driver.get("https://accounts.google.com/SignUp"); 
    driver.get(driver.getCurrentUrl()); 
    
  5. Korzystanie SendKeys() metoda

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

Innym sposobem na odświeżenie bieżącej strony za pomocą selenu w Jawa.

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

Korzystanie będzie odświeżyć bieżącą stronę jak kliknięcie na pasku adresu przeglądarki i naciskając klawisz Enter.