お金をかけずにサーバーの勉強をしよう

Seleniumの WebDriver周りの話

2022年8月3日

メニューへ戻る
※当件は Firefoxのアップデートにより 2023年4月に解消しています。

Seleniumの環境を作る過程で、どうしても?となってしまう点がありましたので、それについて調べたことを書きます。

先に書いた「Seleniumインストール」では、

・Ubuntu Desktop 22.04
・Python 3.10.4
・(snap版)Firefox 103.0.1

このような組み合わせでやっています。

環境としてはこうなんですが、Pythonスクリプトから Firefoxが自動実行されるまでの過程をもう少しブレイクダウンすると、登場する要素がもう少しあります。
上記に加えて、

・私達が作る Pythonスクリプト自体
・Seleniumライブラリ
・GeckoDriver

が増えます。

図にするとこんなイメージになっています。 WebDriverの図 1

で、SeleniumのドキュメントのWebDriverで扱っているのがこの範囲。
各開発言語のライブラリを「Seleniumライブラリ」とし、各WEBブラウザ用の自動実行用プログラム(ここでは Firefoxの Gecko Driver)を「ブラウザードライバ」としているようです。
WebDriverの図 2

しかし「Seleniumライブラリ」「ブラウザードライバ」を提供しているのは別団体で、こんな感じ。
WebDriverの図 3

ドキュメントのクイックリファレンスにブラウザードライバへのリンクがありますが、Selenumではなく各 WEBブラウザ開発元へのリンクになっています。

正直ちょっと Seleniumのドキュメントが分かり辛いのですが、これは Seleniumの歴史がこうさせているのだと思います。

現在では各WEBブラウザ側にブラウザードライバのプログラムが用意されていますが、これは元々 Seleniumが作っていたのをインターネット標準にしたものです。

WEBブラウザ側が自動テストのためのインターフェイス策定の過程で、Seleniumに寄っていった感じだったと記憶しています。

実際 Seleniumの以前のバージョンの頃は、ブラウザードライバにあたるプログラムを Seleniumのサイトで配布していました。

機能の切り分けとこの歴史が分かると、時々ある?な表現が何となく理解できるというものです。


今回 Ubuntu 22.04と Firefoxを使うにあたって、これまた混乱する要素が一つありました。

Seleniumのサイトでは、geckodriver というプログラムファイルのダウンロード先リンクが記されています。
そこでは Selenium利用者に対して geckodriverを PATH環境変数が通っているディレクトリに配置するよう指示しています。

しかし Ubuntu 22.04の snap版 Firefoxには geckodriverが同梱されているのでした。

subro@Ubuntu2204:~$ snap info firefox
name:      firefox
summary:   Mozilla Firefox web browser
publisher: Mozilla✓
store-url: https://snapcraft.io/firefox
contact:   https://support.mozilla.org/kb/file-bug-report-or-feature-request-mozilla
license:   unset
description: |
  Firefox is a powerful, extensible web browser with support for modern web application
  technologies.
commands:
  - firefox
  - firefox.geckodriver
snap-id:      3wdHCAVyZEmYsCMFDE9qt92UV8rC8Wdk
tracking:     latest/stable/ubuntu-22.04
refresh-date: yesterday at 19:31 JST
channels:
  latest/stable:    103.0.1-1    2022-08-01 (1635) 171MB -
  latest/candidate: 103.0.1-1    2022-07-30 (1635) 171MB -
  latest/beta:      104.0b5-1    2022-08-03 (1646) 172MB -
  latest/edge:      105.0a1      2022-08-03 (1647) 182MB -
  esr/stable:       91.12.0esr-1 2022-07-26 (1588) 161MB -
  esr/candidate:    102.1.0esr-1 2022-07-26 (1608) 169MB -
  esr/beta:         ↑
  esr/edge:         102.1.0esr-1 2022-07-26 (1592) 169MB -
installed:          103.0.1-1               (1635) 171MB -

[/snap/bin]ディレクトリの下にもちゃんと入ってます。
[geckodriver]シンボリックリンクで [firefox.geckodriver] が使われるようになっています。
※[geckodriver] の本体は更に別な所にあります。

subro@Ubuntu2204:~$ ls -l /snap/bin
total 0
lrwxrwxrwx 1 root root 13  8月  2 19:31 firefox -> /usr/bin/snap
lrwxrwxrwx 1 root root 13  8月  2 19:31 firefox.geckodriver -> /usr/bin/snap
lrwxrwxrwx 1 root root 19  8月  2 19:31 geckodriver -> firefox.geckodriver

最初は「おぉ、snapの Firefoxパッケージは分かっとるな!愛い奴。」とか無邪気に思っていたのですが、どうやら snapパッケージに特有の「[/tmp]ディレクトリ直下にはファイルを書かせない」というお作法のために [geckodriver] が正しく動作できない問題があったようなのです。

その問題と回避策については正に geckodriver のページの説明文の一番前に「Known problems」として書いてあるのです。

多分ですが、snap版 Firefox同梱の [geckodriver] は「(上記)問題回避のための特別設定版」的なものなのではないかと思います。

そう考えると、Ubuntu 22.04だけ、というか snap版 Firefoxだけは、自分で [geckodriver] を用意しなくて良い(自分で用意すると動かない)、という結果になるのだと理解できます。

実際 RedHat系の RockyLinuxにも Firefoxをインストールしてみた所、Firefoxのバージョンがちょっと古いということはありはしますが、[geckodriver] は Firefoxの rpmパッケージには入って無かったようで、自分で mozillaの [geckodriver] を仕込まないと Seleniumが動かなかったです。


こんなところにも snapの問題が出てきてしまって、もう Debianに変えようかな…なんて思ってしまうのでした。

Canonicalは本当に snapを推進していくのでしょうか。