はじめに
これはGeb Advent Calendar 2016の13日目の記事です。
前日は@setoazusaさんのGebでインフラをテストする。でした。いやはや昨日はいぶし銀なエントリーでしたね。
今日はGebのパフォーマンスがらみのお話です。
tl;dr
textやtitleでエレメント取得すると、古いバージョンでは書き方次第で速度劣化を引き起こす可能性があったが、バージョン1.0以降を使っていれば基本的には問題ない。
Gebでtext, titleでエレメント取得すると遅い?
メーリングリストなどで時々話題に出る内容です。バージョンによって答えが変わってくるので注意が必要です。
text, titleでの取得は遅いの?
バージョン1.0までは遅かったです。この件については中の人がメーリスでコメントしています。意訳しますと
textで取得するときは、可能な限りCSSセレクタでエレメントを限定的に指定してください。
なぜかというと、textでの取得はCSSでサポートされてないからです。
Gebでそれをするときに何が起きるかというと、そのセレクタにマッチするエレメントを全て取得してきて、
それらをイテレートしてテキストをチェックします。
テキストでのエレメント取得はワイヤプロトコルの呼び出しです。
それはつまり、イテレートする要素が増えれば増えるほど、ワイヤの呼び出しも増えるということです。
一般に、テキストでの取得は便利ですが遅くなります。
そのため、可能であれば避けてください。
というわけで、バージョン1.0が出る前は実際に遅くなる状態でした。というわけで、『Selenium実践入門』にはその旨が注釈で記載されていたりします。
遅かった時代の解決策
というわけで、textやtitleでエレメントを取得する際は、可能な限りCSSセレクタに寄せて書けと案内されていました。例えばこんな感じ
$("div", title: "foo") // NG:遅くなる書き方
$("div[title='foo']") // OK:なるべくCSSセレクタに寄せる
バージョン0.11.0での改善
バージョン1.0で、上記のNGの書き方をしても、可能な限りCSSセレクタに寄せるようにコンパイルする、という修正が入りました(参考)。そのため、上記で実質的なパフォーマンスの違いは出なくなりました。
バージョン1.0で安定
バージョン0.11.0では、上記の修正に伴うバグが出ていたのですが、それもバージョン0.12.1で修正されています。それらはバージョンの1.0に引き継がれているので、バージョン1.0を利用していけば問題なく利用できると思います。
まとめ
Gebのバージョン1.0使いましょう。