php-webdriverでSOY CMSにログインしてみる


前回、任意の入力フォームを選んで値を入力して、

任意のボタンを押すという動作をSeleniumとphp-webdriverで自動化してみた。


UIテストの大体の動作は前々回のフォームの内容を取得すると合わせれば対応できるが、

これでは対応できないものがあった。


それは、



性別などで使われるラジオボタンです。

ラジオボタンのHTMLを抜き出してみると、

<input type="radio" id="male" name="sex" value="0"><label for="male">男性</label>
<input type="radio" id="female" name="sex" value="1"><label for="female">女性</label>

となり、この場合は<input>のid属性と<label>のfor属性を紐付けるためにIDで任意の値があるから、

男性のラジオボタンにチェックを入れる時は、

$driver->findElement(WebDriverBy::id("male")->click();

のようにWebDriverByで用意されているidメソッドで任意のIDを指定すれば良い。


しかしだ、

最近のラジオボタンのHTMLを見ると、

<label><input type="radio" name="sex" value="0">男性</label>
<label><input type="radio" name="sex" value="1">女性</label>

このように<input>のid属性と<label>のfor属性を省略して記述されていることが多くなった。

この場合、name属性が被ってしまうため、今までのWebDriverByのメソッドでは任意の要素を取得することが出来ない。


このような場合でも取得できるようにWebDriverByオブジェクトではxpathというメソッドが用意されている。

xpathは1個以上の属性の値を利用して、要素を取得するためのメソッドで、

$driver->findElement(WebDriverBy::xpath("//input[@type='radio' and @name='sex' and @value='0']")->click();

このようにタグ名と複数の属性を記述して要素を取得できる。


書き方は

//タグ名[@属性名='属性の値' (必要であればand @属性名='属性値'と続ける)]

となる。


SOY CMSは仕様上、ラジオボタンで使用するcms:id(soy:id)では、ラジオボタンのHTMLが出力される際にユニークなIDがふられてしまうため、

ラジオボタンの要素はすべてxpathで取得しています。