Obtenez une page avec Selenium mais attendez que la valeur de l'élément inconnue ne soit pas vide

Nov 23 2020

Le contexte

Ceci est une republication de Obtenir une page avec Selenium mais attendez que la valeur de l'élément ne soit pas vide , ce qui a été fermé sans aucune validité pour autant que je sache.

Les réponses liées dans le raisonnement de clôture reposent toutes deux sur la connaissance de la valeur attendue du texte. Dans chaque réponse, il affiche explicitement le texte attendu codé en dur dans l' WebDriverWaitappel. De plus, aucune des réponses liées n'aborde même à distance la dernière partie de ma question:

[si les conditions attendues] viennent avant ou après la page Obtenir

Questions "en double"

  • Comment extraire des données du html suivant?
  • Affirmer si le texte dans un élément contient un texte partiel spécifique

Question originale

J'attrape une page Web en utilisant Selenium, mais je dois attendre qu'une certaine valeur se charge. Je ne sais pas quelle sera la valeur, seulement dans quel élément il sera présent.

Il semble que l'utilisation de la condition attendue text_to_be_present_in_element_valueou text_to_be_present_in_elementsoit la voie la plus probable, mais j'ai du mal à trouver de la documentation réelle sur la façon de les utiliser et je ne sais pas si elles viennent avant ou après la page Get:

webdriver.get(url)

Reformuler

Comment obtenir une page à l'aide de Selenium mais attendre qu'une valeur de texte inconnue remplisse le texte ou la valeur d'un élément avant de continuer?

Réponses

BBorisov95 Nov 23 2020 at 21:16

Je suis sûr que ma réponse n'est pas la meilleure, mais voici une partie de mon propre code, qui m'a aidé avec une question similaire.

Dans mon cas, j'ai eu des problèmes avec le temps de chargement du DOM. Parfois, cela prenait 5 secondes parfois 1 seconde et ainsi de suite.

url = 'www.somesite.com'
browser.get(url)

Parce que dans mon cas, ce browser.implicitly_wait(7)n'était pas suffisant. J'ai fait un simple for loop pour vérifier si le contenu est chargé.

some code...

 for try_html in range(7):
        """ Make 7 tries to check if the element is loaded """
        browser.implicitly_wait(7)
        html = browser.page_source
        soup = BeautifulSoup(html, 'lxml')
        raw_data = soup.find_all('script', type='application/ld+json')
        

       """if SKU in not found in the html page we skip 
         for another loop, else we break the 
          tryes and scrape the page"""

        if 'sku' not in html:
            continue
        else:
            scrape(raw_data)
            break

Ce n'est pas parfait, mais vous pouvez l'essayer.