apa arti kesalahan ini: referensi elemen basi: elemen tidak melekat pada dokumen halaman?

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?

Larutan

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;
  }
}
Komentar (7)

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 mendapat selenium tidak merujuknya kembali. Di bawah ini adalah kode yang diperbaiki

@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 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 activeDateListAsString = new ArrayList();

    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);

    }

}
Komentar (0)

Anda mendapatkan kesalahan ini jika elemen tidak ada saat memuat halaman. Anda harus menunggu sampai elemen siap:

public static Func 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();
Komentar (0)