Erişilebilirlik Öncelikli Locator'lar
TestFly, kırılgan CSS sınıfları veya DOM yapısı yerine erişilebilirlik ağacını — kullanıcının gerçekte algıladığı şeyi — hedefleyen Playwright tarzı semantik locator'lar sunar. Sonuç: sayfa gibi okunan ve yeniden tasarımlara dayanan locator'lar.
getByRole(Role.BUTTON).withName("Submit").click();
getByLabel("Email address").type("a@b.com");
getByPlaceholder("Search…").type("boots");
getByText("Forgot password?").click();
getByTestId("checkout-cta").click();
Her semantik locator, $() API tarafından kullanılan aynı zincirlenebilir, otomatik bekleyen Locator'ı döndürür — Thread.sleep yok, açık bekleme yok. Hem BaseTest hem de BasePage üzerinde kullanılabilirler.
Neden semantik locator'lar?
// Kırılgan — işaretleme yeniden düzenlendiği anda bozulur:
find(By.cssSelector("div.modal > form button.btn-primary")).click();
// Dayanıklı — kullanıcının gördüğü rolü + erişilebilir adı hedefler:
getByRole(Role.BUTTON).withName("Submit").click();
Locator'lar
| Metod | Eşleşir |
|---|---|
getByRole(Role) | ARIA rolüne göre öğeler (örtük HTML öğesi veya açık role="…") |
getByText(String) | Görünür metne göre öğeler |
getByLabel(String) | İlişkilendirilmiş <label> metnine göre form kontrolleri |
getByPlaceholder(String) | placeholder niteliğine göre öğeler |
getByTestId(String) | test-id niteliğine göre öğeler (varsayılan data-testid) |
getByAltText(String) | alt metnine göre öğeler (tipik olarak <img>) |
getByTitle(String) | title niteliğine göre öğeler |
getByRole
Role, 36 WAI-ARIA rolünü kapsar. Her biri hem rolü örtük olarak taşıyan yerel HTML öğeleriyle hem de açık bir role niteliği taşıyan herhangi bir öğeyle eşleşir — örn. Role.BUTTON, <button>, <input type="submit">, <summary> ve [role="button"] ile eşleşir.
getByRole(Role.BUTTON).withName("Save").click(); // erişilebilir ad eşleşmesi
getByRole(Role.LINK, "Docs").click(); // tek çağrıda rol + ad
getByRole(Role.HEADING).withLevel(1).getText(); // başlık seviyesi
.withName(...) öğenin erişilebilir adını eşleştirir; ARIA önceliğine göre hesaplanır: aria-label → aria-labelledby → ilişkili <label> → metin içeriği → value / alt / title.
Tam vs. alt dize
Metin, ad ve nitelik eşleştirmesi varsayılan olarak büyük/küçük harfe duyarsız alt dize biçimindedir. Büyük/küçük harfe duyarlı tam eşleşme için .exact() çağırın:
getByText("submit"); // "Submit", "SUBMIT ORDER", … ile eşleşir
getByText("Submit").exact(); // yalnızca "Submit" ile eşleşir
test-id niteliğini yapılandırma
getByTestId varsayılan olarak data-testid kullanır. testfly.yml içinde geçersiz kılın:
locators:
testIdAttribute: data-qa
Veya programatik olarak: Locator.setTestIdAttribute("data-qa");
Standart CSS ve Zincirleme Filtreler
Erişilebilirlik öncelikli semantik seçicilere ek olarak Locator, standart CSS ve geleneksel seçiciler için değişmez (immutable) bir zincirleme API'si sunar:
// Doğrudan CSS seçici fabrikası
Locator.cssSelector(".product-card")
.filter(".in-stock")
.withText("Kulaklık")
.first()
.click();
// Null-safe yazma (null veya boş string geçildiğinde NPE fırlatmadan öğeyi temizler)
getByPlaceholder("Arama").type(null);
Kaçış kapağı: toBy()
Her semantik locator, ham Selenium veya SmartLocator ile birlikte çalışma için sentezlenmiş Selenium By nesnesini geri verebilir:
By submitBtn = getByRole(Role.BUTTON).toBy();
WebElement el = driver.findElement(submitBtn);
toBy()temel seçiciyi döndürür.Byolarak ifade edilemeyen inceltmeler (örn..withName(...)) yalnızca tamamen çözümlenmiş öğe üzerindeki terminal eylemleriyle (click(),type(), …) uygulanır.