[PYTHON] Le sélénium fonctionne en 15 minutes

Selenium à comprendre en 10 minutes a été très utile, j'ai donc fait une petite suite sans permission.

Objectifs de cet article

[Méthode 1 de "Selenium pour comprendre en 10 minutes"](https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a#%E6%96%B9%E6%B3%951-doceker-%E3%81%A7% Selon E7% 92% B0% E5% A2% 83% E6% A7% 8B% E7% AF% 89), il faut du temps pour créer l'environnement en se connectant au conteneur Selenium Docker qui a été créé et déplacé plus tôt. Vous pouvez facilement jouer avec Selenium sans avoir à le faire. Cependant, tel quel, le conteneur Docker continuera à fonctionner même après avoir utilisé le script Selenium, et vous devrez le quitter vous-même.

Dans cet article, nous automatiserons le processus d'arrêt et de suppression du conteneur Docker après l'exécution du script. Donc ** C'est un mensonge que cet article est un article de Selenium. ** Fraude de titre. Pardon.

Cet article vous montrera une manière agréable de travailler avec un conteneur Docker avec le SDK Docker pour Python sur Selenium. ..

TL;DR Tout d'abord, installez le SDK Docker pour 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()

Commentaire

contextmanager

@contextmanager
def selenium_container():

J'ai utilisé contextlib.contextmanager pour terminer le conteneur normalement même si une erreur se produit. La même chose est vraie pour Webdriver.

Obtenir l'image Docker

    client = docker.from_env()
    try:
        selenium_image = client.images.get(SELENIUM_IMAGE)
    except docker.errors.ImageNotFound:
        selenium_image = client.images.pull(SELENIUM_IMAGE)

Commencez par obtenir l'image Selenium Docker. Si vous ne l'avez pas encore tiré, tirez-le d'abord.

docker run

    container = client.containers.run(
        selenium_image, detach=True, remove=True,
        ports={4444: 4444}, shm_size='2g')

Cela équivaut à docker run -d -p 4444: 4444 --shm-size = 2g sélénium / standalone-chrome: 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()

Puisque nous passons detach = True,client.containers.run ()passe à l'étape suivante dès que nous lançons le conteneur Docker. Par conséquent, Webdriver n'est pas encore prêt à ce stade. Vous devez d'abord attendre qu'il soit prêt. Lorsque la préparation est terminée, le journal du conteneur Docker affichera 06: 53: 00.628 INFO [SeleniumServer.boot] --Selenium Server est opérationnel sur le port 4444, etc., alors tournez la boucle while jusqu'à ce que cette sortie soit obtenue. Attendez [^ 1].

[^ 1]: Docker SDK for Python Documentation contient logs () Il est écrit que retourne str, mais veuillez noter que cela renvoie octets pour une raison quelconque au moment de la rédaction de l'article.

Lorsque vous êtes prêt, cédez le récipient. Ce conteneur produit peut être référencé comme avec selenium_container () comme conteneur:. Le traitement de selenium_driver s'interrompt quand il donne un conteneur et attend jusqu'à ce qu'il quitte le bloc avec. Si le processus se termine ou qu'une erreur se produit à l'intérieur du bloc with et quitte le bloc with, le selenium_driver redémarrera et le container.kill () ʻdu bloc finally` sera exécuté. Je le ferai.

Résumé

Vous n'avez plus à vous soucier d'oublier de quitter le conteneur Docker ou Webdriver. Bonne vie au sélénium!

Recommended Posts

Le sélénium fonctionne en 15 minutes
Apprenez les pandas en 10 minutes
Grattage au sélénium en Python
Grattage avec du sélénium en Python
Wrapper exécutant Hadoop en Python
Commencez dans 5 minutes GIMP Python-Fu
Scraping avec Selenium en Python (Basic)
Correction d'Apscheduler fonctionnant deux fois dans Flask
Faisons l'expérience de BERT dans environ 30 minutes.
Gratter avec une belle soupe en 10 minutes
Ecrire le code de test du sélénium en python
J'ai essayé d'exécuter GAN dans Colaboratory
Rendre matplotlib compatible avec le japonais en 3 minutes
Déployez Django en 3 minutes à l'aide de docker-compose
[Comprendre en 3 minutes] Le début de Linux
[Python] pandas à bien comprendre en 10 minutes
Je ne peux pas obtenir l'élément dans Selenium!
Principes de base pour exécuter NoxPlayer en Python
Tutoriel de clé externe de Django en 10 minutes
Captures d'écran de la pêche sur le Web avec du sélénium et Chrome.
Obtenez Cloud Logging disponible en Python en 10 minutes
Figer avec send_keys de la sélection de fichiers lors de l'exécution du pilote Web Selenium en Python [PhantomJS]