Seleniumのインストール(python:3-slimベース)

ChromiumとWebDriverをインストールする

インストールするChromiumとChromeDriverのバージョンは極力近いものをインストールする必要がある。
ChromeDriverのインストールはPythonのchromedriver-binaryモジュールを使う。

1
2
3
4
5
RUN apt-get update -y && \
apt-get install -y --no-install-recommends chromium && \
pip install --upgrade pip setuptools wheel && \
# webdriverはなるべく近いバージョンをダウンロード
pip install chromedriver-binary~=$(chromium --version | perl -pe 's/([^0-9]+)([0-9]+\.[0-9]+).+/$2/g')

Chromeのインストールパスの問題

Chromeのインストールパスはwebdriver.Chrome()で指定する必要がある。
指定していない、下記のコードではエラーとなる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver

def test_access(driver):
driver.get('https://www.google.com')
driver.save_screenshot('test.png')
print(driver.title)
driver.quit()

if __name__ == '__main__':
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)
test_access(driver)

実行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$python sample_test.py
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 72, in start
self.process = subprocess.Popen(cmd, env=self.env,
File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "sample_test.py", line 13, in <module>
driver = webdriver.Chrome(options=options)
File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
self.service.start()
File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 81, in start
raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

chromedriver_binaryでインストールしている場合、import chromedriver_binaryを追加すれば、でChromiumのインストールパスが解決される。

日本語フォントの問題

実行結果の画面キャプチャは文字化けしている

Selenium width=640

localeの設定と日本語フォントのインストールすれば文字化けは解消する

1
2
3
4
5
6
7
ENV LANGUAGE ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
RUN apt-get install -y --no-install-recommends locales && \
locale-gen ja_JP.UTF-8 && \
# 日本語フォントをインストール
apt-get install -y --no-install-recommends fonts-ipafont && \
echo "*** INSTALLED: ja_JP locale & font ***"

Selenium Container(python:3-slimベース)のコンテナイメージ例

Dockerfile

python:3-slimベースのSelenium/Chromium環境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM python:3-slim
# Chrome & Webdriver
RUN apt-get update -y && \
apt-get install -y --no-install-recommends chromium && \
pip install --upgrade pip setuptools wheel && \
pip install selenium && \
# webdriverはなるべく近いバージョンをダウンロード
pip install chromedriver-binary~=$(chromium --version | perl -pe 's/([^0-9]+)([0-9]+\.[0-9]+).+/$2/g')

# 日本語環境
ENV LANGUAGE ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
RUN apt-get install -y --no-install-recommends locales && \
locale-gen ja_JP.UTF-8 && \
# 日本語フォントをインストール
apt-get install -y --no-install-recommends fonts-ipafont

テストコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from selenium import webdriver
import chromedriver_binary

def test_access(driver):
driver.get('https://www.google.com')
driver.save_screenshot('test.png')
print(driver.title)
driver.quit()

if __name__ == '__main__':
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1224,844")
driver = webdriver.Chrome(options=options)
test_access(driver)

実行結果

1
2
3
4
PS > docker-compose run selenium-dispshell bash
root@8dc58c2f02c2:/# cd /app
root@8dc58c2f02c2:/app# python sample_test.py
Google

Selenium width=640