Selenium Tunggu – Implisit dan Eksplisit dengan Sintaksis


In Selenium, "Menunggu" memainkan peran penting dalam melaksanakan pengujian. Dalam tutorial ini, Anda akan mempelajari berbagai aspek dan perbedaan antara menunggu Implisit dan Eksplisit Selenium.

Mengapa Kita Perlu Menunggu Selenium?

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

Hal ini tidak hanya membuat sulit untuk mengidentifikasi elemen tetapi juga jika elemen tersebut tidak ditemukan maka akan menimbulkan “ElementNotVisibleException" pengecualian. Menggunakan Selenium Tunggu, kita bisa mengatasi masalah ini.

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

Misalkan kita mencoba mencari elemen yang memiliki beberapa “Kondisi yang Diharapkan “(Explicit Wait), Jika elemen tidak berada dalam jangka waktu yang ditentukan oleh Explicit wait(10 Seconds), Ini akan menggunakan jangka waktu yang ditentukan oleh implicit wait(20 seconds) sebelum melempar “ElementNotVisibleException".

Selenium Driver Web Menunggu

  1. Penantian Tersirat
  2. Penantian Eksplisit

Dalam tutorial ini, Anda akan belajar tentang berbagai jenis menunggu Selenium:

Tunggu secara implisit Selenium

The Tunggu secara implisit Selenium digunakan untuk memberi tahu web driver agar menunggu selama jangka waktu tertentu sebelum memunculkan “No Such Element Exception”. Pengaturan default adalah 0. Setelah kita menyetel waktu, web driver akan menunggu elemen tersebut selama jangka waktu tersebut sebelum memunculkan pengecualian.

Selenium Web Driver telah meminjam gagasan tentang menunggu implisit Watir.

Dalam contoh di bawah ini kami telah mendeklarasikan waktu tunggu implisit dengan jangka waktu 10 detik. Artinya, jika elemen tidak terletak di halaman web dalam jangka waktu tersebut, maka akan muncul pengecualian.

Untuk menyatakan menunggu secara implisit Selenium Pengemudi Web:

Sintaks Tunggu Implisit:

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package guru.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;
public class AppTest {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

Penjelasan Kode

Dalam contoh di atas,

Pertimbangkan Kode Berikut:

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

Tunggu implisit akan menerima 2 parameter, parameter pertama akan menerima waktu sebagai nilai integer dan parameter kedua akan menerima pengukuran waktu dalam SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS, dll.

Tunggu Eksplisit Selenium

The Tunggu Eksplisit Selenium digunakan untuk memberi tahu Web Driver agar menunggu kondisi tertentu (Kondisi yang Diharapkan) atau waktu maksimum terlampaui sebelum memunculkan pengecualian “ElementNotVisibleException”. Ini adalah jenis penantian yang cerdas, tetapi hanya dapat diterapkan untuk elemen tertentu. Ini memberikan opsi yang lebih baik daripada penantian implisit karena menunggu elemen Ajax yang dimuat secara dinamis.

Setelah kami menyatakan menunggu secara eksplisit, kami harus menggunakan “Kondisi yang Diharapkan” atau kita dapat mengkonfigurasi seberapa sering kita ingin memeriksa kondisi menggunakan Penantian Lancar. Saat ini saat mengimplementasikan kami menggunakan Thread.Tidur() umumnya tidak disarankan untuk digunakan

Dalam contoh di bawah ini, kami membuat referensi tunggu untuk “WebDriverTunggu” kelas dan membuat instance menggunakan “webdriver” referensi, dan kami memberikan jangka waktu maksimum 20 detik.

Sintaks Tunggu Eksplisit:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package guru.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;

public class AppTest2 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	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 selama waktu yang ditentukan di kolom “WebDriverTunggu” kelas atau “Kondisi yang Diharapkan” terjadi, mana saja yang terjadi lebih dulu.

Atas Java kode menyatakan bahwa kita sedang menunggu elemen untuk jangka waktu 20 detik seperti yang ditentukan dalam “WebDriverTunggu” kelas di halaman web hingga “Kondisi yang Diharapkan” terpenuhi dan syaratnya adalah “visibilitasElementLocated".

Berikut ini adalah Kondisi Harapan yang dapat digunakan dalam Selenium Penantian Eksplisit

