Help us understand the problem. What is going on with this article?

Selenium の locator とうまくつきあうための話

More than 1 year has passed since last update.

この記事は、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 の入力以外(リンク、画像、ボタン)の指定は以下の優先順位で利用する
    1. css selector
    2. xpath
    3. 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 を指定する

css
#hoge li
XPath
id('hoge')//li

隣接セレクタ

例:h1 の直後にある p を指定する

css
h1 + p
XPath
//h1/following-sibling::p

属性セレクタ

例: type が reset の input を指定する

css
input[type='reset']
XPath
//input[@type='reset']

まとめ

Selenium でブラウザ操作の自動化をするときに、要素の指定に様々な指定方法があり、可読性の低い指定の仕方をしてしまったり、変更に弱い指定の仕方をしてしまったりすることが多いです。

今回紹介した方針は銀の弾丸ではないですが、継続してメンテナンスをしていく上で有効となると思います。
楽しい Selenium ライフを。

明日は、@ito_nozomiさんです。
また、Selenium Advent Calendar 2013はまだまだ募集中ですので、ぜひとも参加をよろしくおねがいします!

okitan
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした