interop/build/web/
webdriver.rs1use 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}