25个版本 (13个稳定版)
新 1.0.13 | 2024年8月20日 |
---|---|
1.0.12 | 2024年7月26日 |
1.0.10 | 2024年5月9日 |
1.0.9 | 2024年1月27日 |
0.1.4 | 2019年3月20日 |
#1 in #control
19,092 每月下载量
用于 36 个crate (32个直接使用)
240KB
6K SLoC
无头Chrome
通过开发者工具协议控制无头Chrome或Chromium的高级API。它是Chrome开发者工具团队维护的Node库Puppeteer的Rust等价物。
它并不完全与Puppeteer兼容,但已经足够满足大多数浏览器测试/网络爬虫用例,并且还有一些“高级”功能,例如
- 网络请求拦截
- JavaScript覆盖率监控
- 打开隐身窗口
- 截图元素或整个页面
- 将页面保存为PDF
- “全头”浏览
- 自动下载Linux / Mac / Windows的“已知良好”Chromium二进制文件
- 扩展预加载
快速入门
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(())
}
自动获取chrome二进制文件
[dependencies]
headless_chrome = {git = "https://github.com/rust-headless-chrome/rust-headless-chrome", features = ["fetch"]}
对于更完整的示例,请参阅tests/simple.rs
和 examples
。
在运行示例之前。请确保将failure crate添加到您的Cargo项目的依赖项中
Cargo.toml
它不能做什么?
Chrome DevTools 协议非常庞大。目前,Puppeteer 支持的功能比我们多得多。其中一些缺失的功能包括
- 处理帧
- 处理文件选择器/选择器交互
- 触摸屏点击
- 模拟不同的网络条件(DevTools 可以更改延迟、吞吐量、离线状态、'连接类型')
- 查看网络请求的计时信息
- 读取 SSL 证书
- 重放 XHRs
- HTTP Basic 认证
- 检查
EventSource
(也称为服务器端事件或 SSEs) - WebSocket 检查
如果您有兴趣添加这些功能之一,但需要一些关于如何开始的建议,请通过创建问题或发送电子邮件至 alistair@sunburnt.country
来联系我。
相关项目
- fantoccini 使用 WebDriver,因此它适用于除 Chrome 以外的浏览器。它也是异步的,基于 Tokio,与
headless_chrome
不同,后者具有同步 API,并且只是使用常规线程实现。Fantoccini 的时间更长,并且经过了更多的战斗测试。它不支持 Chrome DevTools 特定功能,如 JS 覆盖率。
测试
在运行 cargo test
之前,设置以下环境变量以获取调试输出
RUST_BACKTRACE=1 RUST_LOG=headless_chrome=trace
版本号
从 v0.2.0 开始,我们试图严格遵循 SemVar。
故障排除
如果您遇到与超时相关的错误,您可能需要在内核或作为 setuid 沙盒中启用沙盒。Puppeteer 关于如何做到这一点的信息 在这里。
贡献
欢迎拉取请求和问题,即使它们只是经验报告。如果您发现任何令人沮丧或困惑的事情,请告诉我!
依赖项
~7–22MB
~363K SLoC