Menyegarkan halaman web oleh WebDriver saat menunggu kondisi tertentu

154

Saya mencari cara yang lebih elegan untuk menyegarkan halaman web selama pengujian (saya menggunakan Selenium2). Saya hanya mengirim kunci F5 tetapi saya bertanya-tanya apakah driver memiliki metode untuk menyegarkan seluruh halaman web. Berikut ini adalah kode saya

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

Mungkin ada beberapa solusi yang lebih baik untuk menemukan elemen pada halaman yang di-refresh secara manual

pbaranski
sumber

Jawaban:

294

Di Jawa atau JavaScript:

driver.navigate().refresh();

Ini harus menyegarkan halaman.

Manpreet Singh
sumber
Senang! ini membantu Anda. Atau jika Anda menggunakan RC murni selenium atau WebDriverBackedSelenium Anda juga dapat menggunakan: selenium.refresh ();
Manpreet Singh
47
Ini tidak persis sama dengan menekan F5. driver.navigate().refresh()di header permintaannya tertulis "no-cache" dan, sebagai hasilnya, tanpa syarat memuat kembali semua konten. Sedangkan menekan F5 dapat menghasilkan permintaan "Jika-Dimodifikasi-Sejak", itu bisa mendapatkan respons "304 Tidak Dimodifikasi". Anda harus mengingat perbedaan itu, jika Anda melakukan pengujian beban.
Vsevolod Golovanov
@Manpreet Terima kasih atas Solusi. Layak untuk Upvote.
RNS
75

Python ada metode untuk melakukan hal ini: driver.refresh(). Ini mungkin tidak sama di Jawa.

Atau, Anda bisa driver.get("http://foo.bar");, meskipun saya pikir metode penyegaran seharusnya bekerja dengan baik.

Ishak
sumber
1
Jika Anda menggunakan driver.get("http://foo.bar")mungkin juga hanya menggunakandriver.get(driver.current_url)
Matt M.
54

Dengan python

Menggunakan metode bawaan

driver.refresh()

atau, menjalankan JavaScript

driver.execute_script("location.reload()")
Md. Nazmul Haque Sarker
sumber
Bagaimana kami bisa menyegarkan halaman modal?
hamed baziyad
21

5 cara berbeda untuk me-refresh halaman web menggunakan Selenium Webdriver

Tidak ada pengkodean tambahan khusus. Saya baru saja menggunakan fungsi yang ada dalam berbagai cara untuk membuatnya berfungsi. Di sini mereka :

  1. Menggunakan metode sendKeys.Keys

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

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Menggunakan metode navig.to ()

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

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Menggunakan metode sendKeys ()

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

Ditemukan berbagai pendekatan untuk menyegarkan aplikasi dalam selenium: -

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

Untuk kode langsung, silakan merujuk tautan http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html

AugustRush
sumber
1
Bagus! beberapa cara untuk melakukannya. findElement (By.id ("Contact-us")) bukan cara yang baik. lebih selalu dapat diandalkan elemen yang ada adalah baik, misalnya: '/ html / tubuh'. Apakah ini berfungsi untuk penyegaran keras? dan bagaimana jika halaman memiliki data posting, firefox diketahui menunjukkan dialog data posting.
mrtipale
11

Berikut adalah versi C # yang sedikit berbeda:

driver.Navigate().Refresh();
dmeehan
sumber
5

Alternatif untuk Refresh Halaman (F5)

driver.navigate().refresh();

(atau)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();
Prashanth Sams
sumber
4

Satu hal penting yang perlu diperhatikan adalah bahwa panggilan driver.navigate (). Refresh () kadang-kadang tampaknya tidak sinkron, artinya tidak menunggu refresh selesai, itu hanya "memulai refresh" dan tidak memblokir eksekusi lebih lanjut saat browser memuat ulang halaman.

Walaupun ini hanya terjadi pada sebagian kecil kasus, kami memperkirakan bahwa lebih baik memastikan ini berfungsi 100% dengan menambahkan pemeriksaan manual apakah halaman tersebut benar-benar mulai memuat ulang.

Berikut kode yang saya tulis untuk itu di kelas objek halaman dasar kami:

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

Beberapa catatan:

  • Karena Anda memuat ulang halaman, Anda tidak bisa begitu saja memeriksa keberadaan elemen yang diberikan, karena elemen itu akan ada sebelum mulai ulang dan setelah selesai juga. Jadi kadang-kadang Anda mungkin benar, tetapi halaman tersebut belum mulai memuat.
  • Saat halaman dimuat ulang, memeriksa WebElement.isDisplayed () akan melempar StaleElementReferenceException. Sisanya hanya untuk menutupi semua pangkalan
  • getName (): metode internal yang mendapatkan nama halaman
  • getMaximumLoadTime (): metode internal yang mengembalikan berapa lama halaman harus diizinkan memuat dalam hitungan detik
  • memverifikasi (): metode internal memastikan halaman benar-benar dimuat

Sekali lagi, dalam sebagian besar kasus, loop do / while berjalan satu kali karena kode di luar navigasi (). Refresh () tidak dijalankan sampai browser benar-benar memuat ulang halaman sepenuhnya, tetapi kami telah melihat kasus di mana sebenarnya butuh beberapa detik untuk melewati loop itu karena navigasi (). refresh () tidak memblokir sampai browser selesai memuat.

Mac
sumber
Jawabannya dengan nilai sebenarnya ... Terima kasih.
Ogmios
3

Anda juga bisa mencoba

Driver.Instance.Navigate().Refresh();
pengguna5320606
sumber
2

Ada juga kasus ketika Anda ingin me-refresh hanya iframe khusus pada halaman dan bukan halaman penuh.

Yang Anda lakukan adalah sebagai berikut:

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

Dalam PHP:

$driver->navigate()->refresh();
MegaCasper
sumber
1

Cara lain untuk menyegarkan halaman saat ini menggunakan selenium di Jawa.

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

Menggunakan ini akan menyegarkan halaman saat ini seperti mengklik bilah alamat browser dan menekan enter.

RyanskyHeisenberg
sumber
1

Di R Anda dapat menggunakan metode penyegaran, tetapi untuk memulai dengan kami menavigasi ke url menggunakan metode navigasi:

remDr$navigate("https://...")
remDr$refresh()
Tiago Martins Peres 李大仁
sumber