İçeriğe geç

TestNG : POM : @FindAll Anotasyonu

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 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.


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ıkOR (veya)AND (ve)
Çalışma ŞekliTanı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çinHiyerarşik element arama için

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();
}
}
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.
}
}

  • 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.

  • Ç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 @FindBys veya @FindBy + List<WebElement> tercih edilir.)

ÖzellikAçıklama
Anotasyon@FindAll
Mantık“Veya” (OR) koşulu
KullanımAlternatif locator tanımı
AvantajStabil testler, locator çeşitliliği
KısıtTek elementte kullanılır