用selenium進行web UI的自動化開發時,經常遇到loading需要等待的時候,或者需要驗證一個action之后某個dialog是否呈現或者消失。對於這類情況是不建議用sleep(xx)來死等,因為你無法准確判斷要等多久,少了就會報error,多了就會浪費整個腳本跑的時間。聰明的做法就是靈活等待,WebDriverWait(org.openqa.selenium.support.ui)這個類是很好的選擇。
/** * Wait until the element visible with customized timeout * @param driver * @param locator * @param errorMessage * @return */ public WebElement waitForElementVisible(WebDriver driver,final By locator, long timeOutInSeconds, String errorMessage) { Function<WebDriver, WebElement> waitFn = new Function<WebDriver, WebElement>() { @Override public WebElement apply(WebDriver driver) { try { WebElement el = driver.findElement(locator); if (el.isDisplayed()) { return el; } } catch (Exception e) { } return null; } }; WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); if (errorMessage != "") { wait.withMessage(errorMessage); } else { wait.withMessage("Cannot find Element: " + locator.toString()); } return wait.until(waitFn); }
/** * Wait until the element present with customized timeout * @param driver * @param locator * @param errorMessage * @return */ public Boolean waitForElementPresent(WebDriver driver,final By locator, long timeOutInSeconds, String errorMessage) { Function<WebDriver, Boolean> waitFn = new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { try { driver.findElement(locator); return true; } catch (Exception e) { return false; } } }; WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); if (errorMessage != "") { wait.withMessage(errorMessage); } else { wait.withMessage("Cannot find Element: " + locator.toString()); } return wait.until(waitFn); }