すべてのページのインスタンス化でいくつかのことを行っている間、DOM との Selenium の相互作用は非常に遅いようです。サイト全体で、未解決の API 呼び出しが解決されたかどうかを示すスピナーが表示されます。要約すると、アクションを実行する前にページの安定性を確認する 3 つの方法があります。
- DOM の準備完了状態を確認する
- 未解決の JQuery 呼び出しがないか確認する
- スピナーの読み込みを確認する
これら 3 つのすべては、次のメソッドを使用してページ オブジェクトのインスタンス化の一部として実行されます。
public static void waitForLoadingAllSpinnersAnywhere(final WebDriver driver){
final WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(waitForDomReadyState());
wait.until(waitForjQueryToBeInactive());
List<WebElement> elements = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(spinnersLoacator));
for(WebElement element: elements){
wait.until(invisibilityOfElementLocated(element));
}
}
private static ExpectedCondition<Boolean> waitForDomReadyState(){
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver d){
return ( ((JavascriptExecutor) d).executeScript("return document.readyState;").equals("complete"));
}
};
}
private static ExpectedCondition<Boolean> waitForjQueryToBeInactive(){
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver d){
return (Boolean) ( ((JavascriptExecutor) d).executeScript("return jQuery.active == 0;"));
}
};
}
public static ExpectedCondition<Boolean> invisibilityOfElementLocated(final WebElement element){
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver){
try{
return !element.isDisplayed();
} catch (NoSuchElementException | StaleElementReferenceException e){
// Returns true because the element is not present in DOM.
// The
// try block checks if the element is present but is
// invisible or stale
return true;
}
}
};
}
かなりの数の API 呼び出しがあり、大量のデータをフェッチするページ (患者ページなど) を例にとります。最初のクラスのインスタンス化には、約 17 秒かかります (以下のログ)。私の Selenium の知識によると、後続のページのインスタンス化では、DOM の準備完了状態を確認するのに同じまたはそれ以上の時間がかかるべきではありません。また、JQuery の呼び出しまたはスピナーの待機は、何も変更されていないためです。ただし、新しいページがインスタンス化されるたびに、これら 3 つすべてをチェックするのに同じ時間がかかることがわかります。そこで何が起こっているのですか?Selenium は実際にこれらを実行するたびにサーバーと対話しようとしますか、それともクライアントとの対話が何らかの理由で遅いですか? もしそうなら、可能な答えは何ですか?
コンソールログ
==== [[[17]秒後にウィジェット[患者]で見つかった8つのスピナー要素の待機を終了しました]]
==== [[ウィジェット [患者] で見つかった 8 つのスピナー要素の待機を開始します]]
==== [[[17]秒後にウィジェット[患者]で見つかった8つのスピナー要素の待機を終了しました]]
==== [[[Patient]]] のブラウザ
==== [[ウィジェット [患者] で見つかった 8 つのスピナー要素の待機を開始します]]
==== [[[17]秒後にウィジェット[患者]で見つかった8つのスピナー要素の待機を終了しました]]
環境:
- セレン 2.48
- Firefox 38
Selenium 2.52 と firefox 44 でも同じ結果で試しました