Selenium à comprendre en 10 minutes a été très utile, j'ai donc fait une petite suite sans permission.
[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()
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.
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.
Vous n'avez plus à vous soucier d'oublier de quitter le conteneur Docker ou Webdriver. Bonne vie au sélénium!
Recommended Posts