TestNG : POM : @FindAll Anotasyonu
🧩 Giriş
Section titled “🧩 Giriş”Selenium ile Page Object Model (POM) yapısı kullanılırken, birden fazla elementin alternatif locator’larla tanımlanması gerekebilir.
Bu durumda @FindAll anotasyonu kullanılır.
@FindAll, birden fazla @FindBy koşulunu tanımlar ve bunlardan herhangi biriyle eşleşen ilk elementi bulur.
🔍 @FindAll Nedir?
Section titled “🔍 @FindAll Nedir?”@FindAll anotasyonu, bir web elementi için birden fazla locator stratejisi tanımlamak amacıyla kullanılır.
📌 Temel Söz Dizimi:
@FindAll({ @FindBy(id = "username"), @FindBy(name = "user")})WebElement usernameInput;Bu örnekte, Selenium id="username" veya name="user" olan elementi bulur.
⚙️ Kullanım Senaryosu
Section titled “⚙️ Kullanım Senaryosu”Bazı web sayfalarında farklı sürümler veya dinamik değişiklikler nedeniyle elementin locatörü değişebilir.
Bu durumda @FindAll, alternatif locator’lar ile aynı elementi tanımlayabilmeyi sağlar.
💡 @FindAll ve @FindBys Arasındaki Fark
Section titled “💡 @FindAll ve @FindBys Arasındaki Fark”| Özellik | @FindAll | @FindBys |
|---|---|---|
| Mantık | OR (veya) | AND (ve) |
| Çalışma Şekli | Tanımlanan locator’lardan herhangi biri eşleşirse bulur. | Tüm locator’lar ardışık olarak eşleşmelidir. |
| Kullanım Amacı | Alternatif locator’lar için | Hiyerarşik element arama için |
🧪 Örnek Uygulama
Section titled “🧪 Örnek Uygulama”📁 LoginPage.java
Section titled “📁 LoginPage.java”package pages;
import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindAll;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;import org.openqa.selenium.WebDriver;
public class LoginPage { WebDriver driver;
@FindAll({ @FindBy(id = "username"), @FindBy(name = "user_name"), @FindBy(xpath = "//input[@placeholder='Username']") }) WebElement usernameField;
@FindAll({ @FindBy(id = "password"), @FindBy(name = "user_password") }) WebElement passwordField;
@FindBy(xpath = "//button[@type='submit']") WebElement loginButton;
public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
public void login(String username, String password) { usernameField.sendKeys(username); passwordField.sendKeys(password); loginButton.click(); }}📁 LoginTest.java
Section titled “📁 LoginTest.java”package tests;
import org.testng.annotations.Test;import org.testng.annotations.BeforeClass;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import pages.LoginPage;
public class LoginTest { WebDriver driver; LoginPage loginPage;
@BeforeClass public void setup() { driver = new ChromeDriver(); driver.get("https://example.com/login"); loginPage = new LoginPage(driver); }
@Test public void validLoginTest() { loginPage.login("testuser", "password123"); // Assert işlemleri burada yapılır. }}🚀 Avantajları
Section titled “🚀 Avantajları”- Farklı locator’lara rağmen aynı elemente erişim sağlar.
- Kod tekrarını azaltır.
- Dinamik web sayfalarında testlerin kırılmasını önler.
⚠️ Dikkat Edilmesi Gerekenler
Section titled “⚠️ Dikkat Edilmesi Gerekenler”- Çok fazla locator tanımlamak performansı düşürebilir.
- Locator’lar birbirini dışlamamalıdır (farklı elementleri seçmemeli).
- @FindAll sadece tek element (WebElement) için kullanılır. (Liste için
@FindBysveya@FindBy+List<WebElement>tercih edilir.)
🧾 Özet
Section titled “🧾 Özet”| Özellik | Açıklama |
|---|---|
| Anotasyon | @FindAll |
| Mantık | “Veya” (OR) koşulu |
| Kullanım | Alternatif locator tanımı |
| Avantaj | Stabil testler, locator çeşitliliği |
| Kısıt | Tek elementte kullanılır |