Насколько я понял, там обычные контролы, а не подгружающийся фрэйм.
Если он грузится действительно долго, можно попробовать ожидать readyState (frame.contentDocument.readyState). Но это поможет, если в самом фрэйме нет ajax. Если и там есть ajax, то работать в два этапа:
дождаться объекта фрэйма
затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Если и это по каким-то причинам невозможно, то остается только жесткий таймаут или колдовать с innerHTML фрэйма (ожидать, чтобы он не изменялся)
try {
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.switchTo().frame(0);
Знаете, я просто использовал этот таймер, который ждет n секунд и наконец получил внутренности фрейма!

затем дождаться объекта в этом фрэйме, наличие которого говорит о том, что фрэйм загружен полностью
Не поможете с реализацией этого кода?
Нашел такой пример:
private WebElement foundElement;
public WebElement find(By by){
for (int milis=0; milis<3000; milis = milis+200){
try{
foundElement = driver.findElement(by);
}catch (Exception e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
return foundElement;
}
Наверное, лучше использовать бесконечный цикл?