Bagaimana Anda membuat Selenium 2.0 menunggu halaman dimuat?
java
selenium
webdriver
selenium-webdriver
karthick kumar
sumber
sumber
Jawaban:
Anda juga dapat memeriksa pageload menggunakan kode berikut
sumber
Gunakan kelas WebDriverWait
Lihat juga di sini
Anda dapat menampilkan beberapa elemen. sesuatu seperti di C #:
sumber
Jika Anda mengatur tunggu driver, kemudian memanggil
findElement
metode pada elemen yang Anda harapkan berada di halaman yang dimuat, WebDriver akan polling untuk elemen itu sampai menemukan elemen atau mencapai nilai batas waktu.sumber: implisit-menunggu
sumber
Secara umum, dengan Selenium 2.0 driver web hanya boleh mengembalikan kontrol ke kode panggilan setelah ditentukan bahwa halaman telah dimuat. Jika tidak, Anda dapat menelepon
waitforelemement
, yang memanggil siklus putaranfindelement
sampai ditemukan atau waktu habis (batas waktu dapat diatur).sumber
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
, menunggu dokumen. SudahState menjadi "lengkap". Karena perjalanan pulang-pergi dari selenium ke peramban, kurasa kondisi balap dikurangi, dan ini "selalu" bekerja untuk saya. Setelah "klik ()" ketika saya mengharapkan halaman dimuat, saya secara eksplisit menunggu (menggunakan WebDriverWait) untuk readystate. ]Implementasi Ruby:
sumber
Anda dapat menghapus
System.out
garis. Itu ditambahkan untuk keperluan debug.sumber
Semua solusi ini OK untuk kasus-kasus tertentu, tetapi mereka menderita setidaknya satu dari beberapa masalah yang mungkin terjadi:
Mereka tidak cukup umum - mereka ingin Anda tahu, sebelumnya, bahwa beberapa kondisi tertentu akan benar dari halaman yang Anda tuju (misalnya beberapa elemen akan ditampilkan)
Mereka terbuka untuk kondisi balapan di mana Anda menggunakan elemen yang sebenarnya ada di halaman lama dan juga halaman baru.
Inilah upaya saya pada solusi umum yang menghindari masalah ini (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 lebih banyak Pythonic, reusable, helper generik, 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
Anda juga dapat menggunakan kelas:
ExpectedConditions
untuk secara eksplisit menunggu elemen muncul di halaman web sebelum Anda dapat mengambil tindakan tindakan selanjutnyaAnda bisa menggunakan
ExpectedConditions
kelas untuk menentukan apakah suatu elemen terlihat:Lihat
ExpectedConditions class Javadoc
daftar semua kondisi yang dapat Anda periksa.sumber
Jawaban Imran diulang untuk Java 7:
sumber
Ini tampaknya menjadi batasan serius WebDriver. Jelas menunggu suatu elemen tidak akan menyiratkan halaman yang sedang dimuat, khususnya DOM dapat sepenuhnya membangun (keadaan sudah) dimana JS masih mengeksekusi dan CSS dan gambar masih memuat.
Saya percaya solusi paling sederhana adalah dengan menetapkan variabel JS pada acara onload setelah semuanya diinisialisasi dan periksa dan tunggu variabel JS ini di Selenium.
sumber
Jika Anda ingin menunggu elemen tertentu dimuat, Anda dapat menggunakan
isDisplayed()
metode ini padaRenderedWebElement
:(Contoh dari Panduan Memulai 5 Menit )
sumber
RenderedWebElement
di API. Namun,isDisplayed()
metode sekarang tersedia langsung diWebElement
.Menunggu secara eksplisit atau menunggu bersyarat dalam menunggu ini sampai diberikan kondisi ini.
Ini akan menunggu setiap elemen web selama 60 detik.
Gunakan menunggu secara implisit untuk menunggu setiap elemen pada halaman sampai waktu yang diberikan.
Ini akan menunggu setiap elemen web selama 60 detik.
sumber
Gunakan tunggu secara implisit untuk menunggu setiap elemen pada halaman sampai waktu yang ditentukan.
tunggu ini untuk setiap elemen pada halaman selama 30 detik.
Penantian lainnya adalah Penantian secara eksplisit atau penantian bersyarat dalam penantian ini sampai kondisi yang ditentukan.
Dalam id, berikan id elemen statis yang ditampilkan secara berbeda pada halaman, segera setelah halaman dimuat.
sumber
Saya terkejut bahwa predikat bukan pilihan pertama karena Anda biasanya tahu elemen apa yang akan Anda interaksi selanjutnya pada halaman yang Anda tunggu muat. Pendekatan saya selalu membangun predikat / fungsi seperti
waitForElementByID(String id)
danwaitForElemetVisibleByClass(String className)
, dll. Dan kemudian menggunakan dan menggunakan kembali ini di mana pun saya membutuhkannya, baik itu untuk memuat halaman atau perubahan konten halaman yang saya tunggu.Sebagai contoh,
Di kelas ujian saya:
Di induk kelas uji saya:
Meskipun ini kelihatannya banyak, perlu memeriksa berulang kali untuk Anda dan interval seberapa sering untuk memeriksa dapat diatur bersama dengan waktu tunggu terakhir sebelum waktu habis. Anda juga akan menggunakan kembali metode tersebut.
Dalam contoh ini, kelas induk mendefinisikan dan memulai
WebDriver driver
danWebDriverWait driverWait
.Saya harap ini membantu.
sumber
Cara terbaik untuk menunggu pemuatan halaman saat menggunakan binding Java untuk WebDriver adalah dengan menggunakan pola desain Obyek Halaman dengan PageFactory. Ini memungkinkan Anda untuk memanfaatkan
AjaxElementLocatorFactory
yang membuatnya hanya bertindak sebagai penantian global untuk semua elemen Anda. Ini memiliki batasan pada elemen-elemen seperti drop-box atau transisi javascript kompleks tetapi secara drastis akan mengurangi jumlah kode yang dibutuhkan dan mempercepat waktu pengujian. Contoh yang baik dapat ditemukan di blogpost ini. Pemahaman dasar Core Java diasumsikan.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
sumber
Solusi NodeJS:
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
Ini adalah versi Java 8 dari jawaban yang paling banyak dipilih saat ini :
Di mana
myDriver
adalahWebDriver
objek (dinyatakan sebelumnya).Catatan : Perlu diketahui bahwa metode ini (
document.readyState
) hanya memeriksa DOM.sumber
Panggil fungsi di bawah ini dalam skrip Anda, ini akan menunggu sampai halaman tidak dimuat menggunakan javascript
sumber
Anda dapat mengubah dari dokumen ke elemen, dalam kasus di mana hanya bagian dari dokumen yang diubah.
Teknik ini terinspirasi oleh jawaban dari sincebasic.
sumber
SeleniumWaiter :
Dan untuk Anda menggunakannya :
sumber
Anda dapat menggunakan metode yang ada di bawah ini untuk mengatur waktu untuk pageeLoadTimeout dalam contoh di bawah ini jika halaman mengambil lebih dari 20 detik untuk memuat, maka itu akan membuang pengecualian dari memuat ulang halaman
sumber
Anda dapat secara eksplisit menunggu sebuah elemen muncul di halaman web sebelum Anda dapat mengambil tindakan apa pun (seperti element.click ())
Ini yang saya gunakan untuk skenario yang sama dan berfungsi dengan baik.
sumber
Cara sederhana saya:
sumber
Cara terbaik yang saya lihat adalah memanfaatkan
stalenessOf
ExpectedCondition, untuk menunggu halaman lama menjadi basi.Contoh:
Ini akan menunggu selama sepuluh detik untuk tag HTML lama menjadi basi, dan kemudian melemparkan pengecualian jika itu tidak terjadi.
sumber
Saya menggunakan node + selenium-webdriver (yang versi 3.5.0 sekarang). apa yang saya lakukan untuk ini adalah:
sumber
Anda bisa menggunakan wait. pada dasarnya ada 2 jenis menunggu dalam selenium
- Tunggu implisit
Ini sangat sederhana, silakan lihat sintaksis di bawah ini:
- Tunggu eksplisit
Menunggu secara eksplisit atau menunggu bersyarat dalam menunggu ini sampai kondisi yang diberikan terjadi.
Anda dapat menggunakan properti lain seperti
visblityOf()
,visblityOfElement()
sumber
Jika seseorang menggunakan selenide:
Ketentuan lainnya dapat ditemukan di sini: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
sumber
Dalam kasus saya, saya menggunakan yang berikut ini untuk mengetahui status memuat halaman. Dalam aplikasi kami memuat gif (s) hadir dan, saya mendengarkan mereka sebagai berikut untuk menghilangkan waktu tunggu yang tidak diinginkan dalam skrip.
Di mana xpath menemukan gif di HTML DOM. Setelah ini, Anda juga dapat menerapkan metode tindakan Anda. Klik.
sumber
Man semua jawaban ini membutuhkan kode terlalu banyak. Ini harus menjadi hal yang sederhana karena cukup umum.
Mengapa tidak menyuntikkan beberapa javascript sederhana dengan webdriver dan periksa. Ini adalah metode yang saya gunakan di kelas webscraper saya. Javascript cukup mendasar bahkan jika Anda tidak tahu js.
sumber
Cara mendapatkan Selenium untuk menunggu pemuatan halaman setelah klik memberikan pendekatan menarik berikut:
WebElement
dari dari halaman lama.WebElement
sampaiStaleElementReferenceException
terlempar.Kode sampel:
sumber
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.