Help us understand the problem. What is going on with this article?

Selenide(fastSetValue=true)でSeleniumのフォーム入力を高速化できる!?

More than 3 years have passed since last update.

今回は、Seleniumのフォーム入力を高速化する方法を紹介します。
Seleniumを使ってフォーム入力を行なう場合は、通常はWebElementclearsendKeysメソッドを使いますが、入力文字数に比例して入力速度が遅くなる傾向があります。少ない文字数だと入力速度が遅くなることを体感するのは難しいですが、テキストエリアなどに大量の文字を入力すると、入力速度が遅くなることを体感することができます。

一般的なフォーム入力の方法

Seleniumでの一般的なフォーム入力の方法は、以下のような感じです。

HTMLの入力フォーム例
<textarea name="note" cols="100" rows="30"></textarea>
Seleniumを介した入力フォームへの値の設定例
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にキャストする
  • JavascriptExecutorexecuteScriptメソッドの第1引数にJavaScriptコードを指定する
  • JavascriptExecutorexecuteScriptメソッドの第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の標準的な入力方法と同様に、WebElementclearsendKeysメソッドを使いますが、この動作は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項目単位でみると速度差は体感しずらいと思いますが・・・フォーム内の入力項目数やテストケース数が増えるにつれて(チリツモで)速度差を体感できると思います。

参考サイト

kazuki43zoo
Javaエンジニアで、SpringやMyBatisらへんにそれなりに詳しいです。お仕事のつながりで「Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発」を共著させてもらいました!
https://kazuki43zoo.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした