webentwicklung-frage-antwort-db.com.de

was bedeutet dieser Fehler: veraltete Elementreferenz: Element ist nicht an das Seitendokument angehängt?

In meiner C # -App zur Verwendung des Selenium-Web-Treibers erhalte ich diesen Fehler: 

OpenQA.Selenium.StaleElementReferenceException: veraltetes Element reference: Das Element ist nicht an das Seitendokument angehängt

in diesem Code:

IWebElement e = driver.FindElement(By.XPath(link_click), 10);
e.Click();

die Fehlerzeile befindet sich in e.Click(), aber dies ist eine Prozedur, die erfolgreich in derselben Verknüpfung ausgeführt wurde, die zuvor von XPath angegeben wurde, aber beim letzten Versuch fehlgeschlagen ist! Was bedeutet dieser Fehler und wie kann er behoben werden?

6
Wel

Dies bedeutet, dass entweder das in der Seite geänderte Element gelöscht wird oder das Element gelöscht wird. Vollständige Referenz in diesem Link http://www.seleniumhq.org/exceptions/stale_element_reference.jsp

Eine Möglichkeit, dies zu bewältigen, könnte man erneut versuchen, wahrscheinlich so etwas

bool staleElement = true; 
while(staleElement){
  try{
     driver.FindElement(By.XPath(link_click), 10).Click();
     staleElement = false;

  } catch(StaleElementReferenceException e){
    staleElement = true;
  }
}
11
adee alamsz

Ich hatte das gleiche Problem, als ich mit einem Date-Picker auf einer Site arbeitete. Ich würde alle aktiven (oder aktivierten) Schaltflächen von der Datumsauswahl abrufen und auf jede Schaltfläche klicken. Als ich die Elemente iterierte, wurde es abgestanden. Ich würde noch einmal wiederholen, eine andere Liste zu führen. Dies kann geschehen sein, da Selenium die Liste nicht zurückverweist, sobald die Liste sie erhält. Unten ist der feste Code 

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

    }

}
1
Naveen

Diese Fehlermeldung wird angezeigt, wenn das Element beim Laden der Seite nicht vorhanden ist. Sie müssen warten, bis das Element fertig ist:

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();
0
ozanmut