Selenium

Selenium zonder hoofd gebruiken met chroom

Selenium zonder hoofd gebruiken met chroom
Als u Selenium-webautomatisering of webscraping wilt doen met de Chrome-webbrowser, wordt standaard de grafische versie van de Chrome-webbrowser uitgevoerd. Het is geen probleem wanneer u uw Selenium-script uitvoert vanuit een grafische Linux-desktopomgeving (i.e., GNOME 3, KDE, XFCE4). Maar als u uw Selenium-script in een headless-omgeving wilt uitvoeren (i.e., Ubuntu Server, CentOS/RHEL Server) waar je geen grafische desktopomgeving hebt geïnstalleerd, dan werkt dit niet.

Gelukkig kun je Selenium configureren om de Chrome-webbrowser in headless-modus uit te voeren. In deze modus werkt de Chrome-webbrowser zonder grafische gebruikersinterface. Selenium kan dus webautomatisering, webscraping, browsertests, enz. de Chrome-webbrowser gebruiken op Linux-servers waarop geen grafische desktopomgeving is geïnstalleerd.

In dit artikel laat ik je zien hoe je Selenium kunt gebruiken met de Chrome-webbrowser in headless-modus. Ik zal de Selenium Python-bibliotheek gebruiken en de Selenium-scripts schrijven met behulp van de programmeertaal Python 3. Dus laten we beginnen.

Vereisten:

Om de commando's en voorbeelden uit 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) Google Chrome geïnstalleerd op uw computer.

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

Python 3 virtuele omgeving voorbereiden voor het project:

Python Virtual Environment wordt gebruikt om een ​​geïsoleerde Python-projectdirectory te maken. De Python-modules die u met PIP installeert, worden alleen in de projectdirectory geïnstalleerd, niet wereldwijd.

Python virtueel module wordt gebruikt om virtuele Python-omgevingen te beheren.

U kunt Python installeren virtueel module wereldwijd met behulp van PIP 3 als volgt:

$ sudo pip3 installeer virtualenv

Python virtueel moet worden geïnstalleerd.

Een projectdirectory maken chroom-headless/ in uw huidige werkmap als volgt:

$ mkdir -pv chrome-headless/drivers

Navigeer naar uw nieuw gemaakte projectdirectory chroom-headless/ als volgt:

$ cd chroom-headless /

Maak een virtuele Python-omgeving in uw projectdirectory met de volgende opdracht:

$ virtuele omgeving .venv

De virtuele Python-omgeving moet worden gemaakt in de .venv/ directory in uw projectdirectory.

Activeer de virtuele Python-omgeving van uw projectdirectory met het volgende commando:

$ bron .venv/bin/activeren

Selenium Python-bibliotheek installeren:

Selenium-bibliotheek is beschikbaar in de officiële Python PyPI-repository.

U kunt de Selenium Python-bibliotheek als volgt installeren met PIP 3:

$ pip3 installeer selenium

Selenium Python-bibliotheek moet zijn geïnstalleerd.

Chrome-webstuurprogramma installeren:

Met Chrome Web Driver kunt u de Google Chrome-webbrowser van Selenium besturen of automatiseren.

In dit gedeelte laat ik u zien hoe u de Chrome Web Driver installeert.

Open eerst Google Chrome en ga naar chrome://settings/help.

Zodra de pagina is geladen, zou u het versienummer van Google Chrome moeten vinden in de Over Chrome sectie. Let op de eerste 3 secties van het versienummer zoals aangegeven in de onderstaande schermafbeelding.

Om Chrome Web Driver te downloaden, gaat u naar de officiële Chrome Driver downloadpagina.

In de Huidige releases sectie, zou Chrome Web Driver voor de meest recente releases van de Google Chrome-webbrowser beschikbaar moeten zijn, zoals u kunt zien in de onderstaande schermafbeelding. Een van de huidige Chrome Web Driver-releases moet een overeenkomend versienummer hebben met uw Google Chrome-webbrowser. De eerste 3 secties van het versienummer van Chrome Web Driver en Google Chrome webbrowser moeten overeenkomen must.

