use chromiumoxide::{browser::Browser, error::CdpError};
use futures_util::stream::StreamExt;
use std::{
env::set_var,
time::{Duration, Instant},
};
#[tokio::test]
async fn basic() -> Result<(), Box<dyn std::error::Error>> {
set_var("CHROME_INIT", "ignore"); tracing_subscriber::fmt::init();
headless_browser_lib::fork(Some(*headless_browser_lib::conf::DEFAULT_PORT));
let task = tokio::spawn(headless_browser_lib::run_main());
tokio::time::sleep(Duration::from_millis(100)).await;
let start = Instant::now();
let (browser, mut handler) =
Browser::connect_with_config("http://127.0.0.1:6000/json/version", Default::default())
.await?;
let handle = tokio::task::spawn(async move {
while let Some(h) = handler.next().await {
if h.is_err() {
break;
}
}
});
let navigate_page = async |u: &str| -> Result<String, CdpError> {
let start = Instant::now();
let page = browser.new_page(u).await?;
println!("NewPage({u}): {:?}", start.elapsed());
let start = Instant::now();
let html = page.wait_for_navigation().await?.content().await?;
println!("WaitForNavigationAndContent({u}): {:?}", start.elapsed());
Ok::<String, CdpError>(html)
};
let (spider_html, example_html) = tokio::join!(
navigate_page("https://spider.cloud"),
navigate_page("https://example.com")
);
let elasped = start.elapsed();
browser.close().await?;
let _ = handle.await;
let spider_html = spider_html?;
let example_html = example_html?;
assert_eq!(elasped.as_secs() <= 15, true);
assert_eq!(spider_html.is_empty(), false);
assert_eq!(spider_html.len() >= 1000, true);
assert_eq!(example_html.is_empty(), false);
assert_eq!(example_html.len() >= 400, true);
println!("Time took: {:?}", elasped);
task.abort();
Ok(())
}