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で取得しています。