le sélénium.commun.des exceptions.StaleElementReferenceException au cours de rafraichissement de la page
Page contient certaines données (table avec quelques lignes). Il est bouton "actualiser" qui rechargement et de redessiner certains éléments de la page sans rechargement de données statiques (ajax).
Je suis en train de créer bon test pour cette page, mais se StaleElementReferenceException parfois.
Mon code (python):
from selenium import webdriver
browser=webdriver.Firefox()
browser.get('http://mytisite')
browser.implicitly_wait(10)
browser.find_element_by_id('start').click()
while browser.find_element_by_id('status').text!='Done':
browser.find_element_by_id('refresh').click()
for row in browser.find_elements_by_class_name('datarow'):
if not is_correct(row.text):
print "incorrect"
time.sleep(10)
1 de 5 itérations échoue sur la ligne "si pas is_correct(rangée.texte)":
selenium.common.exceptions.StaleElementReferenceException:
Message: u'Element not found in the cache - perhaps the page
has changed since it was looked up' ; Stacktrace: Method
fxdriver.cache.getElementAt threw an error in
resource://fxdriver/modules/web_element_cache.js
Problème principal: page contient déjà des données précédentes, donc je suis la course entre l'ajax d'actualisation et de webdriver élément de la requête de find_elements_by_class_name('datarow')
.
Comment puis-je la bonne résoudre course entre l'ajax d'actualisation et de webdriver? Merci.
OriginalL'auteur George Shuklin | 2013-04-15
Vous devez vous connecter pour publier un commentaire.
J'ai peur, je ne peux pas vous aider avec le binding python. Cependant, je peux vous aider avec des conseils généraux sur la WebDriver et quelques extraits de code Java qui peuvent vous aider (autres) conduisent à trouver leur équivalent python. Il y a un tas de choses que vous pouvez faire de la poignée AJAX en Sélénium.
1. Implicite attend- Cela indiquera web de pilote pour interroger les DOM pendant une certaine période.
2. Explicite attend - je préfère ces! On peut les utiliser en conjonction avec les attend. Vous pouvez dire WebDriver attendre un certain état. Vous avez besoin d'utiliser WebDriverWait explicites attend.
ExpectedConditions
fournit de nombreux attendent des conditions de libre et j'ai trouver qu'il est extrêmement utile.Si je devais écrire votre extrait de code en Java, je ferais ci-dessous. Remarque j'ai écrit cela dans un éditeur, donc il doit compiler. Je suppose que cela vous donnera une idée sur l'utilisation de WebDriverWait.
Enfin, mon expérience de nombreuses modernes applications AJAX utiliser jQuery. J'ai utilisé jQuery.indicateur actif sur plusieurs années avec succès pour vérifier si la page est chargée ou non. Vous pouvez la combiner avec du javascript
document.readyState
. C'est la méthode que j'utilise pour attendre après chaque "clic" pour mes applications AJAX.OriginalL'auteur nilesh
Un état de référence de l'élément exception est levée dans un de deux cas, le premier étant plus fréquente que la seconde:
s'il vous plaît aller à travers le dessous de sélénium de la documentation pour plus d'info
Vicié de référence de l'élément exception de la documentation
Essayez d'utiliser un autre type de localisateurs.
OriginalL'auteur Surya Deepak