この記事は、Selenium Advent Calendar 2013の1日目の記事です。
Selenium の locator
Selenium を使って、ブラウザの操作を自動化するときに、どのリンクをクリックするか、どのフォームに値を入力するかを指定する必要があります。
画面上のどの要素を操作するかを指定するための情報をSeleniumではlocatorといいます。Seleniumでは、ブラウザ(厳密にいうとSelenium Server)とクライアント間の仕様としてJSON Wire Protocolが定められており、利用できるlocatorもそれに従います。
要素を探索する場合 /session/:sessionId/element に、locatorを含むJSONをPOSTするのですが、その locator として、class name、css selector、id、name、link text、partial link text、tag_name、xpath と様々なものが利用できます。
様々なものが利用できるのですが、逆にいろいろな書き方ができてしまうため、共有された方針がないと、コードの統一性や可読性が損なわれてしまいます。
また、デザインの変更に弱いような書き方をしてしまった場合、コードのメンテナンスが非常に大変になります。
locator の方針
そこで、コードの可読性・デザインの変更への耐性を踏まえて、以下の方針を定めています。
- input の入力の際には、nameを利用する
- input の入力以外(リンク、画像、ボタン)の指定は以下の優先順位で利用する
- css selector
- xpath
- partial link text (link text)
input の入力では name 属性を利用
input の入力だけは特別に name 属性でマッチさせます。
<label for="password_input" />パスワード</label>
<input id="password_input" class="hoge" type="password" name="pass" />
例えば、上記のような input があった場合、例えば以下のような指定が可能です。
- id で指定
- class で指定
- css selector や xpath で type が password の input を指定
- 「パスワード」という文言でlabelを検索し、そこに紐づくinputを取得する
- name で指定
この様々な方法の中でnameを利用するのが最もよいのは、画面の変更に最も強いのが name 要素だからです。
一般に、上記のようなinputを含むformがある場合、サーバーにはpass=xxx
といったようにname属性をkeyとして、multipartリクエストが送信されます。
したがって、name属性はformの送り先であるエンドポイントのインターフェースとなり、ここの変更(追加・削除は容易にありえますが)はあまりないはずなので、これを利用することで変更に強いコードとなります。
input 以外では css selector を利用
input 以外では、css selector を優先的に利用します。要素のidやclassを利用して指定する場合でも、あえて "#hoge" や ".fuga" のように、css selector 形式として記述を統一します。
idセレクタやクラスセレクタといった単純なセレクタだけではなく、子孫セレクタ・隣接セレクタ・属性セレクタといったものを使いこなせるとよいです。これらをついついXPathで書いてしまうと、可読性が落ちてしまうことが多いので注意が必要です。
最後にそれぞれの利用例を紹介しておきます。XPathに比べて容易にどういったものか理解できるかと思います。
子孫セレクタ
例:section#hoge 以下の li を指定する
#hoge li
id('hoge')//li
隣接セレクタ
例:h1 の直後にある p を指定する
h1 + p
//h1/following-sibling::p
属性セレクタ
例: type が reset の input を指定する
input[type='reset']
//input[@type='reset']
まとめ
Selenium でブラウザ操作の自動化をするときに、要素の指定に様々な指定方法があり、可読性の低い指定の仕方をしてしまったり、変更に弱い指定の仕方をしてしまったりすることが多いです。
今回紹介した方針は銀の弾丸ではないですが、継続してメンテナンスをしていく上で有効となると思います。
楽しい Selenium ライフを。
明日は、@ito_nozomiさんです。
また、Selenium Advent Calendar 2013はまだまだ募集中ですので、ぜひとも参加をよろしくおねがいします!