Python&Docker環境でSeleniumを使えるようにする

環境

  • Windows 10
  • Python 3.9.4
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

 

masayan
masayan

Docker環境でも、ローカルのマシン同様にchromedriver-binaryをインストールして、パスを通して・・・とすれば比較的簡単にSelenium環境を構築できます。

 

しかしながら、せっかくDockerを使用するので、Python用のコンテナとは別にSeleniumコンテナを用意して責務を分けたほうがスマートなので、今回はそちらの方法を紹介します。

個人的には、pytest等での単体テストもしやすくなるという点でも、seleniumコンテナを立てるやり方のほうがおすすめかと思います。

構築手順

masayan
masayan

pythonコンテナとseleniumコンテナを起動し、コンテナ間で通信することでseleniumを動かせるようにします。

コンテナ起動

任意のディレクトリで、以下を実行

git clone https://github.com/masayan1126/docker-python.git
cd docker-python

ビルド

docker-compose build

コンテナ起動

docker-composer up -d
  • Seleniumの方の公式イメージである、selenium/standalone-chromeを使用
  • Seleniumコンテナがメモリ不足で強制終了しないように、ホスト側のメモリ領域(/dev/shm)を共有する
Docker Hub

docker-compose.yml

version: '3'
services:
  selenium:
    image: selenium/standalone-chrome
    container_name: 'selenium'
    volumes:
      - /dev/shm:/dev/shm
  python3:
    restart: always
    build: .
    container_name: 'py3-container'
    working_dir: '/var/app'
    tty: true
    volumes:
      - ${SRC_PATH}:/var/app
    depends_on:
      - selenium
masayan
masayan

ホストOS側のSRC_PATHとコンテナをマウントしているので、実際のソースコードのパスをenvファイルを作成し、記載するようにしてください。

.env

SRC_PATH=your src path

Dockerfile

FROM python:3.9.4-slim
# linuxのパッケージインストールなど必要なものを。
# RUN apt update
# RUN apk --update add vim

ENV PYTHONPATH "${PYTHONPATH}:/var/app/"

RUN pip install --upgrade pip
WORKDIR /var/app

RUN pip install --upgrade pip && \
    pip install pipenv
masayan
masayan

Dockerfileです。ビルド時は、そこまでやることはないですが、強いて挙げるなら自作pythonスクリプトのpathを通しているくらいです

Pythonで自作モジュールをimportするための方法
本記事では、Pythonで自作モジュールをimportするための方法について紹介しています。結論としては、環境変数「PYTHONPATH」に、パスを通したい独自モジュール(スクリプト)のディレクトリパスを設定することでimportすることが可能になります。

動作確認

seleniumを使用する側のpythonスクリプトは以下のとおりです。

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities

driver = webdriver.Remote(
    command_executor="http://selenium:4444/wd/hub",
    desired_capabilities=DesiredCapabilities.CHROME.copy(),
)

driver.get("https://maasaablog.com/")
print(driver.title)
driver.quit()
masayan
masayan

使用方法は、通常のseleniumの書き方とほぼ同じですが、webdriver.Remote()の引数command_executorには、通信先のseleniumコンテナを指定する必要があります

プログラムを実行する

pythonコンテナに入る

docker-compose exec py3-container bash

コンテナ内で、プログラムを実行してseleniumコンテナと通信する

pipenv run python packages/hoge.py

// masayanblog | 現役のweb系エンジニアが役立つ情報をまったりご紹介

プログラムを実行して、本ブログのタイトルタグのテキストがコンソールに出力されていればOKです。

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/08/04 17:32時点)
タイトルとURLをコピーしました