Tablolarla çalışma
HTML tabloları, kırılgan Selenium testlerinin en yaygın kaynaklarından biridir. Çözüm, mutlak satır dizinleri yerine yapıyı ve anlamı hedeflemektir: başlıkları okuyun, bilinen bir değeri içeren satırı bulun, ardından önemsediğiniz hücreyi okuyun.
Satır içeriğine göre bir hücre değerini doğrulama
İlk hücresi bilinen bir anahtar içeren satırı bulun, ardından başka bir sütundaki değeri doğrulayın:
OrdersPage.java
import io.testfly.test.BasePage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
public class OrdersPage extends BasePage {
private static final By TABLE = By.id("orders");
public String statusOf(String orderId) {
return cellByRowText(TABLE, orderId, "Status");
}
private String cellByRowText(By table, String rowKey, String columnName) {
WebElement tableEl = find(table).first().element();
// Map header text to column index
java.util.List<WebElement> headers = tableEl.findElements(By.tagName("th"));
int columnIndex = -1;
for (int i = 0; i < headers.size(); i++) {
if (headers.get(i).getText().trim().equals(columnName)) {
columnIndex = i;
break;
}
}
if (columnIndex < 0) {
throw new AssertionError("Column not found: " + columnName);
}
// Find the row whose first cell (or any cell) contains rowKey
for (WebElement row : tableEl.findElements(By.cssSelector("tbody tr"))) {
if (row.getText().contains(rowKey)) {
return row.findElements(By.tagName("td")).get(columnIndex).getText().trim();
}
}
throw new AssertionError("Row not found: " + rowKey);
}
}
OrdersTest.java
public class OrdersTest extends BaseTest {
@Test
public void orderStatusIsShipped() {
open("/orders");
OrdersPage page = new OrdersPage();
softAssert().that(page.statusOf("ORD-1234").equals("Shipped"), "Order ORD-1234 should be Shipped");
}
}
Satırları sayma
int visibleRows = find("#orders tbody tr").count();
softAssert().that(visibleRows > 0, "Should have at least one visible row");
Bir satırın görünmesini bekleme
assertThat(find("#orders tbody tr")).count(3); // auto-waits until 3 rows exist
Bir satırın varlığını doğrulama
Metni içeren satıra odaklanmak için withText(...) kullanın (varsayılan olarak alt dize / substring eşleştirmesi yapar) ve ardından görünürlüğünü doğrulayın:
assertThat(find("#orders tbody tr").withText("ORD-1234")).isVisible();
Kararlı tablo testleri için ipuçları
- Asla satır dizinlerini sabit kodlamayın. Başka bir testten gelen yeni bir satır her dizini kaydırabilir.
- Sütun numaralarını değil, başlık adlarını kullanın. Sütunların sırası, etiketlerinden daha sık değişir.
- Sorguları tabloyla sınırlandırın. Genel
trseçicileri yerine#orders tbody trkullanın. - DOM sırasını değil, görünür metni doğrulayın. Bir kullanıcının hata raporu "üçüncü
tdyanlış" değil, "Durum Beklemede gösteriyor" der.
Daha derin referans: Locator — eşleşen öğeleri sayma, filtreleme ve üzerlerinde yineleme.