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?
3 réponses
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;
}
}
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);
}
}
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();
Questions connexes
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.