SeleniumはWebシステムの自動テストにはとても便利なのですが、
手動でテストコードを書こうと思うと長くなるし
クリックできるようになるのを待つ、actionでクリックする、など
コツを掴まないと思うように操作できず初めはかなりとっつきにくいです。
例えば、ある要素をクリックするだけのコードでも以下のようになります。
WebElement element = driver.findElement(By.id("id"));
wait.until(ExpectedConditions.elementToBeClickable(element));
Actions actions = new Actions(driver);
actions.click(element);
これを、以下のようにJQuery風に書けるようにしてみました。
$("#id").click();
findやchildrenも実装したので、あるテーブルの行数を取得するコードも以下のように書けます。
$("#id").find("TBODY").children("TR").size();
これならseleniumを知らなくてもJQueryを使える人なら書けるのではないでしょうか。
使い方は、githubの以下のソースを落として、テストクラス側に以下のメソッドを用意するだけです。
(driverはクラス変数にしておいてください)
public static ExtendElement $(String selector) {
return new ExtendElement(driver, driver.findElement(By.cssSelector(selector)));
}
複数要素を取得したい場合には以下のようなメソッドも作ってください。
(Javaの制約上、戻り値の型指定が必要なのでどうしても別メソッドにせざるを得ません。。)
public static List<ExtendElement> $$(String selector) {
ExtendElement ele = new ExtendElement(driver, driver.findElement(By.tagName("body")));
return ele.finds(selector);
}
ExtendElementは、WebElementを拡張したようなクラスですが
JQuery風にするためにあえてWebElementをimplementsせず、
独自の名前でメソッドを定義しています。
例えば、getText()はtext()に。
doubleClick()はdblclick()にしています。
一番苦戦したのがchildren。
SeleniumのcssSelectorでは">*"の指定がエラーになってしまうので、
仕方なくxPathに変換して取得しています。
public List<ExtendElement> children(String selector) {
List<ExtendElement> elist = new ArrayList<ExtendElement>();
String xpath = cssToXpath(selector);
List<WebElement> wlist = elm.findElements(By.xpath("./" + xpath));
for(WebElement welm : wlist) {
elist.add(new ExtendElement(driver, welm));
}
return elist;
}
ただし、クラス名をStringで比較してしまうので"img"の指定で"img2"がHITしてしまったり、
複数クラス名の指定ができないといった問題があります。
(closestも同様)
自分の知識ではどうにもできなかったので、
どなたかいい方法をご存知の方がいればコメントかプルリクいただけると助かります。