TL;DR
rust-headless-chromeを動かしてみた、という話です。
Puppeteerを使えば同等のことはできるし色々と道具も揃ってはいるのですが、せっかくRustからChromeにWebSocketでつなぐインターフェースを作ってくれた方がいらしたので、試しに触ってみました。
テスト用のcrateを作る
Rust使いにはおなじみのやつです。
> cargo init headless_chrome_test --bin
Cargo.tomlを編集
これもまたおなじみのやつです。
dependenciesにheadless_chromeを追加します。
failureも後々使いたいので、ついでに追加しておきます。
[package]
name = "headless_chrome_test"
version = "0.1.0"
authors = ["Yuki Mitsui"]
edition = "2018"
[dependencies]
headless_chrome = "0.1.1"
failure = "0.1"
サンプルを動かす
rust-headless-chromeに掲載されているテスト用のコードは「こんな感じで書くんだよ!」と書かれてはいますが、実際に動かすにはもうひと手間かける必要があります。とはいえmain()
を足したりするだけなので、これもおなじみのやつです。
Windowsで試してみたので、バイナリのパスを変更しています。
Issuesを見ると、将来的には動作している環境にあわせてデフォルトのパス名をある程度変更してくれるつもりはありそうでした。
headless: true
にするとwait_for_element()
で固まってしまったので、headless: false
にしています。
use std::result::Result;
use failure::Error;
use headless_chrome::browser::{Browser, LaunchOptions};
fn main() -> Result<(), Error> {
let browser = Browser::new(LaunchOptions {
headless: false,
path: "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
..Default::default()
})?;
let tab = browser.wait_for_initial_tab()?;
tab.navigate_to("https://www.wikipedia.org/")?;
tab.wait_for_element("input#searchInput")?.click()?;
tab.type_str("WebKit")?;
tab.press_key("Enter")?;
tab.wait_for_element("#firstHeading")?;
assert_eq!(true, tab.get_url().ends_with("WebKit"));
Ok(())
}
動かす
cargo run
しましょう。headless: false
を指定しているので、WikipediaにアクセスしてWebKitを検索している様子が見て取れます。