1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Chrome for Testingを使ったSelenium on Dockerの環境構築

Posted at

背景

PythonとSeleniumでChromeブラウザを操作する実行環境をDockerで作成する場合、コンテナ内にPython、Chrome、ChromeDriverをそれぞれインストールするのが一般的かと思います。
とはいえお試しで使ってみたい、簡単なWebスクレイピングだけやりたいといった場合は1つのコンテナで済むような簡単な構成にしたいところです、また、ChromeとChromeDriverの互換性問題についても面倒なので気にせず構築できると嬉しいです。

本記事の目的

以上を踏まえて環境構築が簡単でなるべく軽量なDockerコンテナを作成してみました。
定型作業の自動化やWebスクレイピングの範囲であれば、この構成で事足りるかと思います。

Dockerfileによる環境構築

ブラウザやライブラリのバージョンは以下の通りです。

バージョン
Python 3.12
Selenium(Pythonライブラリ) 4.25
Chrome for Testing(ブラウザ+WebDriver) 130.0.6723.91

以下はDockerfileの中身です。

# Chrome for TestingのDL&展開用にubuntuのイメージを使う
FROM ubuntu:22.04 AS downloader

RUN apt-get update && apt-get install -y curl unzip

RUN curl -O https://storage.googleapis.com/chrome-for-testing-public/130.0.6723.91/linux64/chrome-linux64.zip && \
    unzip chrome-linux64.zip

# Python実行用
FROM python:3.12-slim

# 前のイメージで展開した資材をコピー
COPY --from=downloader /chrome-linux64 /chrome-linux64

# Pythonライブラリのインストールしてキャッシュ削除
RUN pip install --upgrade pip && \
    pip install selenium==4.25.0 && \
    pip cache purge

# ブラウザを動かすためのパッケージをインストール
RUN apt-get update && \
    apt-get install -y libasound2 libgtk-3.0 libgbm1 libnss3 && \
    apt-get clean

動作確認用のサンプルコードです。作成したコンテナ上で実行してみてください。

from selenium import webdriver
from tempfile import mkdtemp
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()

options.binary_location = '/chrome-linux64/chrome'
options.add_argument("--headless=new")
options.add_argument('--no-sandbox')
options.add_argument("--disable-gpu")
options.add_argument("--single-process")
options.add_argument("--disable-audio-output")

chrome = webdriver.Chrome(options=options)
chrome.get(<アクセス先URL>)

res = chrome.find_element(by=By.XPATH, value="//html").text

print(res)

解説

ポイントはChromeのテスト用ブラウザであるChrome for Testingを使う点で、ChromeとChromeDriverが一体となっているのでバージョン互換性を気にする必要がなくなります。
Chrome for Testingについてはこちらの記事で分かりやすくまとめられています。
Chrome for Testing で自動テストを手元で簡単に動かせるようにした-Qiita

バイナリのダウンロード先はChrome for Testing availabilityで確認できます。古いバージョンのリンクはour JSON API endpointsに書いてあります。

つまずきポイント

依存パッケージ

今回ベースとしたPythonイメージにはChrome for Testingの依存パッケージが入っておらず、そのままChrome for Testingを実行するとライブラリ不足でエラーが発生します。なので不足しているパッケージを入れてあげればいいのですが、依存パッケージリストのような情報が公式は見つけられず、以下のサイトを参考に解決しました。
Puppeteerがnodeコンテナで動かなかったから動かした-White Box技術部
Pupperteer(Chromeブラウザを操作するNode.jsライブラリ)が必要というわけではなく、エラー内容がほぼ同じだったので紹介されている解決策を試したところ解決してしまった、という結果です。。。
依存関係を解決するためchromeを入れる方法もあるようですが、とりあえずサンプルコードは動いたので今回はこれで良しとしています。

まとめ

以上、Chrome for Testingを使ったSelenium実行環境の構築についてでした。テスト用のブラウザなので機能は最低限ですが、簡単なWebスクレイピングをやりたいときには十分かなと思います。

参考文献

  1. Chrome for Testing: reliable downloads for browser automation-Chrome for Developers
  2. Chrome for Testing で自動テストを手元で簡単に動かせるようにした-Qiita
  3. Chrome for Testing availability
  4. our JSON API endpoints-Github
  5. Puppeteerがnodeコンテナで動かなかったから動かした-White Box技術部
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?