  1. peringatanIsPresent()
  2. elemenSelectionStateToBe()
  3. elemenToBeClickable()
  4. elemenToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. tembus pandangOfTheElementLocated()
  7. tembus pandangElemenDenganTeks()
  8. kehadiranSemuaElementsLocatedBy()
  9. kehadiranElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. judulIs()
  14. judulBerisi()
  15. visibilitas()
  16. visibilitasSemuaElemen()
  17. visibilitasSemuaElementsLocatedBy()
  18. visibilitasOfElementLocated()

Lancar Tunggu masuk Selenium

The Lancar Tunggu masuk Selenium digunakan untuk menentukan waktu maksimum bagi driver web untuk menunggu suatu kondisi, serta frekuensi yang ingin kita periksa sebelum memunculkan pengecualian “ElementNotVisibleException”. Ia memeriksa elemen web secara berkala hingga objek ditemukan atau terjadi batas waktu.

Frekuensi: Menyiapkan siklus berulang dengan jangka waktu untuk memverifikasi/memeriksa kondisi pada interval waktu yang teratur

Mari kita pertimbangkan skenario di mana suatu elemen dimuat pada interval waktu yang berbeda. Elemen tersebut mungkin dimuat dalam waktu 10 detik, 20 detik atau bahkan lebih dari itu jika kita mendeklarasikan penantian eksplisit selama 20 detik. Elemen tersebut akan menunggu hingga waktu yang ditentukan sebelum memunculkan pengecualian. Dalam skenario seperti itu, penantian lancar adalah penantian ideal untuk digunakan karena ini akan mencoba menemukan elemen pada frekuensi yang berbeda hingga elemen tersebut ditemukan atau penghitung waktu terakhir habis.

Sintaks Tunggu Lancar:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

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

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(SECONDS))
.ignoring(Exception.class);

package 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;
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.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest3 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			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"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

Penjelasan Kode

Pertimbangkan Kode Berikut:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

Pada contoh di atas, kita mendeklarasikan menunggu lancar dengan batas waktu 30 detik dan frekuensi disetel ke 5 detik dengan mengabaikan “Tidak Ada Pengecualian Elemen Seperti Itu"

Pertimbangkan Kode Berikut:

public WebElement apply(WebDriver driver) {
        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 pada halaman. (Contoh: Di sini Elemen Web tidak lain adalah Selenium tautan di halaman web).

Frekuensi diatur ke 5 detik dan waktu maksimum diatur ke 30 detik. Artinya, ia akan memeriksa elemen pada halaman web setiap 5 detik untuk waktu maksimum 30 detik. Jika elemen berada dalam jangka waktu ini, ia akan melakukan operasi, jika tidak, ia akan memunculkan “ElementNotVisibleException"

Juga Periksa: - Selenium Tutorial IDE untuk Pemula

Perbedaan Antara Tunggu Implisit Vs Tunggu Eksplisit

Berikut ini adalah perbedaan utama antara menunggu implisit dan menunggu eksplisit dalam Selenium:

Penantian Tersirat Penantian Eksplisit
Waktu Tunggu Implisit diterapkan ke semua elemen dalam skrip Waktu Tunggu Eksplisit hanya diterapkan pada elemen-elemen yang kami maksudkan
Dalam Tunggu Implisit, kita perlu tidak tentukan "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 jangka waktu yang ditentukan Selenium menunggu implisit Direkomendasikan untuk digunakan ketika elemen memerlukan waktu lama untuk dimuat dan juga untuk memverifikasi properti elemen seperti (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Kesimpulan

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

Juga Periksa: - Selenium Tutorial untuk Pemula: Pelajari WebDriver dalam 7 Hari