Seleniumを使ったテストの中で厄介なのが画面遷移を伴う操作で、画面の読み込み完了判定を行う時ではないでしょうか。StackOverflowでも同様の質問があがっており、その際に解答に上がっていたのは、
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
のようにJavaScriptを実行してreadyStateを監視するというものでした。
Pitaliumでは専用のメソッドを提供しています。それがPtlWebDriverのuntilLoadです。使い方は以下の通りです。
driver.get(url);
PtlWebDriverWait wait = new PtlWebDriverWait(driver, 30);
// ロードするまで待つ
wait.untilLoad();
// ロードが完了してからスクリーンショットを取得する
assertionView.assertView("load_complete");
untilLoadの実際のコードは次のようになっています。
/**
* ページのLoadイベント終了まで待機します。
*/
public void untilLoad() {
final int sleepMillis = 100;
try {
Thread.sleep(sleepMillis);
String beforeURL = getURL();
try {
addElement(DUMMY_TAG_ID);
// このタイミングでページが切り替わるとタイムアウトを待つため、時間がかかる。
until(FIND_DUMMY_TAG_CONDITION);
deleteElement(DUMMY_TAG_ID);
} catch (Exception ex) {
String afterURL = getURL();
if (!beforeURL.equals(afterURL)) {
LOG.warn("wait前と後でページが切り替わっているため、waitを継続します");
// URLが違う場合、切り替わっていないため、もう一度実行する。
untilLoad();
} else {
throw new TestRuntimeException(ex);
}
}
} catch (InterruptedException e) {
throw new TestRuntimeException(e);
}
}
このようにダミーのDOMを追加して、その状態を見て読み込み状態を判別するようになっています。
簡単に使えますのでぜひ試してみてください。
