Play Frameworkでtestじゃない所からfluentleniumを使う

何言ってるか意味わかんねーかもしれないけど、そういうことをやったのでメモ。Play+scalaでやる。

これの何が難しいかというと、junitをtest/下以外から使うあたりで詰まる。playではjunit、selenium、fluentleniumのスコープをtestにしているらしく、普通はapp/下から参照できない。が、下記のようにdependencyにtestスコープなしで依存性を追加すると使えるようになる。それでもjunitはなぜか追加できなかったので諦めた。たぶん、要らないし。

build.sbt

dependencyに以下を追加。

 "org.seleniumhq.selenium" % "selenium-chrome-driver" % "2.45.0",
 "org.seleniumhq.selenium" % "selenium-firefox-driver" % "2.45.0",
 "org.seleniumhq.selenium" % "selenium-java" % "2.45.0",
 "org.fluentlenium" % "fluentlenium-core" % "0.10.3"

コード

val f = new FluentAdapter(new FirefoxDriver());
f.goTo("http://www.google.com")
f.fill("input[name=q]").`with`("Fluent")
f.submit("form")
Thread.sleep(800)
f.takeScreenShot()

Fluentlenium使ってるのは普段javascriptも良く書くのでこっちの方が使いやすいから。

ウェイト処理はThread.waitを使っているが、Fluent.waitは「モニターがおかしい」などと怒られたので使えなかった。また、withはScalaだと予約語なのでバッククォートで囲まないといけない。何かのIDEを使っていれば自動的にやってくれるだろう。

WebDriverがFirefoxなのは設定が楽だから。Chromeだとパスを指定しなければならないが、Firefoxだと指定しなくてもなぜか動作する。どういう仕組みになっているんだろう…。また、Chromeだと「通信がタイムアウトした」などとエラーが出た。謎。Selenium自体使い慣れているわけではないので、正直よくわからん。

ちなみに撮れたスクリーンショットは以下。

何でこんなことしてんの?

MoneyFowardというサービスがあります。こいつは各種銀行口座や証券口座のパスワード、乱数表などを記入しておき、システムが勝手に資産残高やその遷移をまとめ上げてくれるナイスなサービスです。

が、ここまで書いたとおりで誰しもが不安に思うのは「パスワードとか乱数表全部を預けるのはちょっと…」ということでしょう。私もその一人です。三菱UFJキャピタルの出資だからとか、SSL 256bitだから安心とか、データは暗号化してるから大丈夫だとか何とか書いていますが、クラッカーからの攻撃に対して堅牢であるという説明にはなってないと思います。

でもこのサービス自体は超魅力的で、私も使いたいなあ…とは常々思っていたところ。そいで、自分で作ればいいじゃん!なーんだ、解決解決。と相成った。ちなみにこのソフトの名前はMoneyBackwardと名付けるつもりである。MoneyFowardの劣化版だからだ。

しかし、どうやってダイレクトバンキングサービスにログインして情報を引っ張って来ればいいんだろう…。最近はブラウザが変わっただけで「本当に本人ですか?」とか聞いてくるしなあ。Jsoupとかのスクレイピングツールでやるにしても、クッキーをいちいち拾ったりなんだりかんだりと面倒だなあ…。と思っていたところ、そうだ、Seleniumでブラウザを直接操作したらいいじゃん!と思いついた。ほいで、収集したデータはPlay Frameworkで格好よく表示したらいいじゃん!なーんだ、完璧完璧。ということになってこういうことをやっておる。以上。