ぼくらの研究

ぼくらのための研究をしていきます。

[Rails]Amazon LinuxでSelenium WebDriver(Firefox)を動かす

   

環境

LinuxOS:Amazon Linux(Linux version 4.9.32-15.41.amzn1.x86_64)
Firefox:45.3.0 esr
Rails: 5.0.0.1
Ruby: ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]
selenium-webdriver (2.53.4)
headless (2.3.1)

手順

1.Firefoxのインストール

AmazonLinuxが入っているEC2サーバーにアクセスします。rootユーザーでログインしましょう。
まず最初にFirefoxを動かすための各種パッケージ(epll-release等)をインストールします。


#curl -X GET -o RPM-GPG-KEY-lambda-epll https://lambda-linux.io/RPM-GPG-KEY-lambda-epll  
#sudo rpm --import RPM-GPG-KEY-lambda-epll  
#curl -X GET -o epll-release-2016.09-1.2.ll1.noarch.rpm https://lambda-linux.io/epll-release-2016.09-1.2.ll1.noarch.rpm  
#sudo yum -y install epll-release-2016.09-1.2.ll1.noarch.rpm
#sudo yum --enablerepo=epll install firefox-compat

次に45.3.0esr版のFirefoxをダウンロードします。
※ちなみにここでは英語版を指定していますが日本語版でも問題はありません。

#wget -O firefox-esr.tar.bz2 "https://download.mozilla.org/?product=firefox-45.3.0esr-SSL&os=linux64&lang=en-US""

最後にダウンロードしてきたファイルを解凍し、usr/localディレクトリに移します。

#bzcat firefox-esr.tar.bz2 | tar xvf -
#mv firefox /usr/local/

これでAmazonLinux(EC2サーバー)へのFirefoxインストールは完了。

参考記事 AmazonLinux(EC2) + Selenium + Ruby でスクレイピング

2.selenium-webdriverのインストール


gem 'selenium-webdriver', '2.53.4'

でbundle install

3.headlessのインストール


gem 'headless', '2.3.1'

でbundle install

実装コード

所感

恐ろしくハマりました。4日間くらい格闘してた気がします。

結論から言うと、AmazonLinuxでSelenium WebDriverを動かすのは鬼門です。
開発環境(ローカル環境)では何もひっかかることなく動くSeleniumも本番環境(AmazonLinux)になるとハードルが急上昇。

というのもSelenium WebDriverが動くかどうかは結局の所、LinuxOSやブラウザ、仮想ディスプレイの相性(互換性があるかどうか)という1点にかかっており、さらに単一のエラーしか吐き出さないため、手当たり次第にいろんな組み合わせを試すという悲しい実験を繰り返すしかないからです。

「最新バージョンのFirefoxとseleniumじゃ動かないか……じゃあChromeは?……うわぁこれAmazonLinuxとChromeはまじ無理だぁ……はぁこれはドライバーはFirefoxにするしかないかぁいやでもどれが動くんだろこのバージョンはいけるの?あぁエラーか、いやでもこのエラーってブラウザが原因のエラーなの?geckodriverのバージョンがダメなの?仮想ディスプレイの方がダメなの?そもそもこのバージョンのSeleniumってこのAmazonLinuxとじゃダメなの?」

あちらを立てればこちらが立たず……例えるならLinuxOS、Firefox、Selenium、仮想ディスプレイという狂犬達を4頭同時に黙らせる奇跡の組み合わせを引き当てるような作業でした。
せめてどの犬が吠えているかが分かればいいのですが、返ってくるのは2,3通りのエラーだけで、どの犬の機嫌が悪いのかがほぼ分かりません。

通常のデバックの流れである「エラー内容を確認→原因を推定→修正→動作確認→解決」が全くできず、まさに暗中模索といった感じでした。

この記事が読者さんの参考になれば幸いです。つかれた