Pobierz stronę z Selenium, ale poczekaj, aż nieznana wartość elementu nie będzie pusta

Nov 23 2020

Kontekst

To jest ponowna publikacja Pobierz stronę z Selenium, ale poczekaj, aż wartość elementu nie będzie pusta , która została zamknięta bez żadnej ważności, o ile wiem.

Połączone odpowiedzi w rozumowaniu końcowym opierają się na wiedzy, jaka będzie oczekiwana wartość tekstowa. W każdej odpowiedzi wyraźnie pokazuje oczekiwany tekst zakodowany na stałe w WebDriverWaitwywołaniu. Co więcej, żadna z połączonych odpowiedzi nie dotyka nawet w oddali ostatniej części mojego pytania:

[czy oczekiwane warunki] pojawiają się przed lub po stronie Get

Pytania „zduplikowane”

  • Jak wyodrębnić dane z poniższego html?
  • Potwierdź, jeśli tekst w elemencie zawiera określony tekst częściowy

Oryginalne pytanie

Chwytam stronę internetową przy użyciu Selenium, ale muszę poczekać, aż załaduje się określona wartość. Nie wiem, jaka będzie wartość, tylko w jakim elemencie będzie obecna.

Wygląda na to, że korzystam z oczekiwanego warunku text_to_be_present_in_element_valuelub text_to_be_present_in_elementjest najbardziej prawdopodobnym rozwiązaniem, ale mam trudności ze znalezieniem jakiejkolwiek faktycznej dokumentacji na temat ich używania i nie wiem, czy pojawią się przed, czy po stronie Pobierz:

webdriver.get(url)

Omow wszystko jeszcze raz

Jak uzyskać stronę za pomocą Selenium, ale poczekać, aż nieznana wartość tekstowa wypełni tekst lub wartość elementu przed kontynuowaniem?

Odpowiedzi

BBorisov95 Nov 23 2020 at 21:16

Jestem pewien, że moja odpowiedź nie jest najlepsza, ale oto część mojego własnego kodu, która pomogła mi w podobnym zadaniu.

W moim przypadku miałem problem z czasem ładowania DOM. Czasami zajmowało to 5 sekund, czasami 1 sekundę i tak dalej.

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

Ponieważ w moim przypadku browser.implicitly_wait(7)nie wystarczyło. Zrobiłem proste for loop sprawdzenie, czy zawartość jest załadowana.

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

To nie jest idealne, ale możesz spróbować.