申し訳ありませんが、Python バインディングについてはお手伝いできません。ただし、WebDriver に関する一般的なアドバイスと、(他の) 人が同等の Python を見つけるのに役立つ Java スニペットを提供することはできます。Selenium で AJAX を処理できることはたくさんあります。
1.暗黙の待機-これにより、WebドライバーはDOMを一定期間ポーリングするように指示されます。
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
2. 明示的な待機- 私はこちらの方が好きです! これらを暗黙の待機と組み合わせて使用できます。WebDriver に特定の条件を待つように指示できます。明示的な待機を使用するには、WebDriverWait を使用する必要があります。
WebDriverWait wait = new WebDriverWait(driver, 60/*timeout in seconds*/);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("refresh")));
ExpectedConditions
無料で多くの待機条件が提供されており、非常に便利だと思います。
上記のコード スニペットを Java で書くとしたら、以下のようにします。これはエディターで書いたので、コンパイルする必要があることに注意してください。これにより、WebDriverWait の使用に関するアイデアが得られると思います。
WebDriverWait wait = new WebDriverWait(driver, 60/*timeout in seconds*/);
ExpectedCondition<Boolean> untilIFindStatus = ExpectedConditions
.elementToBeSelected(By.id("status"));
while (wait.until(untilIFindStatus)) {
WebElement refresh = wait.until(ExpectedConditions
.elementToBeClickable(By.id("refresh")));
refresh.click();
List<WebElement> allRows = wait.until(ExpectedConditions
.presenceOfAllElementsLocatedBy(By.className("datarow")));
for (WebElement row : allRows) {
if (row.getText().equals("awesome"))
System.out.println("do something");
}
}
最後に、私の経験では、最新の AJAX アプリケーションの多くが jQuery を使用しています。私は数年にわたって jQuery.active フラグを使用して、ページが読み込まれているかどうかを確認してきました。それをプレーンな javascript と組み合わせることができますdocument.readyState
。これは、AJAX アプリの「クリック」ごとに待機するために使用する一般的な方法です。
ExpectedCondition<Boolean> jQueryActive_toBeZero = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
try {
return ((Long) jsExecutor
.executeScript("return jQuery.active") == 0) ? true
: false;
} catch (WebDriverException e) {
log.debug("It looks like jQuery is not available on the page, skipping the jQuery wait, check stack trace for details");
return true; //skip the wait
}
}
};
ExpectedCondition<Boolean> document_readyState_toBeComplete = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return jsExecutor.executeScript("return document.readyState")
.toString().equals("complete") ? true : false;
}
};
wait.until(jQueryActive_toBeZero);
wait.until(document_readyState_toBeComplete);