Di Selenium, "Waits" memainkan peranan penting dalam melaksanakan ujian. Dalam tutorial ini, anda akan mempelajari pelbagai aspek baik penantian "Implisit" dan "Eksplisit" di Selenium.
Dalam tutorial ini, anda akan belajar:
- Mengapa Kita Perlu Menunggu di Selenium?
- Tunggu Tersirat
- Tunggu Eksplisit
- Menunggu Fasih
Mengapa Kita Perlu Menunggu di Selenium?
Sebilangan besar aplikasi web dibangunkan menggunakan Ajax dan Javascript. Apabila halaman dimuat oleh penyemak imbas, elemen yang ingin kita berinteraksi mungkin dimuat pada selang waktu yang berbeza.
Ini bukan sahaja menjadikannya sukar untuk mengenal pasti elemen tetapi juga jika elemen tersebut tidak berada, ia akan membuang pengecualian " ElementNotVisibleException ". Dengan Selenium Waits, kita dapat menyelesaikan masalah ini.
Mari pertimbangkan senario di mana kita harus menggunakan penantian tersirat dan eksplisit dalam ujian kita. Anggap bahawa masa menunggu tersirat ditetapkan menjadi 20 saat dan masa menunggu eksplisit ditetapkan kepada 10 saat.
Andaikan kita berusaha mencari elemen yang memiliki beberapa "ExpectedConditions " (Explicit Wait), Jika elemen tersebut tidak berada dalam jangka waktu yang ditentukan oleh Explicit waiting (10 Detik), Ia akan menggunakan jangka masa yang ditentukan oleh implisit waiting ( 20 saat) sebelum melemparkan " ElementNotVisibleException ".
Pemandu Web Selenium Menunggu
- Tunggu Tersirat
- Tunggu Eksplisit
Tunggu Tersirat di Selenium
The Wait tersirat dalam Selenium digunakan untuk memberitahu pemandu web untuk menunggu untuk jumlah tertentu masa sebelum ia melemparkan "Tidak seperti Element Pengecualian". Tetapan lalai adalah 0. Setelah kami menetapkan waktu, pemacu web akan menunggu elemen untuk masa itu sebelum membuang pengecualian.
Pemandu Web Selenium telah meminjam idea penantian tersirat dari Watir.
Dalam contoh di bawah ini kami telah menyatakan penantian tersirat dengan jangka masa 10 saat. Ini bermaksud bahawa jika elemen tersebut tidak berada di laman web dalam jangka masa tersebut, maka akan ada pengecualian.
Untuk menyatakan penantian tersirat:
Sintaks :
driver.manage (). timeout (). secara implisitWait (TimeOut, TimeUnit.SECONDS);
guru pakej.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;AppTest kelas awam {pemacu WebDriver yang dilindungi;@ Ujianawam99tutorials kosong () melemparkan InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");pemacu = ChromeDriver baru ();driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);Rentetan eTitle = "Halaman Demo Guru99";Rentetan aTitle = "";// lancarkan Chrome dan hantar semula ke URL Pangkalandriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimumkan tetingkap penyemak imbasdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenar tajukaTitle = driver.getTitle ();// bandingkan tajuk sebenar dengan tajuk yang diharapkanjika (aTitle.equals (eTitle)){System.out.println ("Ujian Lulus");}lain {System.out.println ("Ujian Gagal");}// tutup penyemak imbaspemandu.tutup ();}}
Penjelasan Kod
Dalam contoh di atas,
Pertimbangkan Mengikuti Kod:
driver.manage (). timeout (). secara implisitWait (10, TimeUnit.SECONDS);
Penantian yang tersirat akan menerima 2 parameter, parameter pertama akan menerima waktu sebagai nilai integer dan parameter kedua akan menerima pengukuran masa dari segi SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS, dll.
Tunggu Eksplisit di Selenium
The Wait Explicit dalam Selenium digunakan untuk memberitahu pemandu Web untuk menunggu syarat-syarat tertentu (Jangkaan Syarat) atau masa maksimum melebihi sebelum melontar "ElementNotVisibleException" terkecuali. Ini adalah jenis penantian yang cerdas, tetapi hanya dapat digunakan untuk elemen tertentu Ia memberikan pilihan yang lebih baik daripada menunggu tersirat kerana menunggu elemen Ajax yang dimuat secara dinamik.
Sebaik sahaja kita menyatakan penantian eksplisit kita harus menggunakan " ExpectedConditions " atau kita dapat mengkonfigurasi seberapa kerap kita ingin memeriksa keadaan menggunakan Fluent Wait . Hari-hari ini semasa melaksanakan kami menggunakan Thread.Sleep () umumnya tidak digalakkan untuk digunakan
Dalam contoh di bawah, kami membuat rujukan menunggu kelas " WebDriverWait " dan membuat instansi menggunakan rujukan " WebDriver ", dan kami memberikan jangka waktu maksimum 20 saat.
Sintaks:
WebDriverWait waiting = WebDriverWait baru (WebDriverRefrence, TimeOut);
guru pakej.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;AppTest2 kelas awam {pemacu WebDriver yang dilindungi;@ Ujianawam99tutorials kosong () melemparkan InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");pemacu = ChromeDriver baru ();WebDriverWait waiting = WebDriverWait baru (pemandu, 20);Rentetan eTitle = "Halaman Demo Guru99";Rentetan aTitle = "";// lancarkan Chrome dan hantar semula ke URL Pangkalandriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimumkan tetingkap penyemak imbasdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenar tajukaTitle = driver.getTitle ();// bandingkan tajuk sebenar dengan tajuk yang diharapkanjika (aTitle.contentEquals (eTitle)){System.out.println ("Ujian Lulus");}lain {System.out.println ("Ujian Gagal");}WebElement guru99seleniumlink;guru99seleniumlink = tunggu.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.klik ();}}
Penjelasan Kod
Pertimbangkan Mengikuti Kod:
WebElement guru99seleniumlink;guru99seleniumlink = tunggu.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.klik ();
Dalam contoh tunggu WebDriver ini, tunggu jumlah masa yang ditentukan dalam kelas " WebDriverWait " atau " ExpectedConditions " berlaku yang mana yang berlaku terlebih dahulu.
Kod Java di atas menyatakan bahawa kita sedang menunggu elemen untuk jangka waktu 20 saat seperti yang ditentukan dalam kelas " WebDriverWait " di laman web sehingga " ExpectedConditions " dipenuhi dan syaratnya adalah " visibilityofElementLocated ".
Berikut adalah Keadaan yang Diharapkan yang boleh digunakan dalam Selenium Explicit Wait
- waspadaIsPresent ()
- elemenSelectionStateToBe ()
- elementToBeKlik ()
- elemenToBePilih ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- kehadiranOfAllElementsLocatedBy ()
- kehadiranOfElementLokasi ()
- textToBePresentInElement ()
- textToBePresentInElementLokasi ()
- textToBePresentInElementValue ()
- tajukIs ()
- tajukMengandungi ()
- penglihatanOf ()
- keterlihatanOfAllElements ()
- keterlihatanOfAllElementsLocatedBy ()
- keterlihatanOfElementLokasi ()
Fasih Menunggu di Selenium
The Wait Fasih dalam Selenium digunakan untuk menentukan masa maksimum untuk pemandu web untuk menunggu keadaan, serta kekerapan yang kita mahu untuk memeriksa keadaan sebelum melontar satu "ElementNotVisibleException" terkecuali. Ia memeriksa elemen web secara berkala sehingga objek dijumpai atau waktu tamat berlaku.
Kekerapan: Menyiapkan kitaran berulang dengan jangka masa untuk mengesahkan / memeriksa keadaan pada selang waktu biasa
Mari kita pertimbangkan senario di mana elemen dimuat pada selang masa yang berbeza. Elemen itu mungkin dimuat dalam 10 saat, 20 saat atau lebih dari itu jika kita menyatakan penantian eksplisit selama 20 saat. Ia akan menunggu sehingga waktu yang ditentukan sebelum membuang pengecualian. Dalam senario seperti itu, penantian lancar adalah penantian yang sesuai untuk digunakan kerana ini akan berusaha mencari elemen pada frekuensi yang berbeza sehingga ia menemukannya atau pemasa akhir habis.
Sintaks:
Tunggu tunggu = FluentWait baru (rujukan WebDriver).withTimeout (timeout, SECONDS).pollingSetiap (timeout, SECONDS).ignoring (Exception.class);
Kod di atas tidak lagi digunakan di Selenium v3.11 dan ke atas. Anda perlu menggunakan
Tunggu tunggu = FluentWait baru (rujukan WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Tempoh.seconds (SECONDS)).ignoring (Exception.class);
guru pakej.test99;import org.testng.annotations.Test;import java.util.NoSuchElementException;import java.util.concurrent.TimeUnit;import java.util.fungsi.Fungsi;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.FluentWait;import org.openqa.selenium.support.ui.Tunggu;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;kelas awam AppTest3 {pemacu WebDriver yang dilindungi;@ Ujianawam99tutorials kosong () melemparkan InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");Rentetan eTitle = "Halaman Demo Guru99";Rentetan aTitle = "";pemacu = ChromeDriver baru ();// lancarkan Chrome dan hantar semula ke URL Pangkalandriver.get ("http://demo.guru99.com/test/guru99home/");// Memaksimumkan tetingkap penyemak imbasdriver.manage (). window (). maksimalkan ();// dapatkan nilai sebenar tajukaTitle = driver.getTitle ();// bandingkan tajuk sebenar dengan tajuk yang diharapkanjika (aTitle.contentEquals (eTitle)){System.out.println ("Ujian Lulus");}lain {System.out.println ("Ujian Gagal");}Tunggutunggu = FluentWait baru (pemandu).withTimeout (30, TimeUnit.SECONDS).pollingSetiap (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = waiting.until (Fungsi baru () {WebElement awam berlaku (pemacu WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / bahagian / 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 pautan seleniumclickseleniumlink.click ();// tutup ~ penyemak imbaspemandu.tutup ();}}
Penjelasan Kod
Pertimbangkan Mengikuti Kod:
Tunggutunggu = FluentWait baru (pemandu).withTimeout (30, TimeUnit.SECONDS).pollingSetiap (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);
Dalam contoh di atas, kami menyatakan penantian lancar dengan tamat masa 30 saat dan frekuensi ditetapkan ke 5 saat dengan mengabaikan " NoSuchElementException "
Pertimbangkan Mengikuti Kod:
WebElement awam berlaku (pemacu WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / bahagian / 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 mengenal pasti Elemen Web di halaman. (Cth: Di sini Elemen Web tidak lain adalah pautan Selenium di laman web).
Kekerapan ditetapkan 5 saat dan masa maksimum ditetapkan pada 30 saat. Oleh itu ini bermaksud bahawa ia akan memeriksa elemen di laman web setiap 5 saat untuk masa maksimum 30 saat. Sekiranya elemen terletak dalam jangka masa ini, ia akan melakukan operasi yang lain, ia akan melemparkan " ElementNotVisibleException "
Perbezaan antara Tunggu Tersirat dengan Tantangan Eksplisit
Tunggu Tersirat | Tunggu Eksplisit |
---|---|
|
|
|
|
|
|
Kesimpulan:
Penantian Implisit, Eksplisit dan Fasih adalah penantian berbeza yang digunakan di Selenium. Penggunaan penantian ini sepenuhnya bergantung pada unsur-unsur yang dimuat pada selang waktu yang berbeza. Selalunya tidak digalakkan menggunakan Thread.Sleep () semasa Menguji aplikasi kita atau membina kerangka kerja kita.
Artikel ini disumbangkan oleh Chaitanya Pujari