Saya ingin memastikan bahwa ada elemen sebelum webdriver mulai melakukan hal-hal.
Saya mencoba membuat sesuatu seperti ini berfungsi:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Saya terutama berjuang bagaimana mengatur fungsi anynomous ..
TimeSpan.FromSeconds(5)
. Itu membuatnya lebih jelas IMOJawaban:
Atau Anda dapat menggunakan tunggu implisit:
sumber
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Menggunakan solusi yang disediakan oleh Mike Kwan dapat berdampak pada kinerja pengujian secara keseluruhan, karena menunggu implisit akan digunakan dalam semua panggilan FindElement. Sering kali Anda ingin FindElement gagal segera saat sebuah elemen tidak ada (Anda sedang menguji halaman yang salah bentuk, elemen yang hilang, dll.). Dengan menunggu implisit, operasi ini akan menunggu seluruh batas waktu berakhir sebelum melempar pengecualian. Default implisit wait diatur ke 0 detik.
Saya telah menulis sedikit metode ekstensi untuk ke IWebDriver yang menambahkan parameter batas waktu (dalam detik) ke
FindElement()
metode ini. Cukup jelas:Saya tidak men-cache objek WebDriverWait karena pembuatannya sangat murah, ekstensi ini dapat digunakan secara bersamaan untuk objek WebDriver yang berbeda, dan saya hanya melakukan optimasi ketika akhirnya diperlukan.
Penggunaan mudah:
sumber
WebDriverWait
berasal dariOpenQA.Selenium.Support.UI
namespace dan datang dalam paket terpisah memintaSelenium WebDriver Support Classes
NuGetSelenium WebDriver Support Classes
sekarang muncul di NuGet sebagai "Selenium.Support" , versi saat ini adalah 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
dan itu berfungsi dengan baik sekarang. Kepala jika-kalau ada orang lain mendapat elemen acak tidak ditemukan masih.Anda juga bisa menggunakan
ExpectedConditions.ElementExists
Jadi, Anda akan mencari ketersediaan elemen seperti itu
Sumber
sumber
DotNetSeleniumExtras.WaitHelpers
(dirujuk oleh @Jejan di atas) "tidak dikelola, masalah tidak akan diperbaiki, PR tidak akan diterima". (sumber: github.com/SeleniumHQ/selenium/issues/… ). Penerbitnya sedang mencari pengelola untuk mengambil alih darinya.Berikut adalah variasi dari solusi @ Loudenvier yang juga berfungsi untuk mendapatkan beberapa elemen:
sumber
Terinspirasi oleh solusi Loudenvier, berikut adalah metode ekstensi yang berfungsi untuk semua objek ISearchContext, bukan hanya IWebDriver, yang merupakan spesialisasi dari yang pertama. Metode ini juga mendukung menunggu hingga elemen ditampilkan.
Contoh penggunaan:
sumber
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
itu masih akan mengalahkan nilai batas waktu yang Anda tetapkan di sini.Stopwatch
sekitar panggilan ke metode ekstensi danConsole.WriteLine()
di dalam lambda dikirim keUntil()
. Stopwatch mengukur hampir tepat 60 detik dan hanya satu pesan yang ditulisConsole
. Apakah saya melewatkan sesuatu di sini?Saya Bingung fungsi apa pun dengan predikat. Inilah metode pembantu kecil:
sumber
Anda dapat menemukan sesuatu seperti ini di C #.
Inilah yang saya gunakan di JUnit - Selenium
Apakah mengimpor paket terkait
sumber
sumber
sumber
Perintah clickAndWait tidak dapat dikonversi ketika Anda memilih format Webdriver di Selenium IDE. Ini solusinya. Tambahkan garis tunggu di bawah ini. Secara realistis, masalahnya adalah klik atau peristiwa yang terjadi sebelum ini - baris 1 dalam kode C # saya. Tapi sungguh, pastikan Anda memiliki WaitForElement sebelum tindakan apa pun di mana Anda mereferensikan objek "oleh".
Kode HTML:
C # / NUnit kode:
sumber
Python:
dari EC Anda dapat memilih kondisi lain juga coba ini: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
sumber
Coba kode ini:
sumber
Tunggu Eksplisit
Contoh:
sumber
Digunakan Rn222 dan Aknuds1 untuk menggunakan ISearchContext yang mengembalikan elemen tunggal, atau daftar. Dan jumlah minimum elemen dapat ditentukan:
Contoh penggunaan:
sumber
Anda tidak ingin menunggu terlalu lama sebelum elemen berubah. Dalam kode ini, driver web menunggu hingga 2 detik sebelum melanjutkan.
sumber
Karena saya memisahkan definisi elemen halaman dan skenario pengujian halaman menggunakan IWebElement untuk visibilitas yang sudah ditemukan dapat dilakukan seperti ini:
sumber
Ini adalah fungsi yang dapat digunakan kembali untuk menunggu elemen hadir dalam DOM menggunakan Tunggu Eksplisit.
sumber
Kita bisa mencapai itu seperti ini:
sumber
WebDriverWait
tidak akan berpengaruh.Ini akan langsung membuang pengecualian setelah halaman "interaktif". Saya tidak tahu mengapa tetapi batas waktu bertindak seolah-olah tidak ada.
Mungkin
SeleniumExtras.WaitHelpers
berhasil tetapi saya tidak mencoba. Ini resmi tetapi dibagi menjadi paket nuget lain. Anda dapat merujuk ke C # Selenium 'ExpectedConditions is obsolete' .Saya sendiri menggunakan
FindElements
dan memeriksa apakahCount == 0
, jika benar, gunakanawait Task.Delay
. Benar-benar tidak efisien.sumber
Anda dapat menggunakan yang berikut ini
sumber
Saya melihat beberapa solusi yang sudah diposting yang berfungsi dengan baik! Namun, kalau-kalau ada yang membutuhkan sesuatu yang lain, saya pikir saya akan memposting dua solusi yang saya pribadi gunakan dalam selenium C # untuk menguji apakah ada elemen! Semoga ini bisa membantu, tepuk tangan!
Ini yang kedua
sumber
sumber
Jawaban pertama adalah baik, masalah saya adalah pengecualian yang tidak tertangani tidak menutup driver web dengan benar dan itu menjaga nilai pertama yang sama yang saya gunakan yaitu 1 detik.
Jika Anda mendapatkan masalah yang sama
restart you visual studio
dan memastikan ituall the exceptions are handled
dengan benar.sumber
Sedang mencari cara menunggu di Selenium untuk kondisinya, mendarat di utas ini dan inilah yang saya gunakan sekarang:
ReadCell(row, col) != ""
dapat kondisi apa pun. Suka seperti ini karena:sumber