use futures_util::StreamExt;
use thirtyfour::bidi::events::BeforeRequestSent;
use thirtyfour::bidi::modules::browsing_context::ReadinessState;
use thirtyfour::bidi::modules::network;
use thirtyfour::prelude::*;
#[tokio::main(flavor = "multi_thread")]
async fn main() -> WebDriverResult<()> {
let mut caps = DesiredCapabilities::chrome();
caps.set_headless()?;
caps.set_no_sandbox()?;
caps.set_disable_gpu()?;
caps.enable_bidi()?;
let driver = WebDriver::managed(caps).await?;
let bidi = driver.bidi().await?;
let mut events = bidi.subscribe::<BeforeRequestSent>().await?;
let intercept = bidi
.network()
.add_intercept(vec![network::InterceptPhase::BeforeRequestSent], None)
.await?;
println!("intercept registered: {}", intercept.id());
let context = bidi.browsing_context().top_level().await?;
let nav = {
let bidi = bidi.clone();
let context = context.clone();
tokio::spawn(async move {
bidi.browsing_context()
.navigate(context, "https://example.com/", Some(ReadinessState::Complete))
.await
})
};
while let Some(event) = events.next().await {
if event.is_blocked && event.request.url.starts_with("https://example.com/") {
println!("continuing paused {} {}", event.request.method, event.request.url);
bidi.network().continue_request(event.request.id).await?;
break;
}
}
nav.await.map_err(|e| WebDriverError::FatalError(format!("nav join: {e}")))??;
intercept.remove().await?;
println!("page loaded; intercept removed");
driver.quit().await
}