Rumah > Soal Jawab > teks badan
P粉8999507202023-08-22 15:30:51
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粉3431416332023-08-22 13:04:24
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; }