我不同意帕維爾佐林斯的答案將工作,因爲他沒有展示如何處理例外。
下面是我如何等待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