Implisit, Eksplisit, & Lancar Tunggu di Selenium WebDriver

Daftar Isi:

Anonim

Di Selenium, "Waits" memainkan peran penting dalam menjalankan tes. Dalam tutorial ini, Anda akan mempelajari berbagai aspek penantian "Implisit" dan "Eksplisit" di Selenium.

Dalam tutorial ini, Anda akan mempelajari:

  • Mengapa Kita Membutuhkan Penantian Di Selenium?
  • Penantian Tersirat
  • Penantian Eksplisit
  • Penantian Lancar

Mengapa Kita Membutuhkan Penantian Di Selenium?

Sebagian besar aplikasi web dikembangkan menggunakan Ajax dan Javascript. Saat halaman dimuat oleh browser, elemen yang ingin kita interaksi dapat dimuat pada interval waktu yang berbeda.

Ini tidak hanya mempersulit untuk mengidentifikasi elemen, tetapi juga jika elemen tidak ditemukan, ini akan memunculkan pengecualian " ElementNotVisibleException ". Dengan menggunakan Selenium Waits, kami dapat mengatasi masalah ini.

Mari kita pertimbangkan skenario di mana kita harus menggunakan menunggu implisit dan eksplisit dalam pengujian kita. Asumsikan bahwa waktu tunggu implisit disetel ke 20 detik dan waktu tunggu eksplisit disetel ke 10 detik.

Misalkan kita mencoba menemukan elemen yang memiliki beberapa "Kondisi yang Diharapkan " (Penantian Eksplisit), Jika elemen tidak terletak dalam kerangka waktu yang ditentukan oleh Penantian Eksplisit (10 Detik), Ini akan menggunakan kerangka waktu yang ditentukan oleh penantian implisit ( 20 detik) sebelum melempar " ElementNotVisibleException ".

Selenium Web Driver Menunggu

  1. Penantian Tersirat
  2. Penantian Eksplisit

Tunggu Tersirat di Selenium

The Tunggu Tersirat dalam Selenium digunakan untuk memberitahu sopir web untuk menunggu waktu tertentu sebelum melemparkan "Tidak seperti Element Exception". Pengaturan default adalah 0. Setelah kita mengatur waktu, driver web akan menunggu elemen untuk waktu tersebut sebelum memberikan pengecualian.

Selenium Web Driver telah meminjam ide dari menunggu implisit dari Watir.

Dalam contoh di bawah ini kami telah mendeklarasikan menunggu implisit dengan kerangka waktu 10 detik. Artinya jika elemen tidak berada di halaman web dalam jangka waktu tersebut, itu akan memunculkan pengecualian.

Untuk mendeklarasikan tunggu implisit:

Sintaks :

driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS); 
paket guru.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;impor org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;kelas publik AppTest {driver WebDriver yang dilindungi;@Ujipublic void guru99tutorials () melempar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();driver.manage (). timeout (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Halaman Demo Guru99";String aTitle = "";// luncurkan Chrome dan arahkan ke URL Dasardriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimalkan jendela browserdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenarnya dari judulaTitle = driver.getTitle ();// bandingkan judul sebenarnya dengan judul yang diharapkanjika (aTitle.equals (eTitle)){System.out.println ("Tes Lulus");}lain {System.out.println ("Tes Gagal");}// tutup browserdriver.close ();}}

Penjelasan Kode

Dalam contoh di atas,

Pertimbangkan Kode Berikut:

driver.manage (). timeout (). implicitlyWait (10, TimeUnit.SECONDS);

Penantian implisit akan menerima 2 parameter, parameter pertama akan menerima waktu sebagai nilai integer dan parameter kedua akan menerima pengukuran waktu dalam bentuk DETIK, MENIT, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS, dll.

Penantian Eksplisit di Selenium

The Tunggu Explicit di Selenium digunakan untuk memberitahu Web driver untuk menunggu kondisi tertentu (yang diharapkan Kondisi) atau waktu maksimum melebihi sebelum membuang "ElementNotVisibleException" pengecualian. Ini adalah jenis menunggu yang cerdas, tetapi hanya dapat diterapkan untuk elemen tertentu. Ini memberikan opsi yang lebih baik daripada menunggu implisit karena menunggu elemen Ajax yang dimuat secara dinamis.

Setelah kami mendeklarasikan eksplisit menunggu, kami harus menggunakan " ExpectedConditions " atau kami dapat mengkonfigurasi seberapa sering kami ingin memeriksa kondisi menggunakan Fluent Wait . Hari-hari ini saat menerapkan kami menggunakan Thread.Sleep () umumnya tidak disarankan untuk digunakan

Dalam contoh di bawah ini, kami membuat referensi tunggu untuk kelas " WebDriverWait " dan membuat instance menggunakan referensi " WebDriver ", dan kami memberikan kerangka waktu maksimum 20 detik.

Sintaksis:

WebDriverWait tunggu = WebDriverWait baru (WebDriverRefrence, TimeOut);
paket guru.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;impor org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;kelas publik AppTest2 {driver WebDriver yang dilindungi;@Ujipublic void guru99tutorials () melempar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");driver = new ChromeDriver ();WebDriverWait tunggu = WebDriverWait baru (driver, 20);String eTitle = "Halaman Demo Guru99";String aTitle = "";// luncurkan Chrome dan arahkan ke URL Dasardriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimalkan jendela browserdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenarnya dari judulaTitle = driver.getTitle ();// bandingkan judul sebenarnya dengan judul yang diharapkanif (aTitle.contentEquals (eTitle)){System.out.println ("Tes Lulus");}lain {System.out.println ("Tes Gagal");}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();}}

Penjelasan Kode

Pertimbangkan Kode Berikut:

WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i ")));guru99seleniumlink.click ();

Dalam contoh tunggu WebDriver ini, tunggu jumlah waktu yang ditentukan di kelas " WebDriverWait " atau " ExpectedConditions " terjadi mana saja yang terjadi lebih dulu.

Kode Java di atas menyatakan bahwa kami menunggu elemen untuk jangka waktu 20 detik seperti yang ditentukan dalam kelas " WebDriverWait " di halaman web hingga " ExpectedConditions " terpenuhi dan kondisinya adalah " visibilityofElementLocated ".

Berikut ini adalah Kondisi yang Diharapkan yang dapat digunakan dalam Selenium Explicit Wait

  1. alertIsPresent ()
  2. elementSelectionStateToBe ()
  3. elementToBeClickable ()
  4. elementToBeSelected ()
  5. frameToBeAvaliableAndSwitchToIt ()
  6. invisibilityOfTheElementLocated ()
  7. invisibilityOfElementWithText ()
  8. presenceOfAllElementsLocatedBy ()
  9. presenceOfElementLocated ()
  10. textToBePresentInElement ()
  11. textToBePresentInElementLocated ()
  12. textToBePresentInElementValue ()
  13. titleIs ()
  14. titleContains ()
  15. visibilityOf ()
  16. visibilityOfAllElements ()
  17. visibilityOfAllElementsLocatedBy ()
  18. visibilityOfElementLocated ()

Penantian Lancar di Selenium

The Tunggu Fasih dalam Selenium digunakan untuk mendefinisikan waktu maksimum untuk pengemudi web untuk menunggu kondisi, serta frekuensi yang kita ingin memeriksa kondisi sebelum melemparkan sebuah "ElementNotVisibleException" pengecualian. Ia memeriksa elemen web secara berkala hingga objek ditemukan atau batas waktu terjadi.

Frekuensi: Menyiapkan siklus berulang dengan kerangka waktu untuk memverifikasi / memeriksa kondisi pada interval waktu reguler

Mari pertimbangkan skenario di mana elemen dimuat pada interval waktu yang berbeda. Elemen tersebut mungkin dimuat dalam 10 detik, 20 detik atau bahkan lebih dari itu jika kita menyatakan menunggu eksplisit 20 detik. Ini akan menunggu sampai waktu yang ditentukan sebelum melempar pengecualian. Dalam skenario seperti itu, waktu tunggu yang lancar adalah waktu tunggu yang ideal untuk digunakan karena ini akan mencoba menemukan elemen pada frekuensi yang berbeda hingga menemukannya atau penghitung waktu akhir habis.

Sintaksis:

Wait wait = new FluentWait (referensi WebDriver).withTimeout (waktu tunggu, SECONDS).pollingEvery (waktu tunggu, SECONDS).ignoring (Exception.class);

Kode di atas tidak digunakan lagi di Selenium v3.11 dan yang lebih baru. Anda perlu menggunakan

Wait wait = new FluentWait (referensi WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).ignoring (Exception.class);
paket guru.test99;import org.testng.annotations.Test;import java.util.NoSuchElementException;import java.util.concurrent.TimeUnit;import java.util.function.Function;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;impor org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;impor org.openqa.selenium.support.ui.FluentWait;impor org.openqa.selenium.support.ui.Wait;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;kelas publik AppTest3 {driver WebDriver yang dilindungi;@Ujipublic void guru99tutorials () melempar InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Halaman Demo Guru99";String aTitle = "";driver = new ChromeDriver ();// luncurkan Chrome dan arahkan ke URL Dasardriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimalkan jendela browserdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenarnya dari judulaTitle = driver.getTitle ();// bandingkan judul sebenarnya dengan judul yang diharapkanif (aTitle.contentEquals (eTitle)){System.out.println ("Tes Lulus");}lain {System.out.println ("Tes Gagal");}Tunggu  tunggu = new FluentWait  (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (Fungsi baru  () {publik WebElement berlaku (driver WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i "));}});// klik pada tautan seleniumclickseleniumlink.click ();// tutup ~ browserdriver.close ();}}

