ネイティブイベントを無効にする
ネイティブイベントのおおよその本質は次のとおりです。テストが文字列に遭遇したとき
次に、「座標を含むフィールドに「hello」という単語を入力してください」など、何らかの種類のイベントがOSに送信されます。 座標はそれ自体で何らかの方法で計算され、ユーザーがキーボードからゆっくりとテキストを入力しているように見えます。 問題は、非常に長い時間がかかることですが、必要ありません。driver.findElement(By.id(“someId”)).sendKeys(“hello”);
この機能を無効にするには、事前に設定されたプロファイルで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バンドルで実行されました