Cara untuk mengelakkan ralat "StaleElementReferenceException" dalam Selenium
P粉920835423
P粉920835423 2023-08-21 17:47:18
0
2
620
<p>Saya sedang melaksanakan banyak ujian Selenium di Jawa - kadangkala, ujian saya gagal kerana <kod>StaleElementReferenceException</code>. </p> <p>Bolehkah anda mencadangkan beberapa cara untuk menjadikan ujian lebih stabil? </p>
P粉920835423
P粉920835423

membalas semua(2)
P粉899950720

Saya pernah mengalami masalah ini, tetapi tanpa saya sedar, BackboneJS sedang berjalan pada halaman dan ia menggantikan elemen yang saya cuba klik. Kod saya adalah seperti berikut.

driver.findElement(By.id("checkoutLink")).click();

Ini sudah tentu fungsinya sama seperti kod di bawah.

WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
checkoutLink.click();

Sesekali ia berlaku bahawa javascript menggantikan elemen checkoutLink antara carian dan klik, iaitu.

WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
// javascript替换了checkoutLink
checkoutLink.click();

Ini menghasilkan StaleElementReferenceException apabila cuba mengklik pada pautan. Saya tidak dapat mencari cara yang boleh dipercayai untuk memberitahu WebDriver supaya menunggu javascript selesai dijalankan, jadi inilah cara saya akhirnya menyelesaikannya.

new WebDriverWait(driver, timeout)
    .ignoring(StaleElementReferenceException.class)
    .until(new Predicate<WebDriver>() {
        @Override
        public boolean apply(@Nullable WebDriver driver) {
            driver.findElement(By.id("checkoutLink")).click();
            return true;
        }
    });

Kod ini akan terus mencuba untuk mengklik pautan, mengabaikan pengecualian StaleElementReferenceException, sehingga klik berjaya atau tamat masa dicapai. Saya suka penyelesaian ini kerana ia menghilangkan kerumitan menulis logik cuba semula dan hanya menggunakan binaan terbina dalam WebDriver.

P粉343141633

Ini berlaku jika manipulasi DOM berlaku pada halaman menyebabkan elemen tidak boleh diakses buat sementara waktu. Untuk menangani situasi ini, anda boleh cuba mengakses elemen beberapa kali dalam satu gelung sehingga akhirnya pengecualian dilemparkan.

Cuba gunakan penyelesaian hebat ini daripada darrelgrainger.blogspot.com:

public boolean retryingFindClick(By by) {
    boolean result = false;
    int attempts = 0;
    while(attempts < 2) {
        try {
            driver.findElement(by).click();
            result = true;
            break;
        } catch(StaleElementException e) {
        }
        attempts++;
    }
    return result;
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan