Selen in 10 Minuten zu verstehen war sehr hilfreich, deshalb habe ich eine kleine Fortsetzung ohne Erlaubnis gemacht.
[Methode 1 von "Selen in 10 Minuten zu verstehen"](https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a#%E6%96%B9%E6%B3%951-doceker-%E3%81%A7% Laut E7% 92% B0% E5% A2% 83% E6% A7% 8B% E7% AF% 89) dauert es einige Zeit, um die Umgebung aufzubauen, indem eine Verbindung zu dem zuvor erstellten und verschobenen Selenium Docker-Container hergestellt wird. Sie können sich leicht mit Selen anlegen, ohne es zu müssen. Der Docker-Container funktioniert jedoch auch nach Verwendung des Selenium-Skripts weiter, und Sie müssen ihn selbst beenden.
In diesem Artikel werden wir den Prozess des Stoppens und Löschens des Docker-Containers nach dem Ausführen des Skripts automatisieren. Also ** Es ist eine Lüge, dass dieser Artikel ein Selen-Artikel ist. ** Titelbetrug. Es tut uns leid.
Dieser Artikel zeigt Ihnen eine gute Möglichkeit, mit einem Docker-Container mit dem Docker SDK für Python unter Selen zu arbeiten. ..
TL;DR Installieren Sie zunächst Docker SDK für Python.
pip install docker
import docker
import time
from selenium import webdriver
from contextlib import contextmanager
SELENIUM_IMAGE = 'selenium/standalone-chrome:3.141.59-xenon'
@contextmanager
def selenium_container():
client = docker.from_env()
try:
selenium_image = client.images.get(SELENIUM_IMAGE)
except docker.errors.ImageNotFound:
selenium_image = client.images.pull(SELENIUM_IMAGE)
container = client.containers.run(
selenium_image, detach=True, remove=True,
ports={4444: 4444}, shm_size='2g')
try:
while b'Selenium Server is up' not in container.logs():
time.sleep(0.1)
yield container
finally:
container.kill()
@contextmanager
def selenium_driver():
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
desired_capabilities=options.to_capabilities(),
options=options,
)
try:
yield driver
finally:
driver.quit()
def test():
with selenium_container(), selenium_driver() as driver:
driver.get('https://qiita.com')
print(driver.current_url)
if __name__ == '__main__':
test()
contextmanager
@contextmanager
def selenium_container():
Ich habe contextlib.contextmanager verwendet, um den Container normal zu beenden, selbst wenn ein Fehler auftritt. Gleiches gilt für den Webdriver.
client = docker.from_env()
try:
selenium_image = client.images.get(SELENIUM_IMAGE)
except docker.errors.ImageNotFound:
selenium_image = client.images.pull(SELENIUM_IMAGE)
Holen Sie sich zuerst das Selenium Docker-Bild. Wenn Sie es noch nicht gezogen haben, ziehen Sie es zuerst.
docker run
container = client.containers.run(
selenium_image, detach=True, remove=True,
ports={4444: 4444}, shm_size='2g')
Dies entspricht "Docker-Lauf -d -p 4444: 4444 --shm-Größe = 2 g Selen / Standalone-Chrom: 3.141.59-Xenon".
docker kill
try:
while b'Selenium Server is up' not in container.logs():
time.sleep(0.1)
yield container
finally:
container.kill()
Da wir "remove = True" übergeben, geht "client.containers.run ()" zum nächsten Schritt über, sobald wir den Docker-Container starten. Daher ist Webdriver zu diesem Zeitpunkt noch nicht bereit. Zuerst müssen Sie warten, bis es fertig ist. Wenn die Vorbereitung abgeschlossen ist, gibt das Docker-Containerprotokoll "06: 53: 00.628" aus. INFO [SeleniumServer.boot] - Selenium Server ist auf Port 4444 usw. in Betrieb. Drehen Sie also die while-Schleife, bis diese Ausgabe erhalten wird. Warten Sie [^ 1].
[^ 1]: Docker SDK für Python-Dokumentation hat logs () Es ist geschrieben, dass
return str
, aber bitte beachten Sie, dass es zum Zeitpunkt des Schreibens des Artikels aus irgendeinem Grund bytes
zurückgibt.
Wenn Sie bereit sind, geben Sie den Behälter. Dieser erhaltene Container kann als mit selenium_container () als Container referenziert werden:
.
Die Verarbeitung von selenium_driver
wird angehalten, wenn ein Container ausgegeben wird, und wartet, bis er den with
-Block verlässt.
Wenn der Prozess abgeschlossen ist oder ein Fehler innerhalb des with
-Blocks auftritt und den with
-Block verlässt, wird der selenium_driver
erneut gestartet und die container.kill ()
des finally
-Blocks ausgeführt. Ich werde das machen.
Jetzt müssen Sie nicht mehr vergessen, den Docker-Container oder den Webdriver zu beenden. Hab ein gutes Selenleben!
Recommended Posts