Dalam aplikasi C # saya untuk menggunakan driver web selenium saya mendapatkan kesalahan ini:
OpenQA.Selenium.StaleElementReferenceException: elemen basi referensi: elemen tidak melekat pada dokumen halaman
dalam kode ini:
IWebElement e = driver.FindElement(By.XPath(link_click), 10);
e.Click();
baris kesalahan ada di e.Click()
tetapi ini adalah prosedur yang berhasil dieksekusi di tautan yang sama yang ditentukan oleh XPath sebelumnya tetapi gagal pada percobaan terakhir! jadi apa arti kesalahan ini dan bagaimana cara memperbaikinya?
Ini berarti bahwa elemen berubah di halaman, atau elemen dihapus, referensi lengkap di tautan ini http://www.seleniumhq.org/exceptions/stale_element_reference.jsp
Salah satu cara untuk mengatasi hal ini, Anda bisa meletakkan retry, mungkin sesuatu seperti
bool staleElement = true;
while(staleElement){
try{
driver.FindElement(By.XPath(link_click), 10).Click();
staleElement = false;
} catch(StaleElementReferenceException e){
staleElement = true;
}
}
Saya mengalami masalah yang sama ketika saya melakukan pemilihan tanggal, dengan salah satu situs. Saya harus mendapatkan semua tombol yang aktif (atau diaktifkan) dari pemilih tanggal dan mengklik masing-masing tombol tersebut. Ketika saya mengulang-ulang elemen-elemen itu menjadi basi. Saya akan mengulangi kembali menyimpan daftar lain. Hal ini mungkin terjadi karena setelah List
@Test
public void datePickerTest() throws InterruptedException{
driver.get(baseURL);
// click on flights tab
genericMethod.getElement("tab-flight-tab-hp", "id").click();
// click departing date, such that the date picker is loaded in the dom
genericMethod.getElement("flight-departing-hp-flight", "id").click();
Thread.sleep(700);
// pass the collected xpath where you can find all the dates which are enabled
String xpath=".//*[@id='flight-departing-wrapper-hp-flight']/div/div/div[2]/table/tbody/tr/td/button[not(@disabled)]";
List<WebElement> activeDatesWebElement = genericMethod.getElements("xpath", xpath);
System.out.println("Number of Active Dates " + activeDatesWebElement.size());
// work around for an element when it is found stale
List<String> activeDateListAsString = new ArrayList<String>();
for(WebElement temp : activeDatesWebElement){
activeDateListAsString.add(temp.getText());
}
// iterate all element in the list received, which is kept in list
for(String temp : activeDateListAsString){
genericMethod.getElement("flight-departing-hp-flight", "id").click();
Thread.sleep(500);
String selectDateXpath=".//*[@id='flight-departing-wrapper-hp-flight']"
+ "/div/div/div[2]/table/tbody/tr/td/button[text()='"
+temp+"']";
genericMethod.getElement(selectDateXpath, "xpath").click();
Thread.sleep(500);
}
}
Anda mendapatkan kesalahan ini jika elemen tidak ada saat memuat halaman. Anda harus menunggu sampai elemen siap:
public static Func<IWebDriver, IWebElement> Condition(By locator)
{
return (driver) => {
var element = driver.FindElements(locator).FirstOrDefault();
return element != null && element.Displayed && element.Enabled ? element : null;
};
}
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var elementU = wait.Until(Condition(By.Name("j_username")));
elementU.Click();