Posted at
GebDay 13

Gebでtextやtitleでのエレメント取得は遅くなる!?

More than 1 year has passed since last update.


はじめに

これは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使いましょう。