Adakah yang bisa membiarkan saya bagaimana saya bisa membuat selenium menunggu sampai waktu halaman dimuat sepenuhnya? Saya ingin sesuatu yang generik, saya tahu saya bisa mengkonfigurasi WebDriverWait dan memanggil sesuatu seperti 'temukan' untuk membuatnya menunggu tetapi saya tidak melangkah sejauh itu. Saya hanya perlu menguji bahwa halaman berhasil dimuat dan beralih ke halaman berikutnya untuk menguji.
Saya menemukan sesuatu di .net tetapi tidak dapat membuatnya bekerja di java ...
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Adakah yang berpikir?
Jawaban:
Coba kode ini:
Kode di atas akan menunggu hingga 10 detik untuk memuat halaman. Jika memuat halaman melebihi waktu itu akan membuang
TimeoutException
. Anda menangkap pengecualian dan melakukan kebutuhan Anda. Saya tidak yakin apakah itu berhenti memuat halaman setelah pengecualian dilemparkan. saya belum mencoba kode ini. Mau coba saja.Ini adalah penantian implisit. Jika Anda menetapkan ini sekali, ia akan memiliki ruang lingkup sampai contoh Driver Web menghancurkan.
Lihat dokumentasi untuk
WebDriver.Timeouts
informasi lebih lanjut.sumber
Solusi yang Anda sarankan hanya menunggu sinyal DOM
readyState
complete
. Tapi Selenium secara default mencoba menunggu mereka (dan sedikit lebih banyak) pada halaman dimuat melalui metodedriver.get()
danelement.click()
. Mereka sudah memblokir, mereka menunggu halaman untuk memuat penuh dan itu harus berfungsi ok.Masalahnya, jelasnya, pengalihan melalui permintaan AJAX dan menjalankan skrip - yang tidak bisa ditangkap oleh Selenium, tidak menunggu sampai selesai. Selain itu, Anda tidak dapat menangkapnya dengan andal
readyState
- ia menunggu sebentar, yang dapat berguna, tetapi akan memberi sinyalcomplete
jauh sebelum semua konten AJAX diunduh.Tidak ada solusi umum yang akan bekerja di mana-mana dan untuk semua orang, itu sebabnya sulit dan semua orang menggunakan sesuatu yang sedikit berbeda.
Aturan umumnya adalah bergantung pada WebDriver untuk melakukan bagiannya, kemudian gunakan tunggu implisit, lalu gunakan tunggu eksplisit untuk elemen yang ingin Anda nyatakan pada halaman, tetapi ada banyak lagi teknik yang bisa dilakukan. Anda harus memilih salah satu (atau kombinasi beberapa di antaranya) yang paling sesuai untuk kasus Anda, pada halaman yang Anda uji.
Lihat dua jawaban saya tentang ini untuk informasi lebih lanjut:
sumber
element.click()
panggilan.Ini adalah versi Java yang berfungsi dari contoh yang Anda berikan:
Contoh untuk c #:
sumber
import com.google.common.base.Predicate
Inilah upaya saya untuk solusi yang sepenuhnya generik, dengan Python:
Pertama, fungsi "tunggu" generik (gunakan WebDriverWait jika Anda suka, saya menganggapnya jelek):
Selanjutnya, solusinya bergantung pada fakta bahwa selenium mencatat nomor id (internal) untuk semua elemen pada halaman, termasuk
<html>
elemen level atas . Saat halaman disegarkan atau dimuat, ia mendapat elemen html baru dengan ID baru.Jadi, anggap Anda ingin mengeklik tautan dengan teks "tautan saya" misalnya:
Untuk bantuan Pythonic, reusable, generic yang lebih banyak, Anda dapat membuat manajer konteks:
Dan kemudian Anda dapat menggunakannya di hampir semua interaksi selenium:
Saya rasa itu antipeluru! Bagaimana menurut anda?
Info lebih lanjut di posting blog tentang itu di sini
sumber
Saya punya masalah serupa. Saya perlu menunggu sampai dokumen saya siap tetapi juga sampai semua panggilan Ajax selesai. Kondisi kedua terbukti sulit dideteksi. Pada akhirnya saya memeriksa panggilan Ajax aktif dan berhasil.
Javascript:
Metode C # lengkap:
sumber
document.readyState == 'complete' && jQuery.active == 0
untuk Bereaksi?sumber
Untuk C # NUnit, Anda perlu mengonversi WebDriver ke JSExecuter dan kemudian menjalankan skrip untuk memeriksa apakah dokumen sudah menyatakan lengkap atau tidak. Periksa kode di bawah ini untuk referensi:
Ini akan menunggu sampai kondisinya puas atau habis.
sumber
Untuk pemuatan halaman awal, saya perhatikan bahwa "Memaksimalkan" jendela browser praktis menunggu sampai pemuatan halaman selesai (termasuk sumber)
Menggantikan:
Dengan:
daripada menggunakan:
Ini akan memuat halaman, tunggu sampai selesai, maksimalkan dan fokus padanya. Saya tidak tahu mengapa seperti ini tetapi berfungsi.
Jika Anda ingin menunggu pemuatan halaman setelah mengklik berikutnya atau pemicu navigasi halaman lain selain "Navigasi ()", jawaban Ben Dyer (di utas ini) akan melakukan pekerjaannya.
sumber
Lihatlah kerangka kerja permadani . Anda dapat mengunduh kode sumber di sana.
Idenya adalah untuk menandakan bahwa halaman siap dengan atribut html tubuh. Anda dapat menggunakan ide ini untuk mengabaikan kasus-kasus tuntutan yang rumit.
Dan kemudian membuat ekstensi webdriver Selenium (sesuai dengan kerangka permadani)
Gunakan ekstensi ElementIsDisplayed yang ditulis oleh Alister Scott .
Dan akhirnya buat tes:
sumber
Jawaban Ben Dryer tidak dikompilasi pada mesin saya (
"The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait"
).Versi Java 8 yang berfungsi:
Versi Java 7:
sumber
Saya mencoba kode ini dan berhasil untuk saya. Saya memanggil fungsi ini setiap kali saya pindah ke halaman lain
sumber
Di Nodejs Anda bisa mendapatkannya melalui janji ...
Jika Anda menulis kode ini, Anda dapat memastikan bahwa halaman tersebut dimuat penuh ketika Anda sampai ke ...
Jika Anda menulis kode ini, Anda akan menavigasi, dan selenium akan menunggu 3 detik ...
Dari dokumentasi Selenium:
this.get (url) → Thenable
Jadwalkan perintah untuk menavigasi ke URL yang diberikan.
Mengembalikan janji yang akan diselesaikan saat dokumen selesai dimuat .
Dokumentasi Selenium (Nodejs)
sumber
Menunggu dokumen. Acara yang sudah ada belum menyelesaikan seluruh masalah ini, karena kode ini masih dalam kondisi balapan: Terkadang kode ini dipecat sebelum acara klik diproses sehingga ini langsung kembali, karena browser belum memulai memuat halaman baru.
Setelah beberapa pencarian saya menemukan posting di Obay kambing pengujian , yang memiliki solusi untuk masalah ini. Kode c # untuk solusi itu adalah seperti ini:
`Saya memecat metode ini langsung setelah driver.navigate.gotourl, sehingga mendapat referensi halaman sesegera mungkin. Bersenang-senanglah dengan itu!
sumber
biasanya ketika selenium membuka halaman baru dari klik atau mengirim atau mendapatkan metode, itu akan menunggu sampai halaman dibuka tetapi masalahnya adalah ketika halaman memiliki panggilan xhr (ajax) dia tidak akan pernah menunggu xhr untuk dimuat, jadi membuat metode baru untuk memonitor xhr dan menunggu mereka itu akan menjadi yang baik.
if $.active == 0
jadi tidak ada panggilan xhrs aktif (yang hanya berfungsi dengan jQuery). untuk panggilan ajax javascript Anda harus membuat variabel dalam proyek Anda dan mensimulasikannya.sumber
Anda dapat menulis beberapa logika untuk menangani ini. Saya telah menulis metode yang akan mengembalikan
WebElement
dan metode ini akan dipanggil tiga kali atau Anda dapat menambah waktu dan menambahkan cek nol untukWebElement
Berikut adalah contohnyasumber
Saya mengeksekusi kode javascript untuk memeriksa apakah dokumen sudah siap. Menghemat saya banyak waktu men-debug tes selenium untuk situs yang memiliki rendering sisi klien.
}
sumber
sumber
Seperti Rubanov menulis untuk C #, saya menulis untuk Java, dan itu adalah:
sumber
Di Jawa akan seperti di bawah ini: -
sumber
return document.readyState == 'loaded' || return document.readyState == 'complete'
Kode berikut mungkin bekerja:
sumber
Jika Anda memiliki halaman yang lambat atau koneksi jaringan, kemungkinan semua hal di atas tidak akan berfungsi. Saya telah mencoba semuanya dan satu-satunya hal yang berhasil bagi saya adalah menunggu elemen terakhir yang terlihat pada halaman itu. Ambil contoh halaman web Bing. Mereka telah menempatkan ikon KAMERA (tombol pencarian berdasarkan gambar) di sebelah tombol pencarian utama yang hanya dapat dilihat setelah halaman lengkap dimuat. Jika semua orang melakukan itu, maka yang harus kita lakukan adalah menggunakan menunggu secara eksplisit seperti pada contoh di atas.
sumber
sumber
Ini sesuatu yang mirip, di Ruby:
sumber
Anda dapat membuat utas tidur sampai halaman dimuat ulang. Ini bukan solusi terbaik, karena Anda perlu memperkirakan berapa lama waktu yang diperlukan untuk memuat.
sumber
Saya memeriksa pemuatan halaman, bekerja di Selenium 3.14.0
sumber
Untuk orang-orang yang perlu menunggu elemen tertentu muncul. (digunakan c #)
Kemudian jika Anda ingin menunggu misalnya jika kelas = "pesan kesalahan" ada di DOM yang Anda lakukan:
Untuk id, maka akan menjadi
WaitForElement(driver, By.Id("yourid"));
sumber
Apakah Anda menggunakan Angular? Jika ya, ada kemungkinan webdriver tidak mengenali bahwa panggilan async telah selesai.
Saya sarankan melihat Paul Hammants ngWebDriver . Metode waitForAngularRequestsToFinish () dapat berguna.
sumber