web-dev-qa-db-fra.com

que signifie cette erreur: référence de l'élément périmé: l'élément n'est pas attaché au document de page?

Dans mon application C # pour utiliser le pilote Web Selenium, j'obtiens cette erreur: 

OpenQA.Selenium.StaleElementReferenceException: élément obsolète référence: 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 la e.Click() mais il s'agit d'une procédure qui s'est exécutée avec succès dans le même lien que celui spécifié par XPath auparavant mais qui a échoué lors du dernier essai! alors qu'est-ce que cette erreur signifie et comment y remédier?

6
Wel

Cela signifie que l'élément modifié dans la page ou que 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 pourriez essayer, 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;
  }
}
11
adee alamsz

J'avais le même problème quand je faisais le sélecteur de date, avec l'un des sites. Je voudrais obtenir tous les boutons actifs (ou activés) à partir du sélecteur de date et cliquez sur chacun de ces éléments. Quand j'ai réitéré les éléments, ça commençait à devenir obsolète. Je réitérerai de garder une autre liste. Cela peut être dû au fait qu'une fois que la liste est obtenue, Selenium 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

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