Als de versie die u zoekt niet in de Huidige releases sectie, scroll een beetje naar beneden en je zou het moeten kunnen vinden.

Zodra u op het versienummer van Chrome Web Driver klikt, zou het naar de downloadpagina moeten gaan. Klik op de chromedriver_linux64.zip bestand van hier.

Het Chrome Web Driver-archief moet worden gedownload.

De gedownloade chromedriver_linux64.zip bestand zou in uw moeten staan ~/Downloads map.

$ ls -lh ~/Downloads

Pak de chromedriver_linux64.zip archief van de ~/Downloads map naar de chauffeurs/ directory van uw project als volgt:

$ unzip ~/Downloads/chromedriver_linux64.zip -d stuurprogramma's/

Een nieuw bestand chromedriver moet worden gemaakt in de chauffeurs/ map van uw project zodra het Chrome Web Driver-archief is uitgepakt, zoals u kunt zien in de onderstaande schermafbeelding.

Chrome-webstuurprogramma testen in Headless-modus:

In dit gedeelte laat ik je zien hoe je Selenium kunt gebruiken met Chrome Driver in headless-modus.

Maak eerst een nieuw Python-script ex01.py in uw projectdirectory en typ de volgende regels codes erin:.

van selenium import webdriver
van selenium.webstuurprogramma.gemeenschappelijk.sleutels importeren Sleutels
van selenium.webstuurprogramma.chroom.opties importeren Opties
chromeOptions = Opties()
chromeOpties.zonder hoofd = waar
browser = webstuurprogramma.Chrome(executable_path="./drivers/chromedriver", options=chromeOptions)
browser.get("http://linuxhint.com")
print("Titel: %s" % browser.titel)
browser.stoppen()

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

Deze regels importeren alle benodigde dingen uit de selenium bibliotheek.

Zoals ik al eerder zei, probeert het Chrome-stuurprogramma standaard Google Chrome in grafische modus uit te voeren. Om Google Chrome in headless-modus uit te voeren, moeten we de Chrome-driver vertellen om enkele extra opties door te geven. Deze regel creëert een Opties object dat we later kunnen doorgeven aan de Chrome-webdriver.

U kunt Google Chrome in headless-modus uitvoeren door simpelweg de zonder hoofd eigendom van de chromeOpties bezwaar maken tegen waar.

Of u kunt de add_argument() methode van de chromeOpties object om de . toe te voegen -zonder hoofd opdrachtregelargument om Google Chrome in headless-modus uit te voeren met behulp van het Selenium Chrome-webstuurprogramma.

U kunt een webstuurprogramma.chroom() methode om een ​​Google Chrome-webbrowser te initialiseren/uitvoeren vanuit Selenium. De uitvoerbaar_pad argument wordt gebruikt om Selenium te vertellen om de te gebruiken chromedriver binair van de chauffeurs/ map van het project. De opties argument vertelt Selenium om onze aangepaste opties te gebruiken chromeOpties.

Zodra Selenium een ​​Google Chrome-webbrowser uitvoert met de Selenium Chrome Web Driver, keert het terug a browser voorwerp. We kunnen het later gebruiken om de Google Chrome-instantie te bedienen.

De browser.krijgen() methode laadt de linuxhint.com website in de Google Chrome webbrowser op de achtergrond (in headless mode).

Zodra de pagina is geladen, browser.titel eigendom krijgt de titel van de website. De Python afdrukken() methode drukt de titel van de website af op de console.

Dan de browser.stoppen() methode sluit de Google Chrome-webbrowser.

Om te testen of Selenium in headless-modus kan werken, voer je het Python-script uit ex01.py als volgt:

$ python3 ex01.py

Het zou de titel van de website op de console moeten afdrukken zonder de Google Chrome-webbrowser in grafische modus te openen.

