WSL2でSeleniumを使う

先日、Seleniumでブラウザ操作を自動化する という記事を書きました。

意外とすんなり導入できて満足していたのですが、たまに(処理によって)エラーが出ることがあることに気が付きました。

UnicodeDecodeError: 'cp932' codec can't decode character

どうも、Windows 固有の問題の模様。 ※CP932 ≒ SJIS。

解決方法としては、I/O で文字コードを(UTF-8 などに)合わせたり、open 時に無効な文字を削除(replace)したりで対応可能なようです。

とは言え、既存のソース(でエラーになったもの)を改修して&リランをするのも現実的ではありません。

ということで、ちょうど先日 Windows に設定したネイティブ Linux(WSL2)を使って、Selenium 環境を構築したいと思います。

Windows10のWSL2を使う – あららぼ

作業内容としては、先日書いた下記記事の WSL2 移植版です。

Seleniumでブラウザ操作を自動化する – あららぼ

目次

環境

構築する環境は以下になります。

  • Windows 10 20H2
    • WSL2
      • Ubuntu 20.04 LTS
        • 言語
          Python3
        • ライブラリ
          Selenium 4
        • ブラウザ
          Google Chrome
        • WebDriver
          ChromeDriver

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})

導入後、テスト

テスト用コードは下記から拝借させて頂きました。

base on Python + Selenium で Chrome の自動操作を一通り - Qiita

  • ソース

    $ 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