Selenium-Headless-Browser-Modus
Der Headless-Browser-Modus (Headless Mode) bezeichnet das Ausführen eines Browsers ohne grafische Benutzeroberfläche (GUI). Mit anderen Worten: Der Browser läuft im Hintergrund und es erscheint kein sichtbares Fenster.
Der Headless-Browser-Modus wird häufig in Szenarien wie automatisiertem Testen, Web Scraping und Performance-Tests verwendet, da er Systemressourcen einsparen kann und auch auf Servern ohne Display normal ausgeführt werden kann.
Headless-Modus aktivieren: Durch
ChromeOptionsoderFirefoxOptionsHinzufügen--headlessParameter.Optimierungseinstellungen: GPU-Beschleunigung deaktivieren, Fenstergröße festlegen usw.
Headless-Modus überprüfen: Überprüfen Sie die Ergebnisse der Skriptausführung, indem Sie den Seitentitel ausgeben oder Screenshots aufnehmen.
Warum den Headless-Browser-Modus verwenden?
- Ressourcen sparen: Der Headless-Modus muss die grafische Oberfläche nicht rendern, daher lassen sich CPU- und Speicherressourcen einsparen.
- Geschwindigkeit verbessern: Da die grafische Oberfläche nicht geladen und gerendert werden muss, ist der Headless-Modus normalerweise schneller als der normale Modus.
- Für Automatisierung geeignet: Bei automatisierten Tests und Web-Scraping kann der Headless-Modus Störungen vermeiden und auf Servern ohne Display ausgeführt werden.
- Einfach zu debuggen: In manchen Fällen kann der Headless-Modus Entwicklern helfen, Probleme schneller zu debuggen und zu lokalisieren.
Headless-Browser-Modus in Selenium
Chrome-Headless-Modus einstellen
In Selenium können Sie dieChromeOptionsKlasse, um den Chrome-Browser in den Headless-Modus zu versetzen. Hier ist ein einfaches Beispiel:
Beispiel
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Durch
from selenium.webdriver.chrome.options import Optionen
# Chrome in den Headless-Modus versetzen
chrome_options = Options()
chrome_options.add_argument("--headless") # Headless-Modus aktivieren
chrome_options.add_argument("--disable-gpu") # GPU-Beschleunigung deaktivieren
# Eine WebDriver-Instanz erstellen
driver = webdriver.Chrome(service=Service('/path/to/chromedriver'), options=chrome_options)
# Eine Webseite öffnen
driver.get("https://www.baidu.com")
# Den Webseitentitel ausgeben
print(driver.title)
# Den Browser schließen
driver.quit()
Headless-Modus für Firefox einstellen
Für den Firefox-Browser können Sie dieFirefoxOptionsKlasse, um den Headless-Modus einzustellen. Hier ist ein Beispiel:
Beispiel
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Optionen
# Firefox in den Headless-Modus versetzen
firefox_options = Options()
firefox_options.add_argument("--headless") # Headless-Modus aktivieren
# Eine WebDriver-Instanz erstellen
driver = webdriver.Firefox(service=Service('/path/to/geckodriver'), options=firefox_options)
# Eine Webseite öffnen
driver.get("https://www.example.com")
# Den Webseitentitel ausgeben
print(driver.title)
# Den Browser schließen
driver.quit()
Edge-Headless-Modus einstellen
Für den Edge-Browser können Sie den folgenden Code verwenden:EdgeOptionsKlasse, um den Headless-Modus einzustellen. Hier ist ein Beispiel:
Beispiel
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Optionen
# Edge in den Headless-Modus versetzen
edge_options = Options()
edge_options.add_argument("--headless") # Headless-Modus aktivieren
# Eine WebDriver-Instanz erstellen
driver = webdriver.Edge(service=Service('/path/to/msedgedriver'), options=edge_options)
# Eine Webseite öffnen
driver.get("https://www.example.com")
# Den Webseitentitel ausgeben
print(driver.title)
# Den Browser schließen
driver.quit()
Häufige Probleme und Lösungen im Headless-Modus
Unvollständiges Laden der Seite
Im Headless-Modus kann die Seite manchmal nicht vollständig geladen werden, sodass Elemente nicht gefunden werden. Dies kann auf folgende Weise gelöst werden:
- Wartezeit erhöhen: Verwenden Sie
WebDriverWaitexplizite Wartezeit, bis Elemente fertig geladen sind. - Fenstergröße anpassen: Manchmal ändern sich Position und Größe von Seitenelementen je nach Fenstergröße, und Sie können
driver.set_window_size(width, height)die Fenstergröße festlegen.
Screenshots und Protokolle
Im Headless-Modus müssen Sie möglicherweise Screenshots erstellen oder Protokolle aufzeichnen, um Probleme zu debuggen. Sie können die folgenden Methoden verwenden:
- Screenshot: Verwenden Sie
driver.save_screenshot('screenshot.png')um einen Screenshot der aktuellen Seite zu speichern. - Protokolle: Über
driver.get_log('browser')Browser-Protokolle abrufen.
Der Headless-Browser-Modus ist ein leistungsstarkes Werkzeug im automatisierten Testen mit Selenium und beim Web-Scraping. Mit einfachen Einstellungen können Sie den Browser ohne grafische Oberfläche ausführen, Ressourcen sparen und die Effizienz verbessern. Ob Chrome, Firefox oder Edge – Selenium4 bietet einfache Möglichkeiten, den Headless-Modus zu aktivieren.
Das Folgende ist ein vollständiges Codebeispiel dafür, wie Sie Selenium im Headless-Modus verwenden, um einen Screenshot der Baidu-Startseite (www.baidu.com) zu erstellen.
Der Code aktiviert den Headless-Modus des Chrome-Browsers, erstellt einen Screenshot der Seite und speichert ihn in einer Datei.
Beispiel
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Optionen
from selenium.webdriver.common.by import Durch
# Chrome-Optionen konfigurieren
chrome_options = Options()
chrome_options.add_argument("--headless") # Headless-Modus aktivieren
chrome_options.add_argument("--disable-gpu") # GPU-Beschleunigung deaktivieren
chrome_options.add_argument("--window-size=1920,1080") # Fenstergröße festlegen
# Korrekten Treiberpfad festlegen
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
# Baidu-Startseite öffnen
driver.get("https://www.baidu.com")
# Warten, bis die Seite vollständig geladen ist
time.sleep(2) # Wartezeit nach Bedarf anpassen
# Seitenladevorgang zwangsweise beenden
driver.execute_script("window.stop();")
# Seitentitel ausgeben
print("Page title:", driver.title)
# Screenshot der Seite aufnehmen und speichern
screenshot_path = "baidu_screenshot.png"
driver.save_screenshot(screenshot_path)
print(f"Screenshot gespeichert unter: {screenshot_path}")
finally:
# Den Browser schließen
driver.quit()
Nach erfolgreicher Ausführung wird die folgende Ausgabe angezeigt:
页面标题: 百度一下,你就知道 截图已保存到: baidu_screenshot.png
Öffnen Sie das aktuelle Verzeichnis, und Sie sehen die Datei baidu_screenshot.png. Öffnen Sie sie, und sie wird wie folgt angezeigt:
