interop/build/web/
webdriver.rs

1use crate::util::RunningProcess;
2use color_eyre::eyre::Result;
3
4pub(crate) async fn start_webdriver_chrome(addr: &std::net::SocketAddr) -> Result<tokio::process::Child> {
5    let chromedriver_path = std::env::var_os("CHROMEDRIVER_PATH").expect("CHROMEDRIVER_PATH must be set");
6    Ok(tokio::process::Command::new(chromedriver_path)
7        .arg(format!("--port={}", addr.port()))
8        .stdout(std::process::Stdio::null())
9        .stderr(std::process::Stdio::null())
10        .spawn()?)
11}
12
13pub(crate) async fn setup_browser(
14    client: &std::net::SocketAddr,
15    server: &std::net::SocketAddr,
16    folder: &str,
17) -> Result<fantoccini::Client> {
18    let spinner = RunningProcess::new("Starting Fantoccini remote browser...", false);
19    let mut caps_json = serde_json::json!({
20        "goog:chromeOptions": {
21            "args": [
22                "headless=shell",
23                "disable-dev-shm-usage",
24                "no-sandbox"
25            ]
26        }
27    });
28
29    if let Ok(chrome_path) = std::env::var("CHROME_PATH") {
30        caps_json["goog:chromeOptions"]["binary"] = chrome_path.into();
31    }
32
33    let serde_json::Value::Object(caps) = caps_json else {
34        unreachable!("`serde_json::json!()` did not produce an object when provided an object. Something is broken.")
35    };
36
37    let browser = fantoccini::ClientBuilder::native()
38        .capabilities(caps)
39        .connect(&format!("http://{client}"))
40        .await?;
41    browser.goto(&format!("http://{server}/{folder}/index.html")).await?;
42
43    spinner.success("Browser [OK]");
44    Ok(browser)
45}