SeleniumWebDriverで暗黙的なWait(Sleep)を入れてみる。
SeleniumWebDriverで暗黙的なWaitを入れたい
自動化で操作を行う場合に、一番ネックになる部分、それは画面の切り替わりであったり、何かしらの処理を「待つ」ということではないでしょうか。
- 何を持って画面が切り替わったと判定するのか。
- 何を持って処理が終了したと判定するのか。
このあたり、自動化のスクリプトを安定させるためには非常に重要ですよね。
画面の切り替わりを判定させる。
方法としては、期待する画面が表示された場合に表示されるであろう何かを待つようにする。を一つの例として。
public class ExTest { WebDriver driver; ExTestPage ex; @Test public void test1() { //driverのプロパティの設定。 System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe"); //driverにchromeDriverをセット。 driver = new ChromeDriver(); //Web画面の要素を操作するためのWebelementを生成。 WebElement element; //★waitを生成。(最大5秒待つ、みたいな設定だった様な) WebDriverWait wait = new WebDriverWait(driver, 5); //ブラウザの立ち上げ。(初期ページの指定) driver.get("http://autotestengineer.hatenablog.com/"); //ページ内の”QAエンジニア”の文字列を含む”aタグ”をelementにセットして、クリックする。 element = driver.findElement(By.xpath("(//a[text()='QAエンジニア'])[1]")); element.click(); //★一覧画面にしか表示されない「トップ」というspan属性のtitle属性が表示されることを待つ。 wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='トップ']"))); //ブラウザ終了。 driver.quit(); } }
処理の終了を判断させる
これは、処理が走った後に画面は切り替わらないが、ボタンが押せるようになるのを待ちたいケースとか。 要は、押せるようになるを検知する、を一つの例として。
上記の
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='トップ']")));
を以下の様に記載すれば実現可能です。
下記で待った後にクリック処理を入れるようにすれば、動作として安定するかもです。
//★一覧画面にしか表示されない「トップ」というspan属性のtitle属性が表示されることを待つ。 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()='トップ']")));
ちょっと自分で試したことがあるものを履歴がてら残してみました。