SeleniumWebDriverを使ってつまらない作業を駆逐してやる!!というLTをした

会社のLT大会で発表した。

スクショ撮る作業つらすぎる!Selenium Web Driverって使い捨てのスクリプト的にも使えるんだよ!そんなクソみたいな作業自動化しようよ!

という内容。

このLTのために簡単なデモアプリケーションを作った。

これを使うと、↓なことができる。

f:id:joe-re:20150117152734g:plain

少し分かりづらいけど、shot.rbを実行するとfirefoxが起動が起動して4人のユーザでログインして、それぞれスクリーンショットを撮ってsnapshotsディレクトリに格納する。

スクリーンショットを撮るコード

selenium-webdriverを使って、4人のユーザでそれぞれログインしてスナップショットを撮 ...

資料

ざっくりした例は↓を見るとわかりやすい。

RubyBindings - selenium - Ruby bindings - Browser automation framework - Google Project Hosting

もっと詳細が知りたければリファレンスが良い。

http://selenium.googlecode.com/svn/trunk/docs/api/rb/frames.html

解説

エレメントの操作

このコードの

driver.find_element(:id, 'user_email').send_keys(user[:email])

みたいなところは、id属性が'user_email'のエレメントに、user[:email]の値を入力する、みたいな意味。

ここでは:idを指定してるけど、:csscssセレクタを指定することもできる。(jQueryっぽい。)

その場合には配列でエレメントオブジェクトが返却される。

:xpath指定でXPathも使える。

send_key以外にも、clearで入力値を消す、clickで押下する、などなどできる。(詳細はリファレンス見るのが良いです。)

スクリーンショットを撮る

このコードでは

driver.save_screenshot("screenshots/#{username}.png")

でやっている。

screenshots/username.pngスクリーンショットを撮って保存する。見たままの動作をするので目に優しい。

スクリーンショットを撮るときは、必ずアクティブウィンドウになる。(firefoxchromeで確認。)

OSの操作をするから?なのか?よくわからないけどそういう仕組みっぽい。

まぁそれで困ることはほとんどない。

本当に困るのはスクリーンショットの挙動がブラウザによって異なること。

具体的にはfirefoxはちゃんとページ全体を撮れるけど、chromeは表示領域しか撮れない。

Issue 294 - chromedriver - ChromeDriver2 take screenshot is not full page - WebDriver for Google Chrome - Google Project Hosting

他にもブラウザごとに挙動は違うことは多分結構あると思う。

このあたりは遭遇する度になんとかしていくしかないかな。

ちなみに僕はchromeの場合は、

driver.find_element(:id, 'some-contents').location_once_scrolled_into_view

みたいにして、スクロールしてもう一枚撮ることで対応していた。

location_once_scrolled_into_viewメソッドは、自分自身(エレメントオブジェクト)が画面内に表示されるように画面スクロールをしてくれる。

ピクセル指定するとかそういう面倒なことしなくていいので便利。

LTやってよかったこと

明日からやってみます!みたいなポジティブなメッセージを貰えた
Seleniumバリバリな人も中にはいるらしいことが分かった(そういう人には物足りない内容だったかも?)

残念だったこと

デモをプロジェクターに写せなかった。

マシントラブルで自分のPCからプロジェクターに写せなかった。

仕方ないのでスライドだけ別PCで写して、デモは自分のPCを前に置いて見える人だけ見てって感じでやった。

明らかな準備不足だった。悲しい。次はちゃんとやりたい。

でもSeleniumのテスト書くのもめんどいよ、みたいなメッセージもあった

確かにSelenium環境組んででがっつりやっていると、メンテが大変、みたいな話は聞いていて、多分そういう経験をした人なんだと思う。

このLTでは使い捨てのスクリプトを気軽に書いて自動化もできるよ!みたいな趣旨だったので、そういう感覚も払拭できたらなーと思っていたんだけど、そこまでには至らなかったらしい。残念。