Seleniumテストの高速化

ビルドでSeleniumテストを使用するすべての人は、非常に遅いため、これが非常に高価であることを知っています。 このため、多くの人はコミットの前にビルドを完全に開始しないか、一般的には夜間のみビルドを実行します。 そのため、テストを高速化します。



ネイティブイベントを無効にする



ネイティブイベントのおおよその本質は次のとおりです。テストが文字列に遭遇したとき
driver.findElement(By.id(“someId”)).sendKeys(“hello”);
      
      



次に、「座標を含むフィールドに「hello」という単語を入力してください」など、何らかの種類のイベントがOSに送信されます。 座標はそれ自体で何らかの方法で計算され、ユーザーがキーボードからゆっくりとテキストを入力しているように見えます。 問題は、非常に長い時間がかかることですが、必要ありません。

この機能を無効にするには、事前に設定されたプロファイルでFirefoxを実行する必要があります。

 private WebDriver firefox() { final FirefoxProfile profile = new FirefoxProfile(); profile.setEnableNativeEvents(false); return new FirefoxDriver(profile); }
      
      





これが高速ドライバーの入手方法です。

テストを実行するための既製のプロファイルがある場合、その中にuser.jsファイルを作成できます。

 user_pref("webdriver_enable_native_events", false);
      
      





または、ドライバーの作成方法をわずかに変更します

 private WebDriver firefox(final String profileName) { final FirefoxProfile profile = new ProfilesIni().getProfile(profileName); profile.setEnableNativeEvents(false); return new FirefoxDriver(profile); }
      
      





アニメーションをオフにします



もちろん、サイト上のアニメーションは重要ですが、テスト中は悪です。 このアニメーションが終了するまで、松葉杖を挿入するなど、常に待機する必要があります。 はい、アニメーション自体がテスト時間の一部を消費します。 一般に、jQueryを例として使用してアニメーションを無効にします

 private WebDriver initDriver() { final WebDriver wrappedDriver = firefox(); final EventFiringWebDriver driver = new EventFiringWebDriver(wrappedDriver); driver.register(new AbstractWebDriverEventListener() { @Override public void afterNavigateTo(final String url, final WebDriver driver) { ((JavascriptExecutor) driver).executeScript("jQuery.fx.off = true;"); } //        //      beforeClickOn, afterNavigateBack  .. } ); return driver; }
      
      





次に、EventFiringWebDriverクラスのインスタンスを操作します。 この例では、afterNavigateTo()メソッドのみを再定義しました。このメソッドは、driver.get(someUrl)を呼び出すたびに自動的に呼び出されます。 実際には、これでは明らかに不十分です。 たとえば、テストでボタンを押すと、別のページへの自動リダイレクトが発生します。 この場合、afterNavigateTo()は呼び出されないため、新しいページを読み込んだ後に要素をクリックしたときにアニメーションを無効にするには、beforeClickOn()をさらに再定義する必要があります。



テストを並行して実行する



最初はSelenium Gridの方を向いていましたが、demを開始することさえできませんでした。一般に、グリッドはあまり便利ではないと思われました。ハブとサーバーを開始する必要があります。 そのため、MavenとTestNGを使用して2つ以上のブラウザーでテストを実行します。

pom.xmlに追加

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8.1</version> <executions> <execution> <id>run-integration-tests</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <groups>integration</groups> <parallel>classes</parallel> <threadCount>2</threadCount> </configuration> </execution> </executions> </plugin>
      
      





scope =“ singleton”のスレッドセーフインスタンスをテストに注入する場合、scope =“ prototype”に変更する必要があります。 最良の場合、この段階では、構成の構成(たとえば、Spring)でのみ抜け出すことができます。 各テストでログインに一意のユーザー名を使用している場合、すべてがハーフキックで動作するはずです。



まとめ



以前、私が取り組んでいるプロジェクトでは、Seleniumテストの実行に約5分かかりましたが、現在は1.5分です。



参照用


上記のすべてのアクションは、Java + Selenium 2.8.0 + Maven + TestNG + Firefox 7.0.1 + Springバンドルで実行されました



All Articles