Selenium

Hoe te wachten tot een pagina is geladen met selenium

Hoe te wachten tot een pagina is geladen met selenium
Tijdens webautomatisering of webscraping met Selenium-webstuurprogramma, kunt u problemen tegenkomen, zoals het element dat u wilt selecteren, is niet beschikbaar of de knop die u wilt indrukken, is niet klaar om te worden geklikt, enzovoort.

De reden dat dit gebeurt, is dat het Selenium-webstuurprogramma de webpagina moet downloaden en de pagina moet weergeven voordat u er iets aan kunt doen. In het verleden genereerde de webserver de inhoud van een website en de browser downloadde deze en gaf deze weer. Tegenwoordig hebben we veel web-apps met één pagina die een beetje anders werken. In Single Page Web Apps (SPA's) bedient de webserver alleen de frontend-codes. Zodra de frontend-code in de browser is weergegeven, gebruikt de frontend-code AJAX om API-gegevens op te vragen bij de webserver. Zodra de frontend de API-gegevens ontvangt, worden ze weergegeven in de browser. Dus ook al is de browser klaar met het downloaden en weergeven van de webpagina, de webpagina is nog steeds niet klaar. U moet wachten tot het de API-gegevens heeft ontvangen en deze ook weergeven. Dus de oplossing voor dit probleem is te wachten tot de gegevens beschikbaar zijn voordat we iets met Selenium doen.

In Selenium zijn er 2 soorten wachttijden:
1) Impliciet wachten
2) Expliciet wachten

1) Impliciet wachten: Dit is het gemakkelijkst te implementeren. Een impliciete wachttijd vertelt het Selenium-webstuurprogramma enkele seconden te wachten totdat het DOM (documentobjectmodel) gereed is (de webpagina moet gereed zijn).

2) Expliciet wachten: Dit is een beetje ingewikkelder dan het impliciete wachten. In expliciete wachttijd, vertel je de Selenium-webdriver waar hij op moet wachten. Selenium wacht tot die specifieke voorwaarde is vervuld. Zodra het is voltooid, is het Selenium-webstuurprogramma klaar om andere opdrachten uit te voeren. Meestal is de expliciete wachttijd variabel. Het hangt af van hoe snel aan de voorwaarden wordt voldaan. In het ergste geval zal het expliciete wachten net zo lang wachten als het impliciete wachten.

In dit artikel laat ik je zien hoe je (impliciet en expliciet) kunt wachten tot een pagina is geladen met Selenium. Dus laten we beginnen.

Vereisten:

Om de opdrachten en voorbeelden van dit artikel uit te proberen, moet je:,

1) Een Linux-distributie (bij voorkeur Ubuntu) geïnstalleerd op uw computer.
2) Python 3 geïnstalleerd op uw computer.
3) PIP 3 geïnstalleerd op uw computer.
4) Python virtueel pakket geïnstalleerd op uw computer.
5) Mozilla Firefox- of Google Chrome-webbrowsers geïnstalleerd op uw computer.
6) Moet weten hoe de Firefox Gecko Driver of Chrome Web Driver te installeren.

Lees mijn artikel om aan de vereisten 4, 5 en 6 te voldoen Inleiding tot Selenium met Python 3 bij Linuxhint.com.

Je kunt veel artikelen over de andere onderwerpen vinden op LinuxHint.com. Bekijk ze zeker als je hulp nodig hebt.

Een projectmap opzetten:

Maak een nieuwe projectdirectory om alles overzichtelijk te houden selenium-wacht/ als volgt:

$ mkdir -pv selenium-wait/drivers

Navigeer naar de selenium-wacht/ projectmap als volgt:

$ cd selenium-wacht/

Maak als volgt een virtuele Python-omgeving in de projectdirectory:

$ virtuele omgeving .venv

Activeer de virtuele omgeving als volgt:

$ bron .venv/bin/activeren

Installeer Selenium met PIP3 als volgt:

$ pip3 installeer selenium

Download en installeer alle vereiste webstuurprogramma's in de chauffeurs/ map van het project. Ik heb het proces van het downloaden en installeren van webstuurprogramma's uitgelegd in mijn artikel Inleiding tot Selenium met Python 3. Als je hulp nodig hebt, zoek dan op LinuxHint.com voor dat artikel.

Ik zal de Google Chrome-webbrowser gebruiken voor de demonstratie in dit artikel. Dus ik zal de gebruiken chromedriver binair van de chauffeurs/ map.

Werken met impliciete wachttijd:

Maak een nieuw Python-script om te experimenteren met impliciet wachten ex01.py in uw projectdirectory en typ de volgende regels codes in dat bestand:.

van selenium import webdriver
van selenium.webstuurprogramma.gemeenschappelijk.sleutels importeren Sleutels
opties = webstuurprogramma.Chrome-opties()
opties.zonder hoofd = waar
browser = webstuurprogramma.Chrome(executable_path="./drivers/chromedriver", options=opties)
browser.impliciet_wait(10)
browser.get("https://www.unixtimestamp.com/")
tijdstempel = browser.find_element_by_xpath("//h3[@class='text-danger'][1]")
print('Huidige tijdstempel: %s' % (tijdstempel.tekst.split(")[0]))
browser.dichtbij()

Als u klaar bent, slaat u de ex01.py Python-script.

Lijn 1 en 2 importeren alle benodigde Selenium componenten.

Regel 4 maakt een Chrome Options-object.

Lijn 5 schakelt de headless-modus in voor de Chrome-webdriver.

Regel 7 maakt een Chrome-browserobject met behulp van de chromedriver binair van de chauffeurs/ map.

Regel 8 wordt gebruikt om Selenium te vertellen om impliciet 10 seconden te wachten met behulp van de impliciet_wacht() browser methode:.

Regel 10 laadt de www.unixtimestamp.com in de browser.

Regel 12 vindt het tijdstempelelement met behulp van de XPath-selector //h3[@class='tekst-gevaar'][1] en bewaart het in de tijdstempel variabele.

Ik heb de XPath-selector van de Chrome Developer Tool. Zoals je kunt zien, staat de tijdstempel in de eerste h3 element met de klassenaam tekst-gevaar. Er zijn er 2 h3 elementen met de klas tekst-gevaar.

Regel 13 drukt alleen de tijdstempel af van het element dat ik heb geselecteerd met de XPath-selector en opgeslagen in de in tijdstempel variabele.

Regel 14 sluit de browser.

Als je klaar bent, voer je het Python-script uit ex01.py als volgt:

$ python3 ex01.py

Zoals je kunt zien, wordt de huidige tijdstempel geëxtraheerd uit unixtimestamp.com en afgedrukt op de console.

Werken met expliciete wachttijd:

Maak een nieuw Python-script om te experimenteren met expliciet wachten ex02.py in uw projectdirectory en typ de volgende regels codes in dat bestand:.

van selenium import webdriver
van selenium.webstuurprogramma.gemeenschappelijk.sleutels importeren Sleutels
van selenium.webstuurprogramma.gemeenschappelijk.door import Door
van selenium.webstuurprogramma.ondersteuning.ui importeren WebDriverWachten
van selenium.webstuurprogramma.ondersteuning import verwachte_voorwaarden
opties = webstuurprogramma.Chrome-opties()
opties.zonder hoofd = waar
browser = webstuurprogramma.Chrome(executable_path="./drivers/chromedriver", options=opties)
browser.get("https://www.unixtimestamp.com/")
proberen:
tijdstempel = WebDriverWait(browser, 10).tot(
verwachte_voorwaarden.presence_of_element_located((Door.XPATH, "
//h3[@class='text-danger'][1]"))
)
print('Huidige tijdstempel: %s' % (tijdstempel.tekst.split(")[0]))
Tenslotte:
browser.dichtbij()

Als u klaar bent, slaat u de ex02.py Python-script.

Regel 1-5 importeert alle vereiste componenten uit de Selenium-bibliotheek.

Regel 7 maakt een Chrome Options-object.

Line 8 schakelt de headless-modus in voor de Chrome-webdriver.

Regel 10 maakt een Chrome-browserobject met behulp van de chromedriver binair van de chauffeurs/ map.

Regel 12 laadt de www.unixtimestamp.com in de browser.

Het expliciete wachten wordt geïmplementeerd in het try-finally-blok (van regel 14-20)

Regel 15-17 gebruikt maakt WebDriverWacht() voorwerp. Het eerste argument van WebDriverWacht() is het browserobject en het tweede argument is de maximaal toegestane tijd (worst-case scenario) om aan de voorwaarde te voldoen, in dit geval 10 seconden.

In de tot() blok, verwachte_voorwaarden.presence_of_element_located() methode wordt gebruikt om ervoor te zorgen dat het element aanwezig is voordat wordt geprobeerd het element te selecteren. Hier, Door.XPATH wordt gebruikt om de tell te vertellen presence_of_element_located() methode die we een XPath-selector hebben gebruikt om het element te selecteren. De XPath-selector is: //h3[@class='tekst-gevaar'][1].

Zodra het element is gevonden, wordt het opgeslagen in de tijdstempel variabele.

Regel 18 drukt alleen de tijdstempel van het geselecteerde element af.

Ten slotte sluit regel 19-20 de browser.

Als je klaar bent, voer je de ex02.py Python-script als volgt:

$ python3 ex02.py

Zoals je kunt zien, is de huidige tijdstempel van unixtimestamp.com is afgedrukt op de console.

Elementen selecteren in expliciete wachttijden:

In het eerdere gedeelte heb ik gebruikt Door.XPATH voor het selecteren van het element met behulp van de XPath-selector. U kunt de elementen ook selecteren met behulp van ID, tagnaam, CSS-klassenaam, CSS-selector, enz.

De ondersteunde selectiemethoden worden hieronder gegeven:

Door.XPATH - Selecteert element/elementen met behulp van XPath-selector.

Door.NAAM VAN DE KLASSE - Selecteert element/elementen met behulp van CSS-klassenaam.

Door.CSS_SELECTOR - Selecteert element/elementen met behulp van CSS-selector.

Door.ID kaart - Selecteert element op ID

Door.NAAM - Selecteert element/elementen op naam.

Door.TAG_NAME - Selecteert element/elementen op HTML-tagnaam.

Door.VERBIND TEKST - Selecteert element/elementen op linktekst van een (anker) HTML-tag.

Door.PARTIAL_LINK_TEXT - Selecteert element/elementen door gedeeltelijke linktekst van een (anker) HTML-tag.

Ga voor meer informatie hierover naar de Python Selenium API-documentatiepagina.

Verwachte omstandigheden in expliciete wachttijden:

In het eerdere expliciete wachtvoorbeeld heb ik de . gebruikt presence_of_element_located() methode van verwachte_voorwaarden als de expliciete wachtvoorwaarde om er zeker van te zijn dat het element waar ik naar op zoek was, bestaat voordat ik het selecteer.

Er zijn andere verwachte_voorwaarden u kunt gebruiken als een expliciete wachtvoorwaarde. Sommige ervan zijn:

titel_is(titel) - controleert of de titel van de pagina is titel.

title_contains(gedeeltelijke_titel) - controleert of de titel van de pagina een deel van de titel bevat gedeeltelijke_titel.

zichtbaarheid_van(element) - controleert of de element is zichtbaar op de pagina waarvan het element een breedte en hoogte heeft die groter is dan 0.

zichtbaarheid_van_element_located(locator) -

presence_of_element_located(locator) - Zorg ervoor dat het element dat zich (bij de zoeker) is aanwezig op de pagina. De zoeker is een tupel van (Door, kiezer), zoals ik heb laten zien in het expliciete wachtvoorbeeld.

presence_of_all_element_located() - Zorgt ervoor dat alle elementen die overeenkomen met de zoeker is aanwezig op de pagina. De zoeker is een (Door, kiezer) tupel.

text_to_be_present_in_element(locator, tekst) - Controleert of de tekst is aanwezig in het element dat zich bij de bevindt zoeker. De zoeker is een (Door, kiezer) tupel.

element_to_be_clickable(locator) - Controleert of het element dat zich bij de . bevindt zoeker is zichtbaar en klikbaar. De zoeker is een (Door, kiezer) tupel.

element_to_be_selected(locator) - Controleert of het element dat zich bij de . bevindt zoeker is geselecteerd. De zoeker is een (Door, kiezer) tupel.

alert_is_present() - verwacht een waarschuwingsdialoogvenster op de pagina.

Er zijn veel meer verwachte_voorwaarden beschikbaar voor u om te gebruiken. Ga voor meer informatie hierover naar de Python Selenium API-documentatiepagina.

Conclusie:

In dit artikel heb ik de impliciete en expliciete wachttijden van Selenium besproken. Ik heb je ook laten zien hoe je kunt werken met een impliciete en expliciete wachttijd. Je moet altijd proberen om expliciet wachten te gebruiken in je Selenium-projecten, aangezien Selenium zal proberen de wachttijd zo veel mogelijk te verminderen. Op deze manier hoeft u niet elke keer dat u uw Selenium-projecten uitvoert een bepaald aantal seconden te wachten. Het expliciete wachten zou veel seconden moeten besparen.

Voor meer informatie over Selenium waits, bezoek de officiële Selenium Python Library waits Documentation pagina.

Top 5 Game Capture-kaarten
We hebben allemaal gezien en genoten van streaming gameplays op YouTube. PewDiePie, Jakesepticye en Markiplier zijn slechts enkele van de beste gamers...
Hoe een spel op Linux te ontwikkelen
Tien jaar geleden zouden niet veel Linux-gebruikers voorspellen dat hun favoriete besturingssysteem ooit een populair spelplatform voor commerciële vi...
Open source-poorten van commerciële game-engines
Gratis, open source en platformonafhankelijke game-engine-recreaties kunnen worden gebruikt om zowel oude als enkele van de vrij recente gametitels te...