用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); }