value属性で指定できるElementLocator

引き続きseleniumを試しているんだけど、value属性はあるけれどname属性がないタグを指定できるElementLocatorがない。例えばsubmitボタンはvalue属性の値がボタンに表示されるので、value属性は指定するけどname属性は指定していないことが多かったが、そうするとsubmitボタンを押すことができない。またStrutsのhtml:submitタグはname属性が指定できない。

そこでvalue属性で指定できるElementLocatorを作ってみた。selenium-browserbot.jsに以下を追加する。それだけ。

PageBot.prototype.locateElementByValue = function(identifier, inDocument) {
    var allElements = inDocument.getElementsByTagName("*");
    for (var i = 0; i < allElements.length; i++) {
        var testElement = allElements[i];
        if (testElement.value && testElement.value === identifier) {
            return testElement;
        }
    }
    return null;
};

そうすると

<input type="submit" value="ログイン">

<tr>
  <td>clickAndWait</td>
  <td>value=ログイン</td>
  <td>&nbsp;</td>
</tr>

でクリックできるようになる。
で、これを作った後

<tr>
  <td>clickAndWait</td>
  <td>//input[@value='ログイン']</td>
  <td>&nbsp;</td>
</tr>

とすればvalue属性で指定できることがわかった。orz

でも「value=foo」の方がわかりやすいよね、ね。