Saya memiliki aplikasi web untuk diuji dengan Selenium. Ada banyak JavaScript yang berjalan saat halaman dimuat.
Kode JavaScript ini tidak ditulis dengan baik tetapi saya tidak dapat mengubah apa pun. Jadi menunggu elemen muncul di DOM dengan findElement()
metode bukanlah suatu pilihan.
Saya ingin membuat fungsi generik di Java untuk menunggu halaman dimuat, solusi yang mungkin adalah:
- menjalankan skrip JavaScript dari WebDriver dan menyimpan hasil
document.body.innerHTML
dalam variabel stringbody
. - bandingkan
body
variabel dengan versi sebelumnya daribody
. jika mereka sama maka setel kenaikan penghitungnotChangedCount
jika tidak diaturnotChangedCount
ke nol. - tunggu sebentar (misalnya 50 ms).
- jika halaman tidak berubah selama beberapa waktu (misalnya 500 ms),
notChangedCount >= 10
maka keluar dari loop jika tidak, lakukan loop ke langkah pertama.
Apakah menurut Anda ini solusi yang valid?
findElement
menunggu elemen tersedia, tetapi terkadang elemen tersedia sebelum kode javascript diinisialisasi sepenuhnya, itulah mengapa ini bukan pilihan.Jawaban:
Jika ada yang benar-benar mengetahui jawaban yang umum dan selalu dapat diterapkan, itu akan diterapkan di mana - mana berabad-abad yang lalu dan akan membuat hidup kita jauh lebih mudah.
Ada banyak hal yang dapat Anda lakukan, tetapi semuanya memiliki masalah:
Seperti yang dikatakan Ashwin Prabhu, jika Anda mengetahui skrip dengan baik, Anda dapat mengamati perilakunya dan melacak beberapa variabelnya di
window
ataudocument
dll. Solusi ini, bagaimanapun, bukan untuk semua orang dan hanya dapat digunakan oleh Anda dan hanya pada kumpulan terbatas. halaman.Solusi Anda dengan mengamati kode HTML dan apakah itu telah atau belum diubah untuk beberapa waktu tidak buruk (juga, ada metode untuk mendapatkan HTML asli dan tidak diedit secara langsung
WebDriver
), tetapi:setTimeout()
) dan bekerja lagi dan lagi dan mungkin dapat mengubah HTML setiap kali dijalankan. Serius, setiap halaman "Web 2.0" melakukannya. Bahkan Stack Overflow. Anda dapat menimpa metode yang paling umum digunakan dan menganggap skrip yang menggunakannya telah selesai, tetapi ... Anda tidak dapat memastikannya.innerHTML
kesenangan.Ada alat untuk membantu Anda dalam hal ini. Yaitu Progress Listeners bersama dengan nsIWebProgressListener dan beberapa lainnya. Namun, dukungan browser untuk ini sangat buruk. Firefox mulai mencoba mendukungnya dari FF4 dan seterusnya (masih berkembang), IE memiliki dukungan dasar di IE9.
Dan saya rasa saya bisa segera menemukan solusi cacat lainnya. Faktanya adalah - tidak ada jawaban pasti tentang kapan harus mengatakan "sekarang halaman telah selesai" karena skrip abadi melakukan tugasnya. Pilih salah satu yang paling sesuai untuk Anda, tetapi waspadalah terhadap kekurangannya.
sumber
Terima kasih Ashwin!
Dalam kasus saya, saya harus menunggu eksekusi plugin jquery di beberapa elemen .. khususnya "qtip"
berdasarkan petunjuk Anda, ini bekerja dengan sempurna untuk saya:
Catatan: Saya menggunakan Webdriver 2
sumber
Anda harus menunggu Javascript dan jQuery selesai memuat. Jalankan Javascript untuk memeriksa apakah
jQuery.active
is0
dandocument.readyState
iscomplete
, yang berarti pemuatan JS dan jQuery sudah selesai.sumber
document.readyState == 'complete' && jQuery.active == 0
berfungsi dengan baik tetapi apakah ada yang seperti itu untuk React? Karena pemeriksaan tersebut tidak akan menangkap masih memuat data / komponen reaksi?Apakah pustaka JS menentukan / menginisialisasi variabel terkenal di jendela?
Jika demikian, Anda bisa menunggu variabel muncul. Kamu bisa memakai
((JavascriptExecutor)driver).executeScript(String script, Object... args)
untuk menguji kondisi ini (seperti
window.SomeClass && window.SomeClass.variable != null
:) dan mengembalikan booleantrue
/false
.Bungkus ini dalam a
WebDriverWait
, dan tunggu sampai skrip kembalitrue
.sumber
Saya memiliki masalah yang sama. Solusi ini berfungsi untuk saya dari WebDriverDoku:
http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
sumber
Jika yang perlu Anda lakukan hanyalah menunggu html pada halaman menjadi stabil sebelum mencoba berinteraksi dengan elemen, Anda dapat melakukan polling DOM secara berkala dan membandingkan hasilnya, jika DOM sama dalam waktu polling yang diberikan, Anda keemasan. Sesuatu seperti ini di mana Anda melewati waktu tunggu maksimum dan waktu antara jajak pendapat halaman sebelum membandingkan. Sederhana dan efektif.
sumber
Kode di bawah ini berfungsi dengan sempurna dalam kasus saya - halaman saya berisi skrip java yang kompleks
Sumber - Cara Menunggu Halaman Dimuat / Siap Di Selenium WebDriver
sumber
Dua kondisi dapat digunakan untuk memeriksa apakah halaman dimuat sebelum menemukan elemen apa pun di halaman:
Menggunakan readyState di bawah ini akan menunggu sampai halaman dimuat
Di bawah JQuery akan menunggu hingga data belum dimuat
Setelah JavaScriptCode ini coba findOut webElement.
sumber
Saya meminta pengembang saya untuk membuat variabel JavaScript "isProcessing" yang dapat saya akses (dalam objek "ae") yang mereka setel saat segala sesuatunya mulai berjalan dan jelas ketika sesuatu sudah selesai. Saya kemudian menjalankannya di akumulator yang memeriksanya setiap 100 ms hingga mendapat lima berturut-turut dengan total 500 ms tanpa perubahan apa pun. Jika 30 detik berlalu, saya memberikan pengecualian karena sesuatu seharusnya telah terjadi saat itu. Ini ada di C #.
sumber
Untuk melakukannya dengan benar, Anda perlu menangani pengecualian.
Inilah cara saya menunggu iFrame. Ini mengharuskan kelas pengujian JUnit Anda meneruskan instance RemoteWebDriver ke objek halaman:
CATATAN: Anda dapat melihat seluruh contoh kerja saya di sini .
sumber
Untuk
nodejs
perpustakaan Selenium, saya menggunakan potongan berikut. Dalam kasus saya, saya mencari dua objek yang ditambahkan ke jendela, yang dalam contoh ini adalah<SOME PROPERTY>
,10000
milidetik batas waktu,<NEXT STEP HERE>
adalah apa yang terjadi setelah properti ditemukan di jendela.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 centang nol untukWebElement
Berikut adalah contohsumber
Ini dari kode saya sendiri:
Window.setTimeout hanya dijalankan saat browser menganggur.
Jadi memanggil fungsi secara rekursif (42 kali) akan memakan waktu 100 md jika tidak ada aktivitas di browser dan lebih banyak lagi jika browser sibuk melakukan hal lain.
Sebagai bonus, penghitung dapat disetel ulang di document.readyState atau pada panggilan jQuery Ajax atau jika ada animasi jQuery yang berjalan (hanya jika aplikasi Anda menggunakan jQuery untuk panggilan ajax ...)
...
...
EDIT: Saya melihat executeAsyncScript tidak berfungsi dengan baik jika halaman baru dimuat dan pengujian mungkin berhenti merespons tanpa batas waktu, lebih baik gunakan ini sebagai gantinya.
sumber
Tidak tahu bagaimana melakukannya tetapi dalam kasus saya, pemuatan halaman akhir & rendering cocok dengan FAVICON yang ditampilkan di tab Firefox.
Jadi jika kita bisa mendapatkan gambar favicon di webbrowser, maka halaman web sudah terisi penuh.
Tapi bagaimana melakukan ini ....
sumber
Menggunakan menunggu implisit bekerja untuk saya.
Lihat jawaban ini Selenium c # Webdriver: Tunggu Hingga Elemen Hadir
sumber
Begini cara saya melakukannya:
sumber
Saya suka ide Anda untuk melakukan polling terhadap HTML sampai stabil. Saya dapat menambahkannya ke solusi saya sendiri. Pendekatan berikut ada di C # dan membutuhkan jQuery.
Saya adalah pengembang untuk proyek uji SuccessFactors (SaaS) di mana kami tidak memiliki pengaruh sama sekali terhadap pengembang atau karakteristik DOM di balik laman web. Produk SaaS berpotensi mengubah desain DOM dasarnya 4 kali setahun, jadi perburuan secara permanen mencari cara yang kuat dan berkinerja untuk menguji dengan Selenium (termasuk BUKAN pengujian dengan Selenium jika memungkinkan!)
Inilah yang saya gunakan untuk "siap halaman". Ini bekerja di semua tes saya sendiri saat ini. Pendekatan yang sama juga berhasil untuk aplikasi web Java internal yang besar beberapa tahun yang lalu, dan telah kuat selama lebih dari setahun pada saat saya meninggalkan proyek.
Driver
adalah instance WebDriver yang berkomunikasi dengan browserDefaultPageLoadTimeout
adalah nilai batas waktu dalam ticks (100ns per tick)Berikut ini, perhatikan urutan metode menunggu
PageReady
(siap dokumen Selenium, Ajax, animasi), yang masuk akal jika Anda memikirkannya:Sesuatu seperti pendekatan perbandingan DOM Anda dapat digunakan antara 1 dan 2 untuk menambahkan lapisan ketahanan lainnya.
sumber