1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GebAdvent Calendar 2016

Day 13

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

Posted at

はじめに

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?