Belirli bir durumu beklerken Web sayfasını WebDriver ile yenileme


154

Testler sırasında web sayfasını yenilemenin daha zarif bir yolunu arıyorum (Selenium2 kullanıyorum). Sadece F5 anahtarı gönderiyorum ama sürücünün tüm web sayfasını yenilemek için yöntemi olup olmadığını merak ediyorum İşte benim kodum

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

Manuel olarak yenilenen sayfada öğe bulmak için belki daha iyi bir çözüm olabilir

Yanıtlar:


294

Java veya JavaScript'te:

driver.navigate().refresh();

Bu sayfayı yenilemelidir.


Memnun! size yardımcı oldu. Alternatif olarak, tamamen selenyum RC veya WebDriverBackedSelenium kullanıyorsanız: selenium.refresh ();
Manpreet Singh

47
Yine de F5 tuşuna basmakla aynı şey değil. driver.navigate().refresh()istek başlığında "no-cache" yazıyor ve sonuç olarak tüm içeriği koşulsuz olarak yeniden yüklüyor. F5'e basmak "If-Modified-Since" isteğine neden olabilir, ancak bu "304 Değiştirilmedi" yanıtı alabilir. Yük testi yaparsanız, bu farkı göz önünde bulundurmanız gerekir.
Vsevolod Golovanov

@Manpreet Çözüm için teşekkürler. Olumlu Oy'a layık.
RNS

75

Python bu iş için bir yöntem vardır: driver.refresh(). Java ile aynı olmayabilir.

Alternatif olarak, driver.get("http://foo.bar");yenileme yönteminin iyi çalışması gerektiğini düşünüyorum.


1
Kullanıyorsanız driver.get("http://foo.bar")da kullanabilirsinizdriver.get(driver.current_url)
Matt M.


21

Selenium Webdriver'ı kullanarak bir web sayfasını yenilemenin 5 farklı yolu

Özel bir kodlama yoktur. Ben sadece mevcut fonksiyonları işe almak için farklı şekillerde kullandım. İşte buradalar :

  1. SendKeys.Keys yöntemini kullanma

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Navigate.refresh () yöntemini kullanma

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Navigate.to () yöntemini kullanma

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Get () yöntemini kullanma

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. SendKeys () yöntemini kullanma

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

16

Selenyumda uygulamayı yenilemek için çeşitli yaklaşımlar bulundu: -

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

Canlı kod için lütfen http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html bağlantısına bakın.


1
Güzel! Bunu yapmanın birden çok yolu. findElement (By.id ("Bize Ulaşın")) iyi bir yol değildir. daha güvenilir her zaman mevcut eleman iyidir, örneğin: '/ html / body'. Bu zor bir yenileme için çalışıyor mu? ve sayfada yayın verileri varsa, firefox'un yayın verileri iletişim kutusunu gösterdiği bilinir.
mrtipale

11

İşte biraz farklı C # sürümü:

driver.Navigate().Refresh();

5

Sayfa Yenileme Alternatifi (F5)

driver.navigate().refresh();

(veya)

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

4

Dikkat edilmesi gereken önemli bir nokta, driver.navigate (). Refresh () çağrısının bazen eşzamansız olduğu anlamına gelir, yani yenilemenin bitmesini beklemez, sadece "yenilemeyi başlatır" ve daha fazla yürütmeyi engellemez tarayıcı sayfayı yeniden yüklerken.

Bu sadece az bir vakada gerçekleşmiş gibi görünse de, sayfanın gerçekten yeniden yüklenmeye başlayıp başlamadığını manuel olarak kontrol ederek, bunun% 100 çalıştığından emin olmanın daha iyi olduğunu düşündük.

Temel sayfa nesne sınıfımızda bunun için yazdığım kod:

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

Bazı notlar:

  • Sayfayı yeniden yüklediğiniz için, belirli bir öğenin varlığını kontrol edemezsiniz, çünkü öğe yeniden yükleme başlamadan önce ve bittikten sonra orada olacaktır. Bazen doğru olabilirsiniz, ancak sayfa henüz yüklenmeye başlamamıştır.
  • Sayfa yeniden yüklendiğinde, WebElement.isDisplayed () öğesinin işaretlenmesi bir StaleElementReferenceException özel durumu oluşturur. Gerisi sadece tüm üsleri kapsamak
  • getName (): sayfanın adını alan dahili yöntem
  • getMaximumLoadTime (): sayfanın saniye olarak yüklenmesine izin verilmesi gereken süreyi döndüren dahili yöntem
  • verify (): dahili yöntem sayfanın gerçekten yüklendiğinden emin olur

Yine, vakaların büyük çoğunluğunda, do / while döngüsü tek bir kez çalışır, çünkü navigate (). Ötesinde kod tarayıcı gerçekten sayfayı tamamen yeniden yükleyene kadar yürütülmez, ancak navigate (). refresh (), tarayıcının yüklenmesi tamamlanana kadar engellenmediğinden, bu döngüden geçmesi birkaç saniye alır.


Doğru değerle cevap ... Teşekkürler.
Ogmios


2

Tam sayfayı değil, yalnızca sayfadaki belirli iframe'i yenilemek istediğiniz bir durum da vardır.

Yaptığınız gibi:

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


1

Java'da selenyum kullanarak geçerli sayfayı yenilemenin başka bir yolu.

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

Bunu kullanmak, geçerli sayfayı tarayıcının adres çubuğunu tıklayıp enter tuşuna basmak gibi yenileyecektir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.