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

Download history 3085/week @ 2024-05-03 3995/week @ 2024-05-10 3629/week @ 2024-05-17 3117/week @ 2024-05-24 3922/week @ 2024-05-31 3753/week @ 2024-06-07 4049/week @ 2024-06-14 3926/week @ 2024-06-21 4047/week @ 2024-06-28 3407/week @ 2024-07-05 3522/week @ 2024-07-12 3727/week @ 2024-07-19 4004/week @ 2024-07-26 4284/week @ 2024-08-02 4798/week @ 2024-08-09 5102/week @ 2024-08-16

19,092 每月下载量
用于 36 个crate (32个直接使用)

MIT 许可证

240KB
6K SLoC

无头Chrome

Build Status Crate API Discord channel

通过开发者工具协议控制无头Chrome或Chromium的高级API。它是Chrome开发者工具团队维护的Node库Puppeteer的Rust等价物。

它并不完全与Puppeteer兼容,但已经足够满足大多数浏览器测试/网络爬虫用例,并且还有一些“高级”功能,例如

快速入门

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.rsexamples

在运行示例之前。请确保将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