我不同意帕维尔佐林斯的答案将工作,因为他没有展示如何处理例外。
下面是我如何等待iFrame。这要求你的JUnit测试类通过RemoteWebDriver实例到页面对象:
public class IFrame1 extends LoadableComponent<IFrame1> {
private RemoteWebDriver driver;
@FindBy(id = "iFrame1TextFieldTestInputControlID")
public WebElement iFrame1TextFieldInput;
@FindBy(id = "iFrame1TextFieldTestProcessButtonID")
public WebElement copyButton;
public IFrame1(RemoteWebDriver drv) {
super();
this.driver = drv;
this.driver.switchTo().defaultContent();
waitTimer(1, 1000);
this.driver.switchTo().frame("BodyFrame1");
LOGGER.info("IFrame1 constructor...");
}
@Override
protected void isLoaded() throws Error {
LOGGER.info("IFrame1.isLoaded()...");
PageFactory.initElements(driver, this);
try {
assertTrue("Page visible title is not yet available.", driver
.findElementByCssSelector("body form#webDriverUnitiFrame1TestFormID h1")
.getText().equals("iFrame1 Test"));
} catch (NoSuchElementException e) {
LOGGER.info("No such element.");
assertTrue("No such element.", false);
}
}
@Override
protected void load() {
LOGGER.info("IFrame1.load()...");
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class)
.ignoring(StaleElementReferenceException.class) ;
wait.until(ExpectedConditions.presenceOfElementLocated(
By.cssSelector("body form#webDriverUnitiFrame1TestFormID h1")));
}
....
注意:您可以see my entire working example here。
谢谢你的建议,纠正我,如果我错了,你建议我在driver.get(“http://www.rambler.ru”)后使用等待元素。但WebDriver将等待,直到driver.get()将完成页面加载,并将转到元素等待? – 2012-03-28 11:00:46
webdriver总是等待加载页面。可能是我对你的问题有错误的理解。在这种情况下,如果加载时间超过30秒(例如) – 2012-03-28 11:13:38
我的意思是:http:// stackoverflow .com/a/6107997/1165331 – 2012-03-28 11:18:54