Penjelasan Kode

Pertimbangkan Kode Berikut:

Tunggu  tunggu = new FluentWait  (driver).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);

Pada contoh di atas, kami mendeklarasikan waktu tunggu yang lancar dengan batas waktu 30 detik dan frekuensi disetel ke 5 detik dengan mengabaikan " NoSuchElementException "

Pertimbangkan Kode Berikut:

publik WebElement berlaku (driver WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i ")); 

Kami telah membuat fungsi baru untuk mengidentifikasi Elemen Web di halaman. (Mis: Di sini Elemen Web tidak lain adalah tautan Selenium di halaman web).

Frekuensi diatur ke 5 detik dan waktu maksimum diatur ke 30 detik. Jadi ini berarti ia akan memeriksa elemen di halaman web setiap 5 detik untuk waktu maksimum 30 detik. Jika elemen berada dalam jangka waktu ini, ia akan melakukan operasi lain, ia akan memunculkan " ElementNotVisibleException "

Perbedaan antara Tunggu Implisit Vs Tunggu Eksplisit

Penantian Tersirat Penantian Eksplisit
  • Waktu tunggu implisit diterapkan ke semua elemen dalam skrip
  • Waktu tunggu eksplisit hanya diterapkan pada elemen yang kami maksudkan
  • Dalam Tunggu Implisit, kita tidak perlu menetapkan "ExpectedConditions" pada elemen yang akan ditempatkan
  • Dalam Explicit Wait, kita perlu menentukan "ExpectedConditions" pada elemen yang akan ditempatkan
  • Direkomendasikan untuk digunakan ketika elemen berada dengan kerangka waktu yang ditentukan dalam Selenium implisit menunggu
  • Direkomendasikan untuk digunakan saat elemen memerlukan waktu lama untuk dimuat dan juga untuk memverifikasi properti elemen seperti (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Kesimpulan:

Penantian Implisit, Eksplisit, dan Lancar adalah waktu tunggu berbeda yang digunakan di Selenium. Penggunaan waktu tunggu ini sepenuhnya didasarkan pada elemen yang dimuat pada interval waktu yang berbeda. Itu selalu tidak disarankan untuk menggunakan Thread.Sleep () saat Menguji aplikasi kita atau membangun kerangka kerja kita.

Artikel ini dikontribusikan oleh Chaitanya Pujari