我有一个最初为空的iframe,然后在页面上的交互过程中将元素动态加载到iframe中。我需要访问其中一个元素才能进入工作流程的下一步。我使用以下代码: -
driver.switchTo().frame(iframeElement);
Wait wait = new FluentWait(driver).withTimeout(30,TimeUnit.SECONDS).
pollingEvery(2,TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
WebElement pluginTwitterButton = wait.until(new Function() {
public WebElement apply( WebDriver driver ) {
return driver.findElement( By.id("twitter") );
}
});
稍后我需要做pluginTwitterButton.click();
但是我收到以下错误 - org.openqa.selenium.TimeoutException:30秒后超时等待xxx.xxx.TestCaseSampleReply$1@1217e615构建信息:版本:'2.25.0',修订版:'17482',时间:'2012-07-18 21:08:56'系统信息:os.name:'Linux',os.arch:'amd64',os.version:'3.2.0-32-generic',java.version :'1.6.0_24'引起:org.openqa.selenium.NoSuchElementException:无法找到element:{“method”:“id”,“selector”:“twitter”}命令持续时间或超时:30.03秒
我使用firefox驱动程序,selenium webdriver jar v.2.25.0 - 当firefoxdriver执行时,需要单击的元素对眼睛是可见的,但iframe变量由于某种原因没有刷新。我在这里缺少什么?
答案 0 :(得分:2)
从this post开始,你可以试试这个:
driver.switchTo().frame(iframeElement);
Thread.sleep(2000); // time to load new iframe DOM
WebElement myElement = fluentWait(By.cssLocator(myLocator));
使用此方法:
public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class, StaleElementReferenceException.class );
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
});
return foo;
};