生産性向上ブログ@miyajan

圧倒的生産性向上を目指すエンジニアのためのブログ

Selenium 3.0の変更点まとめ

『Using Selenium 3.0』というスライドが公開されていたので、Selenium 3.0へ移行するときに気をつけるべき変更点をまとめてみる。スライドは、WebDriverの生みの親のSimon Stewart氏によるもの。

www.slideshare.net

WebDriverユーザー

現在Deprecatedになっている一部クラスが削除されるとのこと。おそらく、↓のリストに書かれているクラス(と多分メソッドとかも)。

Deprecated List

多くはSelenium RCのインターフェースが削除されることによるもので、それ以外だとMarionetteDriverのような誰が使ってるのかわからないクラスもある。RCから移行しきれていないユーザーにとっては影響あると思われるけど、完全にWebDriverを使っているユーザーにはほぼ影響ないはず。

削除されたクラスを使ってない状態にしたら、3.0のjarを使えばいい。

Gridユーザー向け

特になにも修正せずに3.0のjarに移行できる様子。WebDriver APIは特に変更ないのだから、それはそのはず。

RCユーザー向け

RCのAPIが消えるから当たり前なんだけど、一番影響が大きい。移行手順を箇条書きでまとめる。

  • WebDriverBackedSeleniumを使う
    • コード上ではRCのinterfaceで、内部的にはWebDriverを使うクラス
  • テストを修正する
    • startメソッドの呼び出しが必要なくなる
    • 内部的に使っているWebDriverインスタンスを取り出すこともできるので一部だけWebDriverのinterfaceで記述することもできる
  • 3.0のjarへ移行する
  • leg-rcパッケージへの依存関係を追加する
    • WebDriverBackedSeleniumはleg-rcパッケージに含まれている
    • "leg-rc"と書いて"レガシー"と読むらしいw
    • これ

上記を行っても、RCの一部機能はサポートされなくなる。

  • Selenium Serverをproxy代わりには使えなくなる
  • リクエストヘッダのカスタマイズ
    • これも間にproxyとか挟んでどうにかしろとのこと
  • ブラウザ側のログ取得
    • WebDriverのログは取得できる

要は、Seleniumはブラウザを操作するためのツールであって、proxyとかがするべき役割は持たないということ。テストとしてはほしい機能ではあるけど、WebDriverの概念から考えるとブラウザ自体にその機能を持たせないといけなくなるので、諦めるしかないという感じ。

自分はRC使ってないから試す機会はなさそうだけど、RCユーザー大変そうだなぁ。。

IDEユーザー向け

こちらも影響ある様子。

自分はIDEも使わないからよくわかってないけど、selenium-html-runner.jarって前からあるものだっけ?使い方とかわかりそうなドキュメントを見つけられない。。

さらに、IDEの一部機能も失われる。

  • Rollups
    • 知らなかったけど、IDEの複数のコマンドを一つにまとめるモジュール機能のようなものっぽい
    • これは実装予定とのこと
  • JS拡張の読み込みの挙動
    • IDEのコマンド拡張の仕組み
    • これまでは最初に一回読み込まれるだけだったのが、今度はページが開かれるごとに読み込まれるので、挙動が変わる場合がある
  • alertとpromptの処理がおかしくなるかも
    • 詳細書かれてないのでよくわからない
  • Selenium Builderへの移行を検討して

こう書くと怒られるかもだけど、IDEも今後のメンテナンスは怪しい雰囲気になってきたという印象。Selenium Builder使ってる話もあまり聞かないけど、今後は移行していく流れになるのかな・・・?

その他

3.0に関係ないけど、スライドに出てきた中で気になる話題まとめ。

ブラウザベンダによるWebDriverサポート

Chrome、Edge、Firefox、Safariと一通りのメジャーブラウザは公式にベンダ側でWebDriverをサポートしてもらえるようになった。これによってブラウザの変更に追随されるし、Selenium本体とブラウザ関係の修正は切り離して考えられるようになったのがメリット。

とはいっても、現時点では大半のdriverがあまり安定していないという問題があると個人的には思っている。Firefoxは48からGeckoDriverでしか操作できなくなったけど、Actions APIにはまだ対応していない。SafariDriverも、この記事によるとスクリーンショットまわりが怪しい様子。Edgeもまだ安定しているという話は聞かないし、正直現時点ではChromeDriver一択なのではないかと思う。

タイムアウトの挙動

Implicit timeoutsはブラウザ側で待って、Explicit timeoutsはローカル側で待つとのこと。SeleniumチームとしてはImplicit timeoutsは可能な限り避けることを推奨している。

stackoverflow.com

理由が気になったので調べたけど、↑の回答が一番理由をうまくまとめていると思う。

  • 挙動がドキュメント化されておらず未定義
  • find elementしかwaitできない
  • タイムアウト後に要素が見つからなくてもエラーにならない
  • 要素がないことのチェックに時間がかかる
  • globalにしか設定できない

要約すると、↑のような理由。

XPathよりCSSセレクタ

XPathはブラウザの実装によるし可読性低いからCSSセレクタ推奨という話。このあたりは以前から広まってる話という認識。

まとめ

『Using Selenium 3.0』というスライドをベースに、Selenium 3.0の変更点とその他の気になった内容をまとめた。

肝心のSelenium 3.0リリース日については、"Soon"とだけ書かれていて詳細はわからず。2016年のSelenium Conferenceである、Selenium Conf UKでリリースされるのではと推測してるけど、ひょっとしたらクリスマスの可能性もあると思ってる。