Headless Chrome
Puppeteer for Rust. It looks a little something like this:
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
- Opening incognito windows
- 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 ;
assert!;
For fuller examples, take a look at tests/simple.rs
and examples/real_world.rs
.
What can't it do?
The Chrome DevTools Protocol is huge. Currently, Puppeteer supports way more of it than we do. Some of the missing features include:
- Manipulating cookies
- Dealing with frames
- Handling file picker / chooser interactions
- Tapping touchscreens
Related crates
- fantoccini uses WebDriver, so it works with browsers other than Chrome. It's also asynchronous and based on Tokio, unlike
headless_chrome
, which has a synchronous API and is just implemented using plain old threads. Fantoccini has also been around longer and is more battle-tested. It doesn't support Chrome DevTools-specific functionality like JS Coverage.
Testing
For debug output, set these environment variables before running cargo test
:
RUST_BACKTRACE=1 RUST_LOG=headless_chrome=trace
Version numbers
Starting with v0.2.0, we're trying to follow SemVar strictly.
Troubleshooting
If you get errors related to timeouts, you likely need to enable sandboxing either in the kernel or as a setuid sandbox. Puppeteer has some information about how to do that here
By default, headless_chrome
will download a compatible version of chrome to XDG_DATA_HOME
(or equivalent on Windows/Mac). This behaviour can be optionally turned off, and you can use the system version of chrome (assuming you have chrome installed) by disabling the default feature in your Cargo.toml
:
[]
= false
Missing features
- Frame / iframe support
window.alert
handlers- Frankly, most of what's possible using the Chrome DevTools Protocol
Contributing
Pull requests and issues are most welcome, even if they're just experience reports. If you find anything frustrating or confusing, let me know!