Saya sedang mengerjakan Java Selenium-WebDriver. saya tambahkan
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
dan
WebElement textbox = driver.findElement(By.id("textbox"));
karena Aplikasi saya memerlukan beberapa detik untuk memuat Antarmuka Pengguna. Jadi saya menetapkan 2 detik implisitwait. tetapi saya tidak dapat menemukan kotak teks elemen
Lalu saya tambahkan Thread.sleep(2000);
Sekarang berfungsi dengan baik. Mana yang lebih baik?
java
selenium
selenium-webdriver
webdriver
Pangeran
sumber
sumber
Jawaban:
Ada dua jenis penantian: penantian eksplisit dan implisit. Ide menunggu eksplisit adalah
Konsep menunggu implisit adalah
Anda bisa mendapatkan perbedaan detailnya di sini .
Dalam situasi seperti itu, saya lebih suka menggunakan penantian eksplisit (
fluentWait
khususnya):fluentWait
fungsi mengembalikan elemen web yang Anda temukan. Dari dokumentasi difluentWait
: Implementasi antarmuka Tunggu yang mungkin memiliki batas waktu dan interval polling yang dikonfigurasi dengan cepat. Setiap instans FluentWait menentukan jumlah waktu maksimum untuk menunggu suatu kondisi, serta frekuensi untuk memeriksa kondisi tersebut. Selain itu, pengguna dapat mengonfigurasi menunggu untuk mengabaikan jenis pengecualian tertentu sambil menunggu, seperti NoSuchElementExceptions saat mencari elemen di halaman. Detailnya bisa Anda dapatkan di siniPenggunaan
fluentWait
dalam kasus Anda adalah sebagai berikut:Pendekatan ini IMHO lebih baik karena Anda tidak tahu persis berapa banyak waktu untuk menunggu dan dalam interval pemungutan suara Anda dapat mengatur nilai waktu sewenang-wenang yang keberadaan elemen akan diverifikasi melalui. Salam.
sumber
import com.google.common.base.Function;
, tidakimport java.util.function.Function;
Function
yang sedang digunakan. Awalnya tidak jelas bagi saya. Terima kasih atas jawabannya.driver -> driver.findElement(locator)
. Saat menggunakan ini, Anda tidak memerlukan pernyataan impor sama sekali..withTimeout(Duration.ofSeconds(30)).pollingEvery(Duration.ofSeconds(5))
sebagai pengganti:.withTimeout(30, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS)
Utas ini sedikit lebih tua, tetapi saya pikir saya akan memposting apa yang saat ini saya lakukan (pekerjaan sedang dalam proses).
Meskipun saya masih mengalami situasi di mana sistem sedang dalam beban berat dan ketika saya mengklik tombol kirim (misalnya, login.jsp), ketiga kondisi (lihat di bawah) kembali
true
tetapi halaman berikutnya (misalnya, home.jsp) belum ' t mulai memuat.Ini adalah metode tunggu umum yang mengambil daftar ExpectedConditions.
Saya telah menentukan berbagai ExpectedConditions yang dapat digunakan kembali (tiga di bawah). Dalam contoh ini, tiga kondisi yang diharapkan mencakup document.readyState = 'complete', tidak ada "wait_dialog", dan tidak ada 'spinners' (elemen yang menunjukkan data asinkron sedang diminta).
Hanya yang pertama yang dapat diterapkan secara umum ke semua halaman web.
Bergantung pada halamannya, saya dapat menggunakan salah satu atau semuanya:
Ada juga ExpectedConditions yang telah ditentukan sebelumnya di kelas berikut: org.openqa.selenium.support.ui.ExpectedConditions
sumber
Jika menggunakan webdriverJs (node.js),
Kode di atas membuat browser menunggu selama 5 detik setelah mengklik tombol.
sumber
Menggunakan
Thread.sleep(2000);
adalah menunggu tanpa syarat. Jika pengujian Anda memuat lebih cepat, Anda masih harus menunggu. Jadi pada prinsipnya menggunakanimplicitlyWait
adalah solusi yang lebih baik.Namun, saya tidak melihat mengapa
implicitlyWait
tidak berhasil dalam kasus Anda. Apakah Anda mengukur jikafindElement
sebenarnya membutuhkan dua detik sebelum melempar pengecualian. Jika demikian, dapatkah Anda mencoba menggunakan tunggu bersyarat WebDriver seperti yang dijelaskan dalam jawaban ini ?sumber
Saya suka menggunakan kondisi khusus. Berikut beberapa kode di Python:
Kapan pun Anda perlu menunggu, Anda dapat melakukannya secara eksplisit dengan memeriksa keberadaan elemen tertentu (elemen tersebut dapat bervariasi dari satu halaman ke halaman lain).
find_elements_by_id
daftar kembali - kosong atau tidak, Anda baru saja memeriksa.sumber
klik tampaknya memblokir? - inilah cara lain untuk menunggu jika Anda menggunakan WebDriverJS:
Kode di atas menunggu setelah tombol diklik untuk memuat halaman berikutnya dan kemudian mengambil sumber halaman berikutnya.
sumber
Menunggu secara implisit dan Thread.sleep Keduanya digunakan untuk sinkronisasi saja..tetapi perbedaannya adalah kita dapat menggunakan Tunggu secara implisit untuk seluruh program tetapi Thread.sleep hanya akan berfungsi untuk kode tunggal itu .. Di sini saran saya adalah gunakan Tunggu secara implisit sekali dalam program ketika setiap kali halaman web Anda akan di-refresh berarti gunakan Thread.sleep pada saat itu..itu akan jauh lebih baik :)
Ini Kode Saya:
sumber
Kadang-kadang menunggu tersirat tampaknya diganti dan waktu menunggu dipotong pendek. [@ eugene.polschikov] memiliki dokumentasi yang bagus tentang mengapa. Saya telah menemukan dalam pengujian dan pengkodean saya dengan Selenium 2 bahwa menunggu implisit itu baik tetapi kadang-kadang Anda harus menunggu secara eksplisit.
Lebih baik untuk menghindari secara langsung meminta utas untuk tidur, tetapi terkadang tidak ada cara yang baik. Namun, ada pilihan menunggu lain yang disediakan Selenium yang membantu. waitForPageToLoad dan waitForFrameToLoad terbukti sangat berguna.
sumber
Penantian Implisit: Selama Penantian implisit jika Pengandar Web tidak dapat segera menemukannya karena ketersediaannya, WebDriver akan menunggu waktu yang disebutkan dan tidak akan mencoba menemukan elemen lagi selama jangka waktu yang ditentukan. Setelah waktu yang ditentukan selesai, itu akan mencoba mencari elemen sekali lagi terakhir kali sebelum melempar pengecualian. Pengaturan default adalah nol. Setelah kami menetapkan waktu, Driver Web menunggu periode instance objek WebDriver.
Penantian Eksplisit: Ada kemungkinan saat elemen tertentu membutuhkan waktu lebih dari satu menit untuk dimuat. Dalam hal ini, Anda pasti tidak suka menyetel waktu yang lama ke Penantian implisit, karena jika Anda melakukan ini, browser Anda akan menunggu waktu yang sama untuk setiap elemen. Untuk menghindari situasi tersebut Anda cukup memberikan waktu tersendiri pada elemen yang dibutuhkan saja. Dengan mengikuti ini, waktu tunggu implisit browser Anda akan menjadi singkat untuk setiap elemen dan akan menjadi besar untuk elemen tertentu.
sumber
Terkadang menunggu implisit gagal, mengatakan bahwa sebuah elemen ada tetapi sebenarnya tidak.
Solusinya adalah menghindari penggunaan driver.findElement dan menggantinya dengan metode kustom yang menggunakan Explicit Wait secara implisit. Sebagai contoh:
Ada alasan tambahan untuk menghindari menunggu implisit selain kegagalan yang sesekali dan sporadis (lihat tautan ini ).
Anda dapat menggunakan metode "elemen" ini dengan cara yang sama seperti driver.findElement. Sebagai contoh:
Jika Anda benar-benar ingin menunggu beberapa detik untuk memecahkan masalah atau kejadian langka lainnya, Anda dapat membuat metode jeda yang mirip dengan yang ditawarkan oleh selenium IDE:
sumber
Jawaban : tunggu beberapa detik sebelum visibilitas elemen menggunakan Selenium WebDriver melalui metode di bawah ini.
implicitlyWait () : Instance WebDriver menunggu hingga halaman penuh dimuat. Anda perlu menggunakan 30 hingga 60 detik untuk menunggu pemuatan halaman penuh.
ExplicitlyWait WebDriverWait () : Instance WebDriver menunggu hingga halaman penuh dimuat.
Catatan : Gunakan ExplicitlyWait WebDriverWait () untuk menangani WebElement tertentu.
sumber
Gunakan Tindakan -
Lihat Tindakan # metode jeda .
sumber
Saya lebih suka kode berikut menunggu selama 2 detik.
sumber
lebih buruk: menunggu statis, itu akan membuat skrip pengujian lebih lambat.
ini adalah penantian yang dinamis
Akhirnya, yang saya sarankan adalah
dengan beberapa kondisi standar:
sumber
Ini memang membantu saya tetapi pengecualian InterruptedException perlu ditangani. Jadi lebih baik mengelilinginya dengan mencoba dan menangkap:
ATAU
Tambahkan deklarasi lemparan:
Saya lebih suka yang kedua karena seseorang kemudian dapat menggunakan
sleep()
sebanyak yang diinginkan dan menghindari pengulangantry
dancatch
blokir setiap kalisleep()
digunakan.sumber