SeleniumWebDriverを使ってつまらない作業を駆逐してやる!!というLTをした
会社のLT大会で発表した。
スクショ撮る作業つらすぎる!Selenium Web Driverって使い捨てのスクリプト的にも使えるんだよ!そんなクソみたいな作業自動化しようよ!
という内容。
このLTのために簡単なデモアプリケーションを作った。
これを使うと、↓なことができる。
少し分かりづらいけど、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を指定してるけど、:cssでcssセレクタを指定することもできる。(jQueryっぽい。)
その場合には配列でエレメントオブジェクトが返却される。
send_key以外にも、clearで入力値を消す、clickで押下する、などなどできる。(詳細はリファレンス見るのが良いです。)
スクリーンショットを撮る
このコードでは
driver.save_screenshot("screenshots/#{username}.png")
でやっている。
screenshots/username.pngにスクリーンショットを撮って保存する。見たままの動作をするので目に優しい。
スクリーンショットを撮るときは、必ずアクティブウィンドウになる。(firefox、chromeで確認。)
OSの操作をするから?なのか?よくわからないけどそういう仕組みっぽい。
まぁそれで困ることはほとんどない。
本当に困るのはスクリーンショットの挙動がブラウザによって異なること。
具体的にはfirefoxはちゃんとページ全体を撮れるけど、chromeは表示領域しか撮れない。
他にもブラウザごとに挙動は違うことは多分結構あると思う。
このあたりは遭遇する度になんとかしていくしかないかな。
ちなみに僕は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では使い捨てのスクリプトを気軽に書いて自動化もできるよ!みたいな趣旨だったので、そういう感覚も払拭できたらなーと思っていたんだけど、そこまでには至らなかったらしい。残念。