13 votes

Python Selenium : attendre qu'un élément ne soit plus périmé ?

J'ai une situation dans laquelle je veux attendre jusqu'à ce qu'un élément ne soit plus STALE, c'est à dire jusqu'à ce qu'un élément soit connecté au DOM. Les options d'attente suivantes ne fonctionnent pas :

self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
self.wait.until(EC.presence_of_element_located((By.ID, "elementID")))

Il existe une fonction d'attente opposée qui attend qu'un élément devienne périmé, ce qui est le cas :

self.wait.until(EC.staleness_of((By.ID, "elementID")))

Mais je veux qu'il attende jusqu'à ce que l'élément ne soit PLUS STALE, c'est-à-dire jusqu'à ce qu'il soit connecté au DOM. Comment puis-je réaliser cette fonctionnalité ?

EDIT : il y a une solution ici : aquí mais je suis à la recherche d'une meilleure approche, s'il y en a une.

10voto

JeffC Points 11760

Un élément périmé est une référence d'élément que vous avez stockée et qui n'est plus valide parce que la page, une partie de la page ou peut-être simplement l'élément a été actualisé. Un exemple simple

element = driver.find_element_by_id("elementID")
# do something that refreshes the page
element.click()

Ici element.click() lèvera une exception d'élément périmé parce que la référence a été stockée dans une base de données. avant le rafraîchissement mais utilisé (cliqué) après le rafraîchissement. Dans ce cas, cette référence n'est plus valide. Une fois qu'une référence est périmée, elle ne devient jamais "non périmée"... cette référence ne peut plus jamais être utilisée. La seule façon d'y remédier est de stocker à nouveau la référence.

NOTE : Votre exemple de code n'est pas correct pour .staleness_of() . Il prend une référence d'élément web, pas un localisateur. Vous avez besoin d'une référence existante pour attendre qu'elle soit périmée. Voir les docs .

Pour résoudre le problème, vous devez attendre que l'actualisation soit terminée et puis obtenir une nouvelle référence .

element = driver.find_element_by_id("elementID")
# do something that refreshes the element
self.wait.until(EC.staleness_of(element))
element = self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
# do something with element

En attendant les éléments

2voto

Davide Patti Points 2715

A partir de la la documentation :

Stabilité de la :

class staleness_of(object):
    """ Wait until an element is no longer attached to the DOM.
    element is the element to wait for.
    returns False if the element is still attached to the DOM, true otherwise.
    """
    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        try:
            # Calling any method forces a staleness check
            self.element.is_enabled()
            return False
        except StaleElementReferenceException:
            return True

Élément à cliquer :

class element_to_be_clickable(object):
    """ An Expectation for checking an element is visible and enabled such that
    you can click it."""
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        element = visibility_of_element_located(self.locator)(driver)
        if element and element.is_enabled():
            return element
        else:
            return False

Comme vous pouvez le constater, les deux utilisent la même méthode is_enabled() pour effectuer le contrôle.

-1voto

New contributor Points 31198

Comme vous souhaitez récupérer la propriété textuelle une fois que le fichier WebElement n'est plus périmée, vous pouvez utiliser la méthode suivante :

wait1 = WebDriverWait(driver, 10)
wait1.until(expected_conditions.text_to_be_present_in_element((By.ID, "elementID"), "expected_text1"))

OU

wait2 = WebDriverWait(driver, 10)
wait2.until(expected_conditions.text_to_be_present_in_element_value((By.ID, "elementID"), "expected_text2"))

-2voto

Shadab Faiz Points 189
WebDriverWait(browser, waitTime).until(EC.presence_of_element_located(
                (By.XPATH or By.id or w/e you want, " xpath or id name")))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X