Örtük ve Açık Bekleme Selenium Sözdizimi ile
⚡ Akıllı Özet
Selenium Bekleme komutları, otomasyon komut dosyalarını dinamik sayfa davranışıyla senkronize ederek, eşzamansız olarak yüklenen öğelerden kaynaklanan test hatalarını önler. Bu referans, WebDriver sözdizimiyle çalışan Örtük, Açık ve Akıcı Bekleme stratejilerini açıklamaktadır. Java Kod örnekleri ve istikrarlı, güvenilir test yürütmesi için uygun bekleme süresini seçmeye yönelik pratik kılavuz.

In SeleniumTestlerin güvenilir bir şekilde yürütülmesinde "Bekleme" komutları önemli bir rol oynar. Bu eğitimde, örtük (Implicit) ve açık (Explicit) bekleme komutları arasındaki temel yönleri ve farkları öğreneceksiniz. SeleniumAyrıca, pratik Fluent Wait kullanımını da içerir.
Neden Beklemeye İhtiyacımız Var? Selenium?
Modern web uygulamalarının çoğu şu yöntemlerle geliştirilmektedir: Ajax hem de JavaSenaryoBir sayfa tarayıcı tarafından yüklendiğinde, etkileşimde bulunmak istediğimiz öğeler farklı zaman aralıklarında yüklenebilir.
Bu durum, element tanımlamasını zorlaştırmakla kalmaz, aynı zamanda element zamanında bulunamazsa, Selenium bir atacak ElementNotVisibleException. Selenium Bekleme işlemleri, WebDriver'a bir öğeyi bulmadan önce hata vermesi için tanımlanmış bir zaman aralığı vererek bu senkronizasyon sorununu çözer.
Aynı testte hem örtük hem de açık bekleme sürelerinin kullanıldığı bir senaryoyu ele alalım. Örtük bekleme süresinin 20 saniye, açık bekleme süresinin ise 10 saniye olarak ayarlandığını varsayalım.
Eğer belirli bir kurala bağlı bir unsur arıyorsak Beklenen Koşullar (Açık Bekleme) ve öğe 10 saniyelik açık bekleme süresi içinde bulunmuyorsa, WebDriver bir hata fırlatmadan önce 20 saniyelik örtülü bekleme süresine geri döner. ElementNotVisibleException.
Selenium WebDriver Beklemeleri
- örtük bekle
- Açık Bekleyin
- akıcı bekle
Örtülü Bekleme Selenium
MKS Örtülü Bekleme Selenium Bu parametre, WebDriver'ın NoSuchElementException hatası vermeden önce tanımlanmış bir süre beklemesini sağlar. Varsayılan değer 0'dır. Yapılandırıldıktan sonra, WebDriver hata vermeden önce bu süre boyunca DOM'u kontrol eder. Selenium WebDriver, örtük bekleme kavramını miras almıştır. Watir.
Aşağıdaki örnekte, 10 saniyelik bir süreyle örtük bir bekleme tanımlıyoruz. Eğer öğe bu süre içinde bulunmuyorsa, bir istisna fırlatılır.
Örtük Bekleme Sözdizimi (Selenium 4):
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
package guru.test99;
import java.time.Duration;
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 {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
String eTitle = "Demo Guru99 Page";
String aTitle = "";
// launch Chrome and redirect it to the Base URL
driver.get("https://demo.guru99.com/test/guru99home/");
// Maximize 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();
}
}
Açıklaması Code
Yukarıdaki örnekte, aşağıdaki ifadeyi ele alalım:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
Selenium 4. sürüm, eski iki argümanlı imzayı (tamsayı artı TimeUnit) tek bir Duration argümanıyla değiştirdi. Duration sınıfı, Duration.ofSeconds, Duration.ofMillis ve Duration.ofMinutes gibi statik yardımcı fonksiyonlar aracılığıyla saniye, dakika, milisaniye ve diğer zaman birimlerini destekler.
Açık Bekleme Selenium
MKS Açık Bekleme Selenium WebDriver'a, ElementNotVisibleException hatası vermeden önce belirli koşulları (Beklenen Koşullar) veya maksimum bir süre beklemesini söyler. Bu daha akıllı bir bekleme yöntemidir çünkü yalnızca belirtilen öğeye uygulanır. Testin dinamik olarak yüklenen Ajax içeriğini işlemesi gerektiğinde, Açık Bekleme, Örtülü Beklemeye tercih edilir.
Açık bir bekleme süresi tanımlandıktan sonra, şunu kullanmalısınız: Beklenen KoşullarYa da yoklama sıklığını şu şekilde yapılandırabilirsiniz: akıcı bekle. Kullanmaktan kaçın Konu.uyku()Çünkü bu, yürütmeyi koşulsuz olarak durdurur ve genellikle kötü bir uygulama olarak kabul edilir.
Aşağıdaki örnekte, bir referans oluşturuyoruz. Web SürücüsüBekle sınıfı, şu şekilde örneklendirin: Web Sürücüsü Referans olarak, maksimum 20 saniyelik bir pencere süresi yapılandırın.
Açık Bekleme Sözdizimi (Selenium 4):
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
package guru.test99;
import java.time.Duration;
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 {
driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(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/");
// Maximize 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();
}
}
Açıklaması Code
Aşağıdaki kodu göz önünde bulundurun:
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();
Bu WebDriverWait örneğinde, komut dosyası, tanımlandığı gibi 20 saniyeye kadar bekler. Web SürücüsüBekle sınıfa kadar Beklenen Koşullar hangisi önce gerçekleşirse o şekilde tatmin olunur.
Yukarıdaki Java Kod, koşulun gerçekleşmesi için 20 saniyeye kadar bekler. Öğenin görünürlüğü gerçek olamayacak kadar.
Aşağıdaki Beklenen Koşullar kullanılabilir. Selenium Açık Bekleyin:
- uyarıIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- FrameToBeAvailableAndSwitchToIt()
- görünmezlikOfTheElementLocated()
- görünmezlikOfElementWithText()
- PresenceOfAllElementsLocatedBy()
- PresenceOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- başlıkIs()
- başlıkİçerir()
- görünürlükOf()
- görünürlükOfAllElements()
- görünürlükOfAllElementsLocatedBy()
- görünürlükOfElementLocated()
Akıcı Bekleme Selenium
MKS Akıcı Bekleme Selenium WebDriver'ın bir koşulun gerçekleşmesini beklemesi için maksimum süreyi ve ElementNotVisibleException hatası vermeden önce bu koşulun doğrulanması için yoklama sıklığını tanımlar. Fluent Wait, nesne bulunana veya zaman aşımı süresi dolana kadar düzenli aralıklarla öğeyi kontrol eder.
Sıklık: Durumun düzenli aralıklarla değerlendirilmesi için tekrarlanan döngü.
Bir öğenin öngörülemeyen aralıklarla yüklendiği bir senaryoyu ele alalım. Öğe 10 saniyede, 20 saniyede veya daha uzun sürede yüklenebilir. Eğer 20 saniyelik açık bir bekleme süresi belirtirsek, komut dosyası başarısız olmadan önce tam süre boyunca bekleyecektir. Bu gibi durumlarda, Fluent Wait ideal bir seçimdir çünkü öğe bulunana veya son zamanlayıcı süresi dolana kadar belirtilen sıklıkta sorgulama yapar.
Akıcı Bekleme Sözdizimi (Selenium 4):
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
Tam sayı değerlerini ve TimeUnit'i kabul eden eski imza biçimi kullanımdan kaldırılmıştır. Selenium 3.11'de kaldırıldı Selenium 4. Yukarıda gösterilen Süre tabanlı API, şu anda önerilen yaklaşımdır.
package guru.test99;
import java.time.Duration;
import java.util.NoSuchElementException;
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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.testng.annotations.Test;
public class AppTest3 {
protected WebDriver driver;
@Test
public void guru99tutorials() throws InterruptedException {
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/");
// Maximize 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<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.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();
}
}
Açıklaması Code
Aşağıdaki kodu göz önünde bulundurun:
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
Yukarıdaki örnekte, 30 saniyelik bir zaman aşımı, 5 saniyelik bir yoklama sıklığı ve göz ardı etme özelliğiyle bir Fluent Wait tanımlıyoruz. NoSuchElementException.
Aşağıdaki kodu göz önünde bulundurun:
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"));
}
Bu fonksiyon, sayfadaki WebElement'i tanımlar (burada, Selenium Ana sayfadaki bağlantı). 5 saniyelik yoklama aralığı ve 30 saniyelik zaman aşımı ile bekleme işlemi, öğeyi en fazla 30 saniye boyunca her 5 saniyede bir kontrol eder. Öğe bu zaman aralığı içinde bulunuyorsa, komut dosyası devam eder. Aksi takdirde, bir ElementNotVisibleException Atıldı.
Ayrıca kontrol edin: Selenium Yeni Başlayanlar İçin IDE Eğitimi
Örtülü Bekleme ile Açık Bekleme Arasındaki Fark
Aşağıdaki tabloda, örtük bekleme (Implicit Wait) ve açık bekleme (Explicit Wait) arasındaki temel farklar vurgulanmaktadır. Selenium.
| örtük bekle | Açık Bekleyin |
|---|---|
| Komut dosyasındaki tüm öğelere örtük bekleme süresi uygulanır. | Belirtilen bekleme süresi yalnızca özellikle hedeflenen öğelere uygulanır. |
| Örtük Bekleme (Implicit Wait) yönteminde, öğe için Beklenen Koşullar (ExpectedConditions) belirtilmez. | Açık Bekleme (Explicit Wait) yönteminde, öğe için ExpectedConditions tanımlanmalıdır. |
| Öğeler yapılandırılmış örtülü bekleme penceresi içinde yüklendiğinde önerilir. | Öğelerin yüklenmesi daha uzun sürdüğünde ve visibilityOfElementLocated, elementToBeClickable veya elementToBeSelected gibi öğe durumlarını doğrularırken önerilir. |
| Bir kez ayarlanır ve WebDriver örneğinin yaşam döngüsü boyunca uygulanır. | Her bir öğe veya her bir kontrol için ayrı ayrı ayar yaparak daha hassas kontrol imkanı elde edersiniz. |
Doğru Bekleme Stratejisi Nasıl Seçilir?
Doğru bekleme komutunu seçmek, komut dosyasının kararlılığını ve yürütme süresini doğrudan etkiler. Her senaryo için uygun seçeneği belirlemek üzere bu karar çerçevesini kullanın.
- Yük dağılımını belirleyin: Öğenin belirli bir zamanda, Ajax yanıtından sonra mı yoksa öngörülemeyen aralıklarla mı göründüğünü kontrol edin. Sabit yükler için Örtülü Bekleme (Implicit Wait) uygundur, öngörülemeyen yükler için ise Akıcı Bekleme (Fluent Wait) gereklidir.
- Örtük ve açık bekleme durumlarını karıştırmaktan kaçının: İkisinin birleştirilmesi, daha uzun bekleme süresinin baskın gelmesi nedeniyle beklenmedik gecikmelere neden olabilir. Selenium Dokümantasyonda, WebDriver oturumu başına yalnızca bir strateji kullanılması önerilmektedir.
- Dinamik içerik için varsayılan olarak açık bekleme seçeneğini kullanın: Sayfalar Ajax'a, koşullu oluşturmaya veya animasyonlara bağlı olduğunda, ExpectedConditions ile Explicit Wait tam olarak önemli olan öğeyi hedefler.
- Değişken zamanlama için Fluent Wait kullanın: Çalıştırmalar arasında eleman yükleme zamanlaması değişiyorsa, Fluent Wait'i bir yoklama aralığıyla yapılandırın. Yoklama, tek bir uzun zaman aşımına kıyasla toplam bekleme süresini azaltır.
- Thread.sleep'i değiştirin: Sabit kodlanmış bekleme süreleri test paketlerini yavaşlatır ve gerçek zamanlama sorunlarını gizler. Hızlı ve belirleyici bir yürütme sağlamak için bunları koşullu beklemelerle değiştirin.
- Zaman aşımı değerlerini ayarlayın: Kısa zaman aşımı süreleriyle (5-10 saniye) başlayın ve yalnızca arızalar gerçek yavaş yüklemeyi gösterdiğinde süreyi artırın. Uzun varsayılan zaman aşımı süreleri, performans düşüşlerini gizler.
- Yardımcı programlarda bekleme sürelerini koruyun: Bekleme mantığını yardımcı bir sınıfta merkezileştirin, böylece zaman aşımı politikası değişiklikleri tüm test paketine uygulansın.
Bu çerçeveyi takip ederek, otomasyon mühendisleri yavaşlamadan veya kırılgan hale gelmeden gerçek uygulama zamanlamasına uyum sağlayan dayanıklı komut dosyaları oluşturabilirler.
Sıkça Yapılan Hatalardan Kaçınmak Selenium bekler
Deneyimli test uzmanları bile, test yaparken tekrar eden küçük bir dizi tuzağa düşerler. Selenium Beklemelerden kaçınmak, komut dosyalarının hızlı, belirleyici ve ekipler ve ortamlar genelinde bakımı kolay olmasını sağlar.
İlk yaygın hata, Thread.sleep'i aşırı kullanmaktır. Sabit kodlanmış bir duraklama, betiğin öğenin gerçek kullanılabilirliğinden bağımsız olarak tam süre boyunca beklemesini zorlar ve bu da toplam çalışma süresini artırır. Bu tür duraklamaları Explicit veya Fluent Wait ile değiştirin, böylece betik koşul karşılandığı anda devam eder.
İkinci hata, aynı testte örtük ve açık bekleme mekanizmalarını karıştırmaktır. Bu iki mekanizma birleşerek, hata ayıklaması zor olan öngörülemeyen zaman aşımı sürelerine neden olabilir. Her WebDriver oturumu için bir strateji seçin ve bunu tutarlı bir şekilde uygulayın.
Üçüncü bir hata ise "her ihtimale karşı" zaman aşımı sürelerini çok yüksek ayarlamaktır. Uzun varsayılan zaman aşımı süreleri, gerçek performans sorunlarını gizler ve sürekli entegrasyon süreçlerindeki geri bildirimi yavaşlatır. Kısa zaman aşımı süreleriyle başlayın ve yalnızca hata günlükleri gerçek bir zamanlama sorununun varlığını kanıtladığında bunları uzatın.
Ayrıca kontrol edin: Selenium Yeni Başlayanlar İçin Eğitim: 7 Günde WebDriver'ı Öğrenin
