Holen Sie sich eine Seite mit Selenium, aber warten Sie, bis der unbekannte Elementwert nicht leer ist

Nov 23 2020

Kontext

Dies ist ein Repost von Get a page with Selenium, aber warten Sie, bis der Elementwert nicht leer ist , der, soweit ich das beurteilen kann, ohne Gültigkeit geschlossen wurde.

Die verknüpften Antworten in der Abschlussbegründung hängen beide davon ab, dass der erwartete Textwert bekannt ist. In jeder Antwort wird explizit der erwartete Text angezeigt, der im WebDriverWaitAnruf fest codiert ist . Darüber hinaus berührt keine der verknüpften Antworten den letzten Teil meiner Frage auch nur aus der Ferne:

[ob die erwarteten Bedingungen] kommen vor oder nach der Seite Get

"Doppelte" Fragen

  • Wie extrahiere ich Daten aus dem folgenden HTML?
  • Geben Sie an, ob der Text in einem Element einen bestimmten Teiltext enthält

Ursprüngliche Frage

Ich greife mit Selenium zu einer Webseite, muss aber warten, bis ein bestimmter Wert geladen ist. Ich weiß nicht, was der Wert sein wird, nur in welchem ​​Element er vorhanden sein wird.

Es scheint, dass die Verwendung der erwarteten Bedingung text_to_be_present_in_element_valueoder text_to_be_present_in_elementder wahrscheinlichste Weg in die Zukunft ist, aber ich habe Schwierigkeiten, eine tatsächliche Dokumentation zur Verwendung dieser zu finden, und ich weiß nicht, ob sie vor oder nach der Seite Get:

webdriver.get(url)

Umformulieren

Wie erhalte ich eine Seite mit Selenium, warte aber, bis ein unbekannter Textwert den Text oder Wert eines Elements auffüllt, bevor ich fortfahre?

Antworten

BBorisov95 Nov 23 2020 at 21:16

Ich bin mir sicher, dass meine Antwort nicht die beste ist, aber hier ist ein Teil meines eigenen Codes, der mir bei ähnlichen Fragen geholfen hat.

In meinem Fall hatte ich Probleme mit der Ladezeit des DOM. Manchmal dauerte es 5 Sekunden, manchmal 1 Sekunde und so weiter.

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

Weil in meinem Fall browser.implicitly_wait(7)nicht genug war. Ich habe es einfach gemacht for loop zu überprüfen, ob der Inhalt geladen ist.

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

Es ist nicht perfekt, aber Sie können es versuchen.