StaleElementReferenceException: l'Élément n'est plus attaché à la DOM: le Sélénium
Je suis complètement nouveau pour l'automatisation des tests. Après avoir cité quelques tutoriels, j'ai créé un système automatisé de cas de test. Le cas de test j'ai essayer d'automatiser est de vérifier si le tri a fonctionné correctement après que j'ai cliqué sur l'un des en-têtes d'un tableau.
Mon test automatisé cas d'échec avec l'exception suivante:
org.openqa.selenium.StaleElementReferenceException: Element is no longer attached to the DOM
Command duration or timeout: 12 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 21:08:56'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '2.6.35-30-generic', java.version: '1.6.0_20'
Driver info: driver.version: RemoteWebDriver
Session ID: 95b80ea0-26ac-45e0-a407-79f5b687504a
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244)
at org.openqa.selenium.remote.RemoteWebElement.findElements(RemoteWebElement.java:169)
at org.openqa.selenium.remote.RemoteWebElement.findElementsByTagName(RemoteWebElement.java:240)
at org.openqa.selenium.By$ByTagName.findElements(By.java:312)
at org.openqa.selenium.remote.RemoteWebElement.findElements(RemoteWebElement.java:151)
at Sorting.sorting_column(Sorting.java:68)
Voici le code:
//Fetching values from the column of a table
WebElement table = driver.findElement(By.id("dnn_ctr381_View_DealerList_ctl00"));
List<WebElement> rows = table.findElements(By.tagName("tr"));
for (WebElement row : rows) {
List<WebElement> cells = row.findElements(By.tagName("td"));
if (!cells.isEmpty() && cells.get(0).isDisplayed()) {
a = cells.get(0).getText();
}
b[i] = a;
i++;
}
//Click on column header to sort
driver.findElement(By.cssSelector("html body#Body form#Form div#container.container div#Wrapper div#Main div#Panes div#ContentsContainer.box-shadow div#Contents div#Content div#dnn_ContentPane.MainContent div.DnnModule div.dnnPEMContNotitle div#dnn_ctr381_ContentPane.dnnPEMContNotitleBody div#dnn_ctr381_ModuleContent.DNNModuleContent div#dnn_ctr381_View_dnn_ctr381_View_DealerListPanel div#dnn_ctr381_View_DealerList.RadGrid table#dnn_ctr381_View_DealerList_ctl00.rgMasterTable thead tr th.rgHeader a")).click();
WebElement table1 = driver.findElement(By.id("dnn_ctr381_View_DealerList_ctl00"));
List<WebElement> rows1 = table1.findElements(By.tagName("tr"));
for (WebElement row1 : rows1) {
List<WebElement> cells1 = row1.findElements(By.tagName("td"));//Exception here
if (!cells1.isEmpty() && cells1.get(0).isDisplayed())
{
c = cells1.get(0).getText();
}
Exception est à partir de cette ligne:
List<WebElement> cells = row1.findElements(By.tagName("td"));
Quelqu'un peut s'il vous plaît laissez-moi savoir la cause de cette isse et comment il peut être résolu?
Toute aide est appréciée
Beaucoup de discussion sur stackoverflow.com/questions/16166261/.... Possible dupe?
OriginalL'auteur user1400538 | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
StaleElementException
est là pour vous dire qu'un élément du DOM que vous avez mentionnés dans votre code client (par unfindElement
) n'existe plus. Dans votre cas, lerow1
élément n'existe plus. Il est certainement un problème de timing, comme votre cliquez pour trier, juste au-dessus, et aucun soin n'est prise pour assurer le tri est terminé. Sans plus de perspicacité dans la façon dont le tri est mis en œuvre, ou combien de temps il prend, il serait ma meilleure supposition. Si le tri se termine alors que vous parcourez à travers vos objets DOM, ces seront réorganisés dans les DOM et perdu dans votre code clientOriginalL'auteur Grooveek
Bien, StaleElement exception peut être vraiment frustrant..j'ai particulièrement aimé tout en travaillant avec google chrome pilote...mais comme de maintenant, la seule façon de se déplacer est tout simplement à l'aide de ce que j'appelle un Raw attendre:
Bien que les puristes pourraient dire que nous sommes à l'aide des numéros de magie, mais une fois que vous savez le coffre d'attente de l'ampleur alors que j'ai connue il pour être efficace à plus de 95% des cas.
OriginalL'auteur Anirudh
Utilisation
webDriverwait
et de faire le chauffeur d'attendre jusqu'à ce que l'élément est situé sur le dom.Utilisation d'une sortie sur une déclaration indiquant si l'élément est situé ou non.
J'espère que cette aide.
OriginalL'auteur Rami
Il est à faire avec DOM changer parce que de peu de javascript arriver exécuté lorsqu'une interaction qui se passe sur la page. De sorte que le message d'erreur indique que l'élément est devenu obsolète, donc la solution est de faire pilote.findElement de nouveau pour se débarrasser de lui. Face même problème et l'a résolu, il
OriginalL'auteur suprinder