thirtyfour-stealth 0.1.3

A stealthy, undetected implementation of thirtyfour for web automation
Documentation
#[cfg(any(target_os = "linux", target_os = "macos"))]
use std::os::unix::fs::PermissionsExt;
use std::{
    error::Error,
    process::{Child, Command, Stdio},
};

pub fn spawn_chromedriver(
    chromedriver_executable: &str,
    port: u16,
) -> Result<Child, Box<dyn Error + Send + Sync>> {
    #[cfg(any(target_os = "linux", target_os = "macos"))]
    {
        let mut perms = std::fs::metadata(chromedriver_executable)?.permissions();
        perms.set_mode(0o755);
        std::fs::set_permissions(chromedriver_executable, perms)?;
    }
    let mut chrome_driver_handle = Command::new(format!("./{}", chromedriver_executable))
        .stdout(Stdio::piped())
        .arg(format!("--port={}", port))
        .spawn()
        .expect("Failed to start chromedriver!");
    let chrome_driver_stdout = chrome_driver_handle
        .stdout
        .take()
        .expect("Chromedriver process has no stdout.");
    std::thread::Builder::new()
        .name("ChromeDriverThread".to_string())
        .spawn(|| {
            use std::io::BufRead;
            let lines = std::io::BufReader::new(chrome_driver_stdout).lines();
            for line in lines {
                tracing::info!("{}", line.unwrap());
            }
        })?;
    Ok(chrome_driver_handle)
}