先日、Seleniumでブラウザ操作を自動化する という記事を書きました。
意外とすんなり導入できて満足していたのですが、たまに(処理によって)エラーが出ることがあることに気が付きました。
UnicodeDecodeError: 'cp932' codec can't decode character
どうも、Windows 固有の問題の模様。 ※CP932 ≒ SJIS。
解決方法としては、I/O で文字コードを(UTF-8 などに)合わせたり、open 時に無効な文字を削除(replace)したりで対応可能なようです。
とは言え、既存のソース(でエラーになったもの)を改修して&リランをするのも現実的ではありません。
ということで、ちょうど先日 Windows に設定したネイティブ Linux(WSL2)を使って、Selenium 環境を構築したいと思います。
作業内容としては、先日書いた下記記事の WSL2 移植版です。
目次
環境
構築する環境は以下になります。
- Windows 10 20H2
- WSL2
- Ubuntu 20.04 LTS
- 言語
Python3 - ライブラリ
Selenium 4 - ブラウザ
Google Chrome - WebDriver
ChromeDriver
- 言語
- Ubuntu 20.04 LTS
- WSL2
Ubuntu の導入までは、先日の記事 Windows10のWSL2を使う – あららぼ で済んでいる前提です。
準備
必要に応じてパッケージを最新にしておきます。
$ sudo apt update -y && sudo apt dist-upgrade -y
Python3 導入
WSL2 の Ubuntu 20.04 LTS には、既に入っていました。
なお、今回 pip3
は導入していません。
$ python3 -V
Python 3.8.5
Selenium 導入
公式リポジトリにも色々上がっています。
$ apt-cache search selenium
firefox-geckodriver - Safe and easy web browser from Mozilla - geckodriver
libtest-www-selenium-perl - Perl test framework using Selenium Remote Control
libweasel-perl - PHP's Mink inspired multi-protocol web-testing library for Perl
python3-selenium - Python3 bindings for Selenium
qunit-selenium - Run QUnit tests through Selenium WebDriver
ruby-childprocess - Ruby library for controlling external programs running in the background
ruby-chromedriver-helper - Easy installation and use of chromedriver
ruby-selenium-webdriver - Browser automation framework and ecosystem
firefoxdriver - Firefox WebDriver support
- インストール
先に導入確認した Python3 用のライブラリをインストールします。$ sudo apt install python3-selenium -y Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: chromium-browser chromium-chromedriver The following NEW packages will be installed: chromium-browser chromium-chromedriver python3-selenium 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 137 kB of archives. After this operation, 829 kB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 chromium-browser amd64 1:85.0.4183.83-0ubuntu0.20.04.2 [48.3 kB] Get:2 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 chromium-chromedriver amd64 1:85.0.4183.83-0ubuntu0.20.04.2 [2496 B] Get:3 http://archive.ubuntu.com/ubuntu focal/universe amd64 python3-selenium all 4.0.0~a1+dfsg1-1.1 [86.2 kB] Fetched 137 kB in 2s (76.1 kB/s) Preconfiguring packages ... Selecting previously unselected package chromium-browser. (Reading database ... 47517 files and directories currently installed.) Preparing to unpack .../chromium-browser_1%3a85.0.4183.83-0ubuntu0.20.04.2_amd64.deb ... => Installing the chromium snap ==> Checking connectivity with the snap store ===> System doesn't have a working snapd, skipping Unpacking chromium-browser (1:85.0.4183.83-0ubuntu0.20.04.2) ... Selecting previously unselected package chromium-chromedriver. Preparing to unpack .../chromium-chromedriver_1%3a85.0.4183.83-0ubuntu0.20.04.2_amd64.deb ... Unpacking chromium-chromedriver (1:85.0.4183.83-0ubuntu0.20.04.2) ... Selecting previously unselected package python3-selenium. Preparing to unpack .../python3-selenium_4.0.0~a1+dfsg1-1.1_all.deb ... Unpacking python3-selenium (4.0.0~a1+dfsg1-1.1) ... Setting up python3-selenium (4.0.0~a1+dfsg1-1.1) ... Setting up chromium-browser (1:85.0.4183.83-0ubuntu0.20.04.2) ... Setting up chromium-chromedriver (1:85.0.4183.83-0ubuntu0.20.04.2) ... Processing triggers for hicolor-icon-theme (0.17-2) ... Processing triggers for mime-support (3.64ubuntu1) ...
Google Chrome
Chrome パッケージをダウンロードしてインストールします。
-
ダウンロード
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb --2021-04-24 11:44:03-- https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb Resolving dl.google.com (dl.google.com)... 216.58.197.238, 2404:6800:4004:806::200e Connecting to dl.google.com (dl.google.com)|216.58.197.238|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 83333276 (79M) [application/x-debian-package] Saving to: ‘google-chrome-stable_current_amd64.deb’ google-chrome-stable_current_amd64.deb 100%[============================================================================>] 79.47M 10.5MB/s in 7.3s 2021-04-24 11:44:11 (10.8 MB/s) - ‘google-chrome-stable_current_amd64.deb’ saved [83333276/83333276]
-
インストール
$ sudo dpkg -i google-chrome-stable_current_amd64.deb [sudo] password for exts: Selecting previously unselected package google-chrome-stable. (Reading database ... 32202 files and directories currently installed.) Preparing to unpack google-chrome-stable_current_amd64.deb ... Unpacking google-chrome-stable (90.0.4430.85-1) ... dpkg: dependency problems prevent configuration of google-chrome-stable: google-chrome-stable depends on fonts-liberation; however: Package fonts-liberation is not installed. google-chrome-stable depends on libatk-bridge2.0-0 (>= 2.5.3); however: Package libatk-bridge2.0-0 is not installed. google-chrome-stable depends on libatk1.0-0 (>= 2.2.0); however: Package libatk1.0-0 is not installed. google-chrome-stable depends on libatspi2.0-0 (>= 2.9.90); however: Package libatspi2.0-0 is not installed. google-chrome-stable depends on libcairo2 (>= 1.6.0); however: Package libcairo2 is not installed. google-chrome-stable depends on libcups2 (>= 1.4.0); however: Package libcups2 is not installed. google-chrome-stable depends on libgbm1 (>= 8.1~0); however: Package libgbm1 is not installed. google-chrome-stable depends on libgtk-3-0 (>= 3.9.10); however: Package libgtk-3-0 is not installed. google-chrome-stable depends on libnspr4 (>= 2:4.9-2~); however: Package libnspr4 is not installed. google-chrome-stable depends on libnss3 (>= 2:3.22); however: Package libnss3 is not installed. google-chrome-stable depends on libpango-1.0-0 (>= 1.14.0); however: Package libpango-1.0-0 is not installed. google-chrome-stable depends on libxkbcommon0 (>= 0.4.1); however: Package libxkbcommon0 is not installed. google-chrome-stable depends on xdg-utils (>= 1.0.2); however: Package xdg-utils is not installed. dpkg: error processing package google-chrome-stable (--install): dependency problems - leaving unconfigured Processing triggers for mime-support (3.64ubuntu1) ... Processing triggers for man-db (2.9.1-1) ... Errors were encountered while processing: google-chrome-stable
上記のようにエラーになる場合は(パッケージの依存関係が解決できていないので)
apt -f
で強制的に依存関係を解消します。$ sudo apt -f install -y
-
確認
$ which google-chrome /usr/bin/google-chrome
Google Chrome バージョン
90.0.4430.85
が導入されました。$ google-chrome --version Google Chrome 90.0.4430.85
ChromeDriver 導入
WebDriver として、chromedriver
を導入しますが、ChromeDriver バージョンが Chrome バージョンを上回ると不具合があるので 要チェック です。
- バージョンの整合性
Chrome ブラウザ
バージョン >=ChromeDriver
バージョン であること。
base on Downloads - ChromeDriver - WebDriver for Chrome
https://chromedriver.storage.googleapis.com/index.html?path=90.0.4430.24/
https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip
今回、ChromeDriver 91.0.4472.19
があったのですが(Google Chrome のバージョンが 90.0.4430.85
のため)、一つ前のバージョン ChromeDriver 90.0.4430.24
をダウンロードしています。
- ダウンロード
$ wget https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip
- unzip 導入
ダウンロードしたファイルが zip 形式なので、解凍用に unzip パッケージを導入します。$ sudo apt install unzip -y
-
解凍
$ unzip chromedriver_linux64.zip Archive: chromedriver_linux64.zip inflating: chromedriver
ちなみに、先だって導入した Selenium で
chromedriver
がインストール済みのようですが、そのままでは使えないようです。$ /usr/bin/chromedriver -v Command '/usr/bin/chromedriver' requires the chromium snap to be installed. Please install it with: snap install chromium
なので、ダウンロードファイルで置換しておきます。
$ sudo mv chromedriver /usr/bin/chromedriver $ /usr/bin/chromedriver -v ChromeDriver 90.0.4430.24 (4c6d850f087da467d926e8eddb76550aed655991-refs/branch-heads/4430@{#429})
導入後、テスト
テスト用コードは下記から拝借させて頂きました。
-
ソース
$ cat test.py from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=options) driver.get('https://www.google.com/') print(driver.title) search_box = driver.find_element_by_name("q") search_box.send_keys('ChromeDriver') search_box.submit() print(driver.title) driver.save_screenshot('search_results.png') driver.quit()
-
実行
$ python3 test.py Google ChromeDriver - Google 検索
-
確認
$ ls -lh | grep .png -rw-r--r-- 1 exts exts 90K Apr 24 14:49 search_results.png