Expand description
A high-level API to control headless Chrome or Chromium over the DevTools Protocol. It is the Rust equivalent of Puppeteer, a Node library maintained by the Chrome DevTools team.
It is not 100% feature compatible with Puppeteer, but there’s enough here to satisfy most browser testing / web crawling use cases, and there are several ‘advanced’ features such as:
- network request interception
- JavaScript coverage monitoring
- taking screenshots of elements or the entire page
- saving pages to PDF
- ‘headful’ browsing
- automatic downloading of ‘known good’ Chromium binaries for Linux / Mac / Windows
- extension pre-loading
§Quick Start
use std::error::Error;
use headless_chrome::Browser;
use headless_chrome::protocol::cdp::Page;
fn browse_wikipedia() -> Result<(), Box<dyn Error>> {
let browser = Browser::default()?;
let tab = browser.new_tab()?;
// Navigate to wikipedia
tab.navigate_to("https://www.wikipedia.org")?;
// Wait for network/javascript/dom to make the search-box available
// and click it.
tab.wait_for_element("input#searchInput")?.click()?;
// Type in a query and press `Enter`
tab.type_str("WebKit")?.press_key("Enter")?;
// We should end up on the WebKit-page once navigated
let elem = tab.wait_for_element("#firstHeading")?;
assert!(tab.get_url().ends_with("WebKit"));
/// Take a screenshot of the entire browser window
let jpeg_data = tab.capture_screenshot(
Page::CaptureScreenshotFormatOption::Jpeg,
None,
None,
true)?;
// Save the screenshot to disc
std::fs::write("screenshot.jpeg", jpeg_data)?;
/// Take a screenshot of just the WebKit-Infobox
let png_data = tab
.wait_for_element("#mw-content-text > div > table.infobox.vevent")?
.capture_screenshot(Page::CaptureScreenshotFormatOption::Png)?;
// Save the screenshot to disc
std::fs::write("screenshot.png", png_data)?;
// Run JavaScript in the page
let remote_object = elem.call_js_fn(r#"
function getIdTwice () {
// `this` is always the element that you called `call_js_fn` on
const id = this.id;
return id + id;
}
"#, vec![], false)?;
match remote_object.value {
Some(returned_string) => {
dbg!(&returned_string);
assert_eq!(returned_string, "firstHeadingfirstHeading".to_string());
}
_ => unreachable!()
};
Ok(())
}Re-exports§
pub use browser::Browser;pub use browser::LaunchOptions;pub use browser::LaunchOptionsBuilder;pub use browser::tab::Tab;pub use browser::tab::element::Element;