日々常々

ふつうのプログラマがあたりまえにしたいこと。

Seleniumを軽く動かす

導入

Seleniumに触れる機会はなんだかんだで徐々に増えてきている気がする。少なくとも3年前よりはよほどいろんなところで聞くようになったし、使われるようにもなっているはず。で、なんとなくこのブログを検索してみたら、思った以上に何も書いていなくてびっくりしたからなんか書いてみる。

Seleniumさんを使うにあたっては、SeleniumIDEを使うのとコード書くのがあるけれど、基本的にはコードを書いていきたい。理由はいくつかあるけれど、一番は Record&Playback があまりよろしくないと思っているから。生成されるコードはどこまでいってもリニアスクリプトになるし、保守性も柔軟性も欠けると思う。もちろん「とりあえず動くもの」を作るには便利だけれど、それまでじゃないかなと。まぁ、コードを書くより趣味に合うアプローチが出て来れば喜んで乗り換える所存。

ともかく、Seleniumを使用する機会は増えているんだけど、昔よりも実装が簡単になっているわけではなさそう。知らないだけかもだけど、触り始めた頃と比べて革新的な何かがあったとかも聞いてないし。多少安定性は増してたりするんだろうけどもね。

本題

Seleniumさんには色々と悩ましいところはあるんだけれど、とにかく実行コストの高さは頂けない。操作のエミュレート(よりも一層下ではあるけれど、似たようなもの)である以上、ある程度は仕方ないんだけれど、自動化された定期実行時ならさておき、実装の試行錯誤段階や、学習段階でその煽りを喰うのは嬉しくないです。

Seleniumのコードが思った通りに動かないときにスタックトレースを眺めても、ある程度知っていても想像くらいしかできなかったりする。 で、そういう時にサーバーに乗っかってるアプリケーションを対象に真正面から取っ組み合いをしていると、すごく時間がかかる。これだと「コストに見合わない」と判断して断念しても仕方ないと思う。

対応

軽く試せる環境を用意するのがいい。こういうの。

Seleniumで何かしら詰まっているのを見ていると、一番ドハマりするのはタイミングに依存したイベント絡みなんだけれど、次点は単純に要素をどんな風に取ってくるかとかイベントをどうやって起こすかとか、単純な使い方の話だったりする。タイミング云々の話はアプリケーション本体やネットワークを挟まないと検知できなかったりするけれど、単純な操作については単純なHTMLで十分で、それならサーバーなんてなくても手元のHTMLで良いわけです。もちろんAjaxで云々とかいんたらくてぃぶななんとやらになってくると厳しいけれど。

Seleniumのようなものを「使ってみてー」と言う時には、実行環境、操作対象、そしてスクリプト本体の準備をどうするかは考えどころで、操作対象のページが触れる状況でないと試しづらいことも多い。もちろん file://... でやってもらってもいいんだけど、同じプロジェクト内にあるともっとやりやすい。ということで、resourcesにあるHTMLをMainクラスから操作する形にしてる。

Seleniumを動かすまでの準備がJavaFirefoxを入れるだけと極小なので、「そもそもSeleniumが動く環境になっているか」の切り分けにも使えたりもして、何気に便利だったりする。