Om je te laten zien dat het werkt vanaf Linux headless-servers (waar geen grafische gebruikersinterface is geïnstalleerd), heb ik het Python-script uitgevoerd ex01.py op Ubuntu Server 20.04 LTS. Zoals je kunt zien, werkt het script prima.

Webscraping met Selenium in Headless Mode met behulp van de Chrome Web Driver:

In dit gedeelte laat ik u een voorbeeld zien van webscraping in Selenium met behulp van het Chrome-webstuurprogramma in headless-modus.

Bezoek eerst de random-name-generator.info van Google Chrome of een andere webbrowser. Deze website genereert elke keer dat u de pagina herlaadt 10 willekeurige namen, zoals u kunt zien in de onderstaande schermafbeelding. Ons doel is om deze willekeurige namen te extraheren met Selenium in headless-modus.

Om de HTML-structuur van de lijst te weten te komen, moet u de . openen Chrome-ontwikkelaarstool. Druk hiervoor op de rechter muisknop (RMB) op de pagina en klik op Inspecteren of druk op + + ik.

Chrome-ontwikkelaarstool moet worden geopend. Klik op de Inspecteer icoon () zoals aangegeven in de onderstaande schermafbeelding.

Plaats de muisaanwijzer op de lijst met Willekeurige namen. De lijst moet worden gemarkeerd zoals aangegeven in de onderstaande schermafbeelding. Druk vervolgens op de linkermuisknop (LMB) om de lijst te selecteren.

De HTML-code van de lijst moet worden gemarkeerd in de elementen tabblad van de Chrome-ontwikkelaarstool. Hier staat de lijst met willekeurige namen in a div element. De div element heeft de klasse naam resultaten. Binnenin hebben we een oud element met de klasse naam namenlijst. Binnen in de oud element, elk van de namen staat in a li element.

Hieruit kunnen we zeggen dat om naar de li tags, we moeten volgen div.resultaten > oude.naamLijst > li

Onze CSS-selector zal dus zijn: div.resultaten oud.naamLijst li (vervang gewoon de > borden met witruimte)

Maak voor het extraheren van deze willekeurige namen een nieuw Python-script ex02.py en typ de volgende regels codes erin:.

van selenium import webdriver
van selenium.webstuurprogramma.gemeenschappelijk.sleutels importeren Sleutels
van selenium.webstuurprogramma.chroom.opties importeren Opties
chromeOptions = Opties()
chromeOpties.zonder hoofd = waar
browser = webstuurprogramma.Chrome(executable_path="./drivers/chromedriver", options=chromeOptions)
browser.get("http://willekeurige-naam-generator.info/")
nameList = browser.find_elements_by_css_selector('div.resultaten oud.naamLijst li')
voor naam in naamlijst:
print naam.tekst)
browser.stoppen()

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

Ik heb de regels 1-8 uitgelegd in het eerdere gedeelte van dit artikel. Deze zijn hetzelfde als in ex01.py.

Regel 10 laadt de website voor het genereren van willekeurige namen met behulp van de browser.krijgen() methode.

Regel 11 selecteert de namenlijst met de browser.find_elements_by_css_selector() methode. Deze methode gebruikt de CSS-selector div.resultaten oud.naamLijst li om de namenlijst te vinden. Vervolgens wordt de namenlijst opgeslagen in de namenlijst variabele.

In regel 13 en 14, a voor lus wordt gebruikt om door de te itereren namenlijst lijst van li elementen. In elke iteratie wordt de inhoud van de li element is afgedrukt op de console.

Voer nu het Python-script uit ex02.py als volgt:

$ python3 ex02.py

Zoals je kunt zien, is het Python-script ex02.py alle willekeurige namen van de webpagina opgehaald.

Als je het script een tweede keer uitvoert, zou het een nieuwe lijst met willekeurige namen moeten retourneren, zoals je kunt zien in de onderstaande schermafbeelding.

Problemen waarmee u te maken kunt krijgen wanneer u selenium gebruikt in de modus zonder hoofd:

Je hebt eerder gezien dat het uitvoeren van Selenium in headless-modus met behulp van de Chrome-driver net zo eenvoudig is als het instellen van de chromeOpties.zonder hoofd vlag naar waar.

Deze oplossing werkt mogelijk niet voor u op sommige Linux-distributies. In dit gedeelte ga ik het hebben over enkele van de problemen waarmee u te maken kunt krijgen als u Selenium in headless-modus gebruikt met behulp van het Chrome-webstuurprogramma.

Standaard doet de Google Chrome-webbrowser veel sandboxing (voert veel dingen uit in een geïsoleerde omgeving). Dit kan problemen veroorzaken bij het uitvoeren van Selenium in headless-modus met behulp van het Chrome-webstuurprogramma. U kunt sandboxing voor Google Chrome uitschakelen met behulp van de -geen-zandbak vlag.

Om de . toe te voegen -geen-zandbak vlag, voeg de volgende regel toe voordat u het Selenium Chrome-stuurprogramma initialiseert met behulp van webstuurprogramma.chroom() methode (lijn 8 in ex01.py Python-script).

chromeOpties.add_argument("--geen-sandbox")

U kunt problemen ondervinden bij het uitvoeren van bepaalde dingen in de Google Chrome-webbrowser van Selenium, zoals het maken van schermafbeeldingen van de website enzovoort. Dit kan gebeuren omdat Google Chrome in de headless-modus een onjuiste virtuele schermresolutie kan instellen. Het kan dus zijn dat uw website er niet goed uitziet. U kunt de gewenste virtuele schermresolutie voor de Google Chrome-webbrowser in headless-modus instellen met de -venstergrootte opdrachtregeloptie.

Om bijvoorbeeld de virtuele schermbreedte in te stellen op: 1280 pixels en hoogte tot 720 pixels, voeg de toe -venstergrootte opdrachtregeloptie voordat u het Selenium Chrome-stuurprogramma initialiseert met behulp van webstuurprogramma.chroom() methode (lijn 8 in ex01.py Python-script) als volgt:

chromeOpties.add_argument("--window-size=1280.720")

Uw server heeft mogelijk geen GPU geïnstalleerd of heeft mogelijk een GPU die de Google Chrome-webbrowser niet weet te gebruiken. Standaard moet Google Chrome GPU-versnelling automatisch uitschakelen als er geen GPU beschikbaar is of als er een niet-ondersteunde GPU beschikbaar is. In sommige gevallen lukt het misschien niet. In dat geval kan Selenium de Google Chrome-webbrowser mogelijk niet in headless-modus uitvoeren. Om dit probleem op te lossen, moet u GPU-versnelling uitschakelen met de -uitschakelen-gpu vlag.

Om de . toe te voegen -uitschakelen-gpu vlag, voeg de volgende regel toe voordat u het Selenium Chrome-stuurprogramma initialiseert met behulp van webstuurprogramma.chroom() methode (lijn 8 in ex01.py Python-script).

chromeOpties.add_argument(“-disable-gpu”)

Conclusie:

In dit artikel heb ik je laten zien hoe je Selenium in de headless-modus instelt met behulp van de Chrome-webdriver. Ik heb de basis behandeld, waarmee u aan de slag kunt gaan met headless Selenium-browserautomatisering, webtests en webscraping.

Ik heb ook enkele van de Google Chrome-opdrachtregelargumenten / vlaggen behandeld die u kunt gebruiken om enkele van de problemen op te lossen die u mogelijk hebt tijdens het uitvoeren van Selenium in headless-modus met behulp van het Chrome-webstuurprogramma.

Er zijn veel meer Google Chrome-opdrachtregelopties beschikbaar, die ik in dit artikel niet heb besproken. Deze opdrachtregelopties kunnen nuttig zijn voor uw project. U kunt alle ondersteunde Google Chrome-opdrachtregelopties vinden op de pagina Lijst met Chromium-opdrachtregelschakelaars van Peter Beverloo.

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...