use std::time::{Duration, Instant};
use zendriver::Browser;
const PAGE_HTML: &str = "data:text/html,\
<!doctype html><html><body>\
<h1>parent</h1>\
<iframe id='f' srcdoc=\"<button id='b'>hello from iframe</button>\"></iframe>\
</body></html>";
#[tokio::main]
#[allow(clippy::result_large_err)] async fn main() -> zendriver::Result<()> {
tracing_subscriber::fmt::init();
let browser = Browser::builder().headless(true).launch().await?;
let tab = browser.main_tab();
tab.goto(PAGE_HTML).await?;
tab.wait_for_load().await?;
let deadline = Instant::now() + Duration::from_secs(5);
let child = loop {
let frames = tab.frames().await?;
println!("frames so far: {}", frames.len());
for f in &frames {
println!(
" - id={} main={} url={:?}",
f.id(),
f.is_main(),
f.url().await
);
}
if let Some(child) = frames.into_iter().find(|f| !f.is_main()) {
break child;
}
if Instant::now() >= deadline {
return Err(zendriver::ZendriverError::Timeout(Duration::from_secs(5)));
}
tokio::time::sleep(Duration::from_millis(50)).await;
};
let btn = child.find().css("#b").one().await?;
let text = btn.inner_text().await?;
println!("iframe button text = {text:?}");
browser.close().await?;
Ok(())
}