Dans mon application C # pour utiliser le pilote Web sélénium, j'obtiens cette erreur:

OpenQA.Selenium.StaleElementReferenceException: référence d'élément périmée: l'élément n'est pas attaché au document de page

Dans ce code:

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

La ligne d'erreur est dans le e.Click() mais c'est une procédure qui s'est exécutée avec succès dans le même lien spécifié par XPath auparavant mais qui a échoué au dernier essai! alors qu'est-ce que cette erreur signifie et comment y remédier?

9
Wel 21 avril 2017 à 16:09

3 réponses

Meilleure réponse

Cela signifie que soit l'élément modifié dans la page, soit l'élément est supprimé, référence complète dans ce lien http: //www.seleniumhq.org/exceptions/stale_element_reference.jsp

Une façon de faire face à cela, vous pouvez mettre une nouvelle tentative, probablement quelque chose comme

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

  } catch(StaleElementReferenceException e){
    staleElement = true;
  }
}
15
adee alamsz 21 avril 2017 à 13:21

J'avais le même problème quand je faisais un sélecteur de dates, avec l'un des sites. Je voudrais obtenir tous les boutons actifs (ou activés) du sélecteur de date et cliquer sur chacun d'eux. Quand j'ai réitéré les éléments, cela devenait périmé. Je répète que je garde une autre liste. Cela peut être arrivé parce qu'une fois que la liste obtient du sélénium, elle ne la renvoie pas. Ci-dessous le code fixe

@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 24 mars 2018 à 15:02

Vous obtenez cette erreur si l'élément n'est pas présent lors du chargement de la page. Vous devez attendre que l'élément soit prêt:

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 5 nov. 2018 à 22:49