今回は、Seleniumのフォーム入力を高速化する方法を紹介します。
Seleniumを使ってフォーム入力を行なう場合は、通常はWebElement
のclear
やsendKeys
メソッドを使いますが、入力文字数に比例して入力速度が遅くなる傾向があります。少ない文字数だと入力速度が遅くなることを体感するのは難しいですが、テキストエリアなどに大量の文字を入力すると、入力速度が遅くなることを体感することができます。
一般的なフォーム入力の方法
Seleniumでの一般的なフォーム入力の方法は、以下のような感じです。
<textarea name="note" cols="100" rows="30"></textarea>
WebElement element = webDriver.findElement(By.name("note"));
element.sendKeys("foo...");
高速化=JavaScriptを使う!!
SeleniumはJavaScriptをサポートしており、JavaScriptを使用してフォーム入力を行なうことができます。JavaScriptを使用すると、sendKeys
メソッドを使う方法に比べて入力速度の向上が望めます。
JavaScriptを使用してフォーム入力する方法は、以下のような感じです。
WebElement element = webDriver.findElement(By.name("note"));
((JavascriptExecutor) webDriver).executeScript("arguments[0].value = arguments[1];", element, "foo...");
ポイントは・・・
-
WebDriver
インスタンスをJavascriptExecutor
にキャストする -
JavascriptExecutor
のexecuteScript
メソッドの第1引数にJavaScriptコードを指定する -
JavascriptExecutor
のexecuteScript
メソッドの第2引数以降にJavaScriptコードへのパラメータを渡す
という点です。
JavaScriptコードの中では、JavaScriptコードへのパラメータを「arguments[n]
」という形式(nは0〜)で指定できるため、上の例だと・・・
-
arguments[0]
にはWebElement
のインスタンス( =webDriver.findElement(By.name("note"))
の結果) -
arguments[1]
には入力値( ="foo..."
)
がJavaScriptコードに渡され、入力フォームのnote
に入力値を設定することができるのです!!
ただ・・・ちょっとコード量が増える(煩雑なコードになる)ので、ユーティリティメソッドなどを用意する方がよさそうですね。
SelenideでJavaScriptを使う!!
SelenideはSeleniumのラッパーライブラリで、jQuery LikeにSeleniumのWebElement
を操作することができます。
Selenideを使用してフォーム入力する方法は、以下のような感じです。
$(By.name("note")).val("foo...");
Selenideのデフォルト動作はSeleniumの標準的な入力方法と同様に、WebElement
のclear
やsendKeys
メソッドを使いますが、この動作はSelenideのオプション指定でJavaScriptを使用する方法に変更することができます。(=入力値を設定するコードを直す必要はありません!!)
強制的にJavaScriptして入力値を入力したい場合は、以下のようにテストケースクラスでオプションを指定しましょう。
...
import static com.codeborne.selenide.Configuration.*; // オプション指定するためにstaticフィールドのインポート
...
public class UITest {
@Before
public void setupSelenide() {
// ...
fastSetValue = true; // 値の設定を高速化するオプションを有効にする (JavaScriptを使用したフォーム入力が使われる)
}
// ...
}
入力方法を実行時に切り替える場合は、テストケース内で指定するのではなく、Javaのシステムプロパティを使用してオプションを指定(-Dselenide.fastSetValue=true
)してください。
実践アプリの紹介
以下のアプリで、Selenide+JavaScriptを使用したフォーム入力を実践しています。(参考までに・・)
まとめ
Seleniumを使用して大量の文字をフォームに入力する場合は、JavaScriptを使用する方法に変更することを検討してみるとよいと思います。1項目単位でみると速度差は体感しずらいと思いますが・・・フォーム内の入力項目数やテストケース数が増えるにつれて(チリツモで)速度差を体感できると思います。