Selen ist ein Framework zur Automatisierung von Webbrowser-Vorgängen. Entwickelt im Jahr 2004 von ThoughtWorks, um das Testen der Benutzeroberfläche von Webanwendungen zu automatisieren. https://selenium.dev/history/
Ursprünglich zum Testen der Benutzeroberfläche und des JavaScript-Tests von Webanwendungen entwickelt, wird es für andere Zwecke als zum Testen verwendet, z. B. zum Automatisieren von Aufgaben und zum Crawlen von Websites.
Dieser Artikel beschreibt, wie Sie eine Umgebung erstellen und für den Betrieb von Chrome über Selenium in Python verwenden.
TL;DR
Um den Browser automatisch mit Selenium zu betreiben, müssen Sie Folgendes installieren.
--Webbrowser --Chrome, Firefox, IE, Opera usw.
Hier werden zwei Arten der Umgebungskonstruktion vorgestellt, wenn Selenium mit Python verwendet wird: Zum einen Docker und zum anderen eine Umgebung direkt auf dem lokalen PC.
Die Einrichtung mit dem von Selenium offiziell veröffentlichten Docker-Image ist sehr einfach. https://github.com/SeleniumHQ/docker-selenium
Diese Methode hat eine solche Konfiguration.
Der Browser und Remote WebDriver werden auf dem Docker-Container ausgeführt, und Selenium stellt über das Netzwerk eine Verbindung zum Remote WebDriver von einem anderen Host her.
Persönlich ist diese Methode am einfachsten einzurichten und wird am meisten empfohlen.
Führen Sie einfach den folgenden Befehl aus, um die Chrome-Umgebung zu starten, die von Selenium aus betrieben werden kann.
$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-xenon
WebDriver hat ein etwas ärgerliches Problem, das nur funktioniert, wenn Sie die Version auswählen, die Ihrer Browserversion entspricht. Auf dem offiziellen Docker-Image sind jedoch sowohl der Browser als auch WebDriver installiert, sodass Sie es sofort verwenden können.
Installieren Sie die Bibliothek für die Verwendung von Selenium auf dem Computer, auf dem der Python-Code von Selenium ausgeführt wird. Pythons Selenium-Bindungen können mit pip installiert werden.
$ pip install selenium
Sie können Selenium von Python aus mit folgendem Code ausführen:
from selenium import webdriver
#Legen Sie die Chrome-Optionen fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')
#Stellen Sie eine Verbindung zum Selenium Server her
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
desired_capabilities=options.to_capabilities(),
options=options,
)
#Bedienen Sie den Browser über Selen
driver.get('https://qiita.com')
print(driver.current_url)
#Beenden Sie den Browser
driver.quit()
Als nächstes werde ich schreiben, wie eine Umgebung zum lokalen Ausführen von Selenium auf dem Mac erstellt wird.
Diese Methode hat eine solche Konfiguration.
Der Browser und der WebDriver werden alle lokal ausgeführt, und Selenium stellt eine Verbindung zum lokalen Treiber her.
Viele Benutzer haben Chrome möglicherweise bereits installiert, installieren Chrome jedoch normal.
Überprüfen Sie anschließend die installierte Version von Chrome, um festzustellen, welche Version von WebDirver installiert werden soll. In meiner Umgebung wurde 78.0.3904.108
installiert.
Laden Sie die Chrome WebDriver-Binärdatei herunter. In Python gibt es eine Person, die eine praktische Bibliothek namens "chromedriver-binary" veröffentlicht hat, die die WebDriver-Binärdatei herunterlädt und den Pfad festlegt. Ich werde diese also verwenden.
https://github.com/danielkaiser/python-chromedriver-binary
Da der WebDriver entsprechend der Chrome-Version installiert werden muss, installieren Sie WebDriver, indem Sie wie unten gezeigt nur die Hauptversion mit pip angeben.
$ pip install chromedriver-binary==78.*
Pythons Selenium-Bindungen werden mit pip installiert.
$ pip install selenium
In der lokalen Umgebung können Sie Selenium mit dem folgenden Code ausführen.
import chromedriver_binary # nopa
from selenium import webdriver
#Legen Sie die WebDriver-Optionen fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')
print('connectiong to remote browser...')
driver = webdriver.Chrome(options=options)
driver.get('https://qiita.com')
print(driver.current_url)
#Beenden Sie den Browser
driver.quit()
Im Vergleich zum vorherigen Beispiel in Docker besteht der Unterschied darin, dass die Chrome-Klasse für WebDriver angegeben ist.
Wenn Sie den obigen Code ausführen, wird Chrome auf Ihrem PC gestartet.
Wenn Sie den Teil options.add_argument ('--headless')
auskommentieren, können Sie sehen, wie der Browserbildschirm angezeigt wird und sich bewegt.
Nachdem Sie eine Umgebung für die Verwendung von Selen erstellt haben, sehen wir uns an, wie Sie es tatsächlich verwenden.
Lassen Sie uns nun Chrome auf Selenium ausführen und die folgenden Vorgänge ausführen.
Besuchen Sie die Chanmoro-Profilseite von Qiita https://qiita.com/Chanmoro
Wechseln Sie zur zweiten Seite der Artikelliste, die unter "Letzte Artikel" angezeigt wird.
Rufen Sie die URL ab und zeigen Sie den Titel des Artikels an, der ganz am Anfang der zweiten Seite angezeigt wird
Hier werden wir Selenium Server mit Docker verwenden, das zu Beginn in der Umgebungskonstruktion eingeführt wurde. Selbst in der lokalen Umgebung besteht der einzige Unterschied in dem Teil, der WebDrive einrichtet, und derselbe Code kann für nachfolgende Vorgänge verwendet werden.
Zunächst zeige ich Ihnen den gesamten Code.
from selenium import webdriver
from selenium.webdriver.common.by import By
# x.Legen Sie die Startoptionen für Chrome fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')
# x.Öffnen Sie ein neues Browserfenster
print('connectiong to remote browser...')
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
desired_capabilities=options.to_capabilities(),
options=options,
)
# 1.Besuchen Sie die Chanmoro-Profilseite von Qiita
driver.get('https://qiita.com/Chanmoro')
print(driver.current_url)
# > https://qiita.com/Chanmoro
# 2.Gehen Sie zur zweiten Seite der Artikelliste, die unter "Aktuelle Artikel" angezeigt wird.
driver.find_element(By.XPATH, '//a[@rel="next" and text()="2"]').click()
print(driver.current_url)
# > https://qiita.com/Chanmoro?page=2
# 3.Rufen Sie die URL für den Titel des Artikels ab, der ganz am Anfang der zweiten Seite angezeigt wird
article_links = driver.find_elements(By.XPATH, '//div[@class="ItemLink__title"]/a')
print(article_links[0].text)
# > Python -Rufen Sie eine Funktion dynamisch aus einer Zeichenfolge auf
print(article_links[0].get_attribute('href'))
# > https://qiita.com/Chanmoro/items/9b0105e4c18bb76ed4e9
# x.Beenden Sie den Browser
driver.quit()
Lassen Sie uns Schritt für Schritt erklären.
Legen Sie zunächst die Startoptionen für Chrome fest, bevor Sie Chrome starten. Optionale Klassen sind für jeden Browser separat, und es gibt browserkompatible Klassen wie "ChromeOptions" für Chrome und "FirefoxOptions" für Firefox.
In Chrome startet die Option "kopflos" den Browser, ohne den Bildschirm anzuzeigen. Grundsätzlich denke ich, dass es meistens im Headless-Modus betrieben wird, aber wenn Sie visuell überprüfen möchten, wie der Bildschirm während des Debuggens usw. betrieben wird, können Sie ihn auch verwenden, ohne diese Option anzugeben.
options = webdriver.ChromeOptions()
options.add_argument('--headless')
Öffnen Sie dann ein neues Fenster von Selenium. Wenn der Browser zu diesem Zeitpunkt nicht ausgeführt wird, wird er gestartet.
Wenn Sie Selenium Server verwenden, wie es zu Beginn in der Umgebungskonstruktion eingeführt wurde, verwenden Sie die Klasse "Remote" und geben Sie den Browsertyp mit dem Argument "gewünschte_Fähigkeiten" an. In diesem Beispiel enthält "options" ein "ChromeOptions" -Objekt, daher wird Chrome angegeben.
# NOTE:Geben Sie den Remote-WebDriver wie folgt an, um Selenium remote auszuführen:
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
desired_capabilities=options.to_capabilities(),
options=options,
)
Greifen Sie auf die angegebene URL zu, indem Sie die Methode "get ()" des WebDriver-Objekts aufrufen.
driver.get('https://qiita.com/Chanmoro')
Sie können auf die aktuell im Fenster angezeigte URL mit "current_url" und den mit "page_source" angezeigten HTML-Code zugreifen.
print(driver.current_url)
print(driver.page_source)
Gehen Sie zur zweiten Seite am Ende von "Letzte Artikel" in Ihrem Profilbildschirm. Klicken Sie auf den Link, um zur Seite zu gelangen.
Holen Sie sich in Selen das Zielelement mit "find_element" wie unten gezeigt und klicken Sie, indem Sie "click ()" für dieses Element aufrufen. Hier wird das a-Tag angegeben und angeklickt, das das Attribut "rel =" next "" hat und die Zeichenfolge "2" enthält.
driver.find_element(By.XPATH, '//a[@rel="next" and text()="2"]').click()
Zusätzlich zu XPath können Sie in Selenium das Zielelement auf verschiedene Arten angeben, z. B. als CSS-Selektor, ID-Spezifikation, Namensattributspezifikation und Klassenspezifikation. Persönlich mag ich XPath am meisten, weil es jedes Element auf einmal töten kann. Es ist für den ersten Moment etwas schwierig, bis ich mich an das Schreiben gewöhnt habe.
In diesem Beispiel wird XPath durch Angabe von "By.XPATH" in "find_element ()" geschrieben. Das Gleiche geschieht jedoch durch Angabe von XPath mit "find_element_by_xpath ()".
In diesem Dokument finden Sie weitere Informationen zu Methoden zum Angeben von Elementen. https://selenium-python.readthedocs.io/locating-elements.html
Dieses Mal erhalten wir mehrere Elemente, die durch "find_elements ()" angegeben werden.
Das zum Zeitpunkt des Klicks verwendete find_element ()
gibt nur das erste Element zurück, das der angegebenen Bedingung entspricht, aber find_elements ()
gibt ein Array von Elementen zurück, selbst wenn mehrere Übereinstimmungen vorliegen.
Auf der Profilseite wird "ItemLink__title" der Klasse des Elements des Artikeltitels in der Liste zugewiesen, daher habe ich mich darauf verlassen, um die Liste der Artikeltitel zu erhalten.
article_links = driver.find_elements(By.XPATH, '//div[@class="ItemLink__title"]/a')
Sie können "text" verwenden, um den in das Tag für das abgerufene Element geschriebenen Text abzurufen, und Sie können Attribute wie "href" mit "get_attribute ()" abrufen.
print(article_links[0].text)
print(article_links[0].get_attribute('href'))
Wenn der Vorgang abgeschlossen ist, rufen Sie "quit ()" auf, um den Browser zu beenden.
driver.quit()
Wenn Sie vergessen, "quit ()" aufzurufen, wenn während der Selenium-Verarbeitung ein Fehler auftritt, läuft der Browser weiter und es kommt zu einem Fehler, dass der Speicherverbrauch stetig zunimmt. Stellen Sie sicher, dass Sie den Fehler mit catch usw. behandeln, und rufen Sie am Ende des Programms immer "quit ()" auf.
Selen kann auch für Crawler-Anwendungen verwendet werden. Verwenden Sie Selenium, um JavaScript-Zeichen- und Schaltflächenklickvorgänge auszuführen, und verwenden Sie einen HTML-Parser, um die Elemente für die angezeigte Seite abzurufen.
Sie können den von Selenium selbst bereitgestellten HTML-Parser zum Parsen verwenden. Es wird jedoch empfohlen, eine Bibliothek wie BeautifulSoup zu verwenden, da diese nützliche Funktionen zum Parsen bietet und flexibler implementiert werden kann.
Insbesondere wird der von "driver.page_source" erhaltene HTML-Code analysiert und die Daten werden wie im folgenden Code gezeigt abgerufen.
from bs4 import BeautifulSoup
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
desired_capabilities=options.to_capabilities(),
options=options,
)
driver.get('https://qiita.com/Chanmoro')
#Erstellen Sie ein BeautifulSoup-Objekt aus dem im Browser angezeigten HTML-Code und analysieren Sie es
soup = BeautifulSoup(driver.page_source, 'html.parser')
articles = soup.select('.ItemLink')
for article in soup.select('.ItemLink'):
#Eine Liste der Artikeltitel wird auf Ihrer Profilseite angezeigt
print(article.select_one('.ItemLink__title a').get_text())
driver.quit()
Weitere Informationen zur Verwendung von Beautiful Soup finden Sie in dem wunderbaren Artikel "Beautiful Soup in 10 Minuten"! (nervig) https://qiita.com/Chanmoro/items/db51658b073acddea4ac
Übrigens habe ich in diesem Artikel die Umgebungseinstellung und die grundlegende Verwendung von Selen vorgestellt. Es ist sehr einfach, eine Umgebung mit Docker zu erstellen, aber es ist nicht allzu schwierig, eine Umgebung auf Ihrem lokalen PC zu erstellen, sodass Sie beide Methoden sofort ausprobieren können.
Selenium kann nicht nur zum Automatisieren von UI-Tests und Browser-Vorgängen verwendet werden, sondern auch zum Crawlen von Websites wie SPA, das mit JavaScript gerendert wird, wie ich am Ende erwähnt habe.
Für UI-Testzwecke gibt es außerdem einen sehr nützlichen Mechanismus namens Selenium Grid, mit dem Sie Tests auf mehreren Browsertypen gleichzeitig ausführen können. Selenium Grid ist ein großartiger Mechanismus, mit dem Sie mehrere Browsertypen wie Chrome, Firefox, IE und mehrere Browserversionen zusammenfassen und denselben Test über Hub auf diesen mehreren Browsern parallel ausführen können. ist.
Selenium Grid erleichtert auch das Erstellen einer Umgebung mit Docker. Weitere Informationen finden Sie in der Selenium Grid-Dokumentation und in der Docker-Selen-README-Datei. https://selenium.dev/documentation/en/grid/ https://github.com/SeleniumHQ/docker-selenium
Beim Schreiben dieses Artikels habe ich Geschichte von Selen gelesen und erfahren, dass die ThoughtWorks-Ingenieure zuerst das Konzept und die Kernfunktionen von Selen entwickelt haben. Persönlich finde ich, dass es plötzlich cool ist, nur weil es von einer Person aus ThoughtWorks gemacht wurde.
Es gibt auch eine sehr nützliche Browser-Erweiterung namens Selenium IDE, mit der Sie den Browser manuell bewegen können, um seine Vorgänge aufzuzeichnen und wiederzugeben, nämlich Japan. Es scheint, dass eine Person Shinya Kasatani (@shinya) entwickelt wurde.
Selen sollte einen revolutionären Einfluss auf die Entwicklung von Webanwendungen haben, und es ist wirklich erstaunlich, dass solche Software als OSS erstellt und veröffentlicht wurde und auf der ganzen Welt weit verbreitet ist.
Lassen Sie uns jetzt alle verstehen, wie man Selen verwendet, auf den Schultern von Riesen steht und heute ein lustiges Leben in der Browser-Automatisierung hat!
Recommended Posts