(一) To Handle Ajax
演示代码如下:
使用FluentWait + Predicate接口
或者也可以直接使用Wait接口的until方法,传入一个ExpectedCondition
Selenium WebDriver在加载页面的时候,无论是driver.get(url)或者driver.getPageSource(),会立即返回当时页面的数据。但当代的网页技术都大量使用了异步Ajax调用,这使得许多DOM元素的创建和加载,都分布在页面load结束后的许多零散的时间点,让WebDriver的findElement经常无功而返。这个时候,一般有两种方式来解决问题:
演示代码如下:
使用FluentWait + Predicate接口
FluentWait<By> fluentWait = new FluentWait<By>(By.tagName("TEXTAREA"));
fluentWait.pollingEvery(100, TimeUnit.MILLISECONDS);
fluentWait.withTimeout(1000, TimeUnit.MILLISECONDS);
fluentWait.until(new Predicate<By>() {
public boolean apply(By by) {
try {
return browser.findElement(by).isDisplayed();
} catch (NoSuchElementException ex) {
return false;
}
}
});
browser.findElement(By.tagName("TEXTAREA")).sendKeys("text to enter");
或者也可以直接使用Wait接口的until方法,传入一个ExpectedCondition
public ExpectedCondition<WebElement> visibilityOfElementLocated(final By by) {
return new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver)