CentOS7にChromeをInstallしてSeleniumを使ったRailsのテストをする
2017-06-21 | カテゴリ >> Rails

この前、PhantomJSがティウンティウンティウンしたので開発してるテスト環境をSelenium + Chromeにチェンジしました。
そしたら、もう、クッソはまったです(*_*;

もう7時間以上はハマったんじゃないかな。
はまさき。

今回のゴール

まず、何をしたかったかというとCentOS内の開発環境でSeleniumを使ったテストを動かす事でした。
CentOSのバージョンは7(ちなみにWindowsの上にいるVagrantに乗っかってる。ワイの勤務先、たぶん一生業務PCはMacにならない。)

動作させるブラウザはChrome。
なお、Firefoxだったらすぐ動かせたのかもしれないけど、ワイの環境だけ動かないって理由だけでFFにしてくださいなんてとても言えない。(ちなみに他のPJメンバはMacで開発してる)

あと、ワイの開発拠点はProxy経由じゃないと外に出ていけないので、最後ちょっとだけそれでもハマった。

1 chromeのInstall

CentOS7にChromeを入れる手順みたいなのは、ネットに色々載ってはいるものの最終的に
https://chrome.richardlloyd.org.uk/
の記事を信じる事が一番の近道な気がします。

この後出てくるChromedriver-helperのREADMEにも

Apparently recent versions of chromedriver won’t run on CentOS 6 and 7

と、書かれています。

ので、 先のリンク先に貼られてる
https://chrome.richardlloyd.org.uk/install_chrome.sh
をWgetしてきて動かしました。

Chromedriverは個別にInstallしない

私が情弱なだけだと思うんですが、個別にChromedriverをInstallしてPATH通したり色々やっても全くダメでした。
ここが一番ハマりました。
chromedriverのプロセスは上げられるんだけど、どうやってもRailsのSelenium側からうまく呼び出せない
っていうか、
Selenium::WebDriver::Error::WebDriverError: unable to connect to chromedriver 127.0.0.1:9515
とか、
Errno::ECONNREFUSED: Failed to open TCP connection to 127.0.0.1:9515 (Connection refused – connect(2) for “127.0.0.1” port 9515)
とかのエラーがバンバン出てお手上げになったので、辞めてgemで配布されている
chromedriver-helper
を使う事にしたのでした。

そしたら、どうもこのgemはchromedrierが同梱されてる(?)のか知らないけど、自分でinstallしたdriverを捨てても動きました。 やった。

というわけで、とりあえずはChromeもChromedriverも解決した。
が、しかしコンピュータの事を何も分かってない私はまだまだハマる。

仮想GUI環境を入れる

Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally
と、怒られたんですが 最初マジで意味が分かってなかったです。

今回使ってるCentOSにはGUI環境がないのでChromeが起動できないという事だそうです。
(ヘッドレスモードで動かせばいけるのかも。 けど2017年5月では未だリリースされてないからダメだったのですが)

どうもXvfbていうディスプレイをシミュレートしてくれるアプリがあるとの事。
いやー 勉強になります。

参考) Vagrant の CentOS で Selenium テストを回したい
※こちら↑はfirefoxでテストしています

早速入れてみました。

$ sudo yum -y install xorg-x11-server-Xvfb

sudo vi ~/.bash_profile
export DISPLAY=:1

Xvfbの起動

Xvfb :1 -screen 0 1024x768x24 > /dev/null &

→ jobsコマンドで確認 → いるね → 青山テルマ「そばにいるね」

繋がらない問題

これは自分の勉強メモ。
殴り書きですみません。

無事、Chromeが起動してくれている様子なのにCapybaraが
Capybara::ElementNotFound: Unable to find field “hogehoge”
と言う。

どういう状態なのか知りた過ぎて調べたら、以下のコマンドで仮想GUI環境の画面のスクショをとれるとのこと。

import -display :1 -window root test.jpg

タイミングが悪いと真っ白なので、連射しまくった。
XXX1.jpg って、ナンバリングして頑張って連射した。

こんな一枚の写真が出てきた。

Chromeから繋がってなかったんかいw

凡ミス・・ 圧倒的、凡ミス!!

今回Vagrantの環境変数にhttp_proxyやhttps_proxyを設定しているのですが、
そのせいでlocalhostに繋げられてなかった、 というか
要は、no_proxy の環境変数を設定し忘れていた という事です。

というわけで
export no_proxy=127.0.0.1,localhost

※一時的にproxyを外してしまう方法も試したけど、外部css呼んでるページがあったので
Net::ReadTimeout: Net::ReadTimeout でダメだった。

ので、http_proxyもno_proxy も両方設定した。

findできない問題

↑さっきのスクショを見れば分かるんですが、Chromeが日本語を表示してくれてないようでして
Capybaraが指定した文字列が find できないよ って怒ります。

これも単純にOSのlocaleの設定をミスってる事でした。
実はこれも情弱すぎて、ややハマりました。
システムのロケールと、仮想GUI環境のロケールの言語って設定分かれてるっての知らなくて、コンソールのメッセージ群は日本語になったくせに、Chromeでスクショとるとずっと謎の四角文字(文字化け)が治らん っていう。

これの対処はまた長くなるので、別のエントリに書きます。
(追記:書きました)

てなわけで、いろいろやったら最終的にテスト動いてくれました。
動いてくれた時は感動して泣きました。

おわり( ´∀`)

 

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
2017-06-21 | カテゴリ >> Rails 

関連記事

Comment





Comment



*