Fix Chrome opening visibly instead of headless
- Add detect_chromedriver_for_testing() to auto-detect Chrome for Testing chromedriver binary at ~/.chrome-for-testing/ (arm64, x64, linux64) - Add tilde expansion for chrome_binary and chromedriver_binary config paths - Add --no-first-run, --no-default-browser-check, --disable-popup-blocking Chrome flags to prevent UI popups in headless mode
This commit is contained in:
@@ -185,6 +185,10 @@ impl ChromeDriver {
|
|||||||
Value::String("--lang=en-US,en".to_string()),
|
Value::String("--lang=en-US,en".to_string()),
|
||||||
// Stealth: Disable extensions to avoid detection
|
// Stealth: Disable extensions to avoid detection
|
||||||
Value::String("--disable-extensions".to_string()),
|
Value::String("--disable-extensions".to_string()),
|
||||||
|
// Prevent first-run UI and default browser check popups
|
||||||
|
Value::String("--no-first-run".to_string()),
|
||||||
|
Value::String("--no-default-browser-check".to_string()),
|
||||||
|
Value::String("--disable-popup-blocking".to_string()),
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,34 @@ fn detect_chrome_for_testing() -> Option<String> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Auto-detect ChromeDriver for Testing binary at ~/.chrome-for-testing/.
|
||||||
|
///
|
||||||
|
/// When no `chromedriver_binary` is configured, this checks for a Chrome for
|
||||||
|
/// Testing chromedriver installation which is version-locked to the matching
|
||||||
|
/// Chrome for Testing browser, avoiding version mismatch errors.
|
||||||
|
fn detect_chromedriver_for_testing() -> Option<String> {
|
||||||
|
let home_str = std::env::var("HOME").ok()?;
|
||||||
|
let home = std::path::PathBuf::from(home_str);
|
||||||
|
let cft_dir = home.join(".chrome-for-testing");
|
||||||
|
|
||||||
|
// Check platform-specific directories
|
||||||
|
let candidates = [
|
||||||
|
cft_dir.join("chromedriver-mac-arm64/chromedriver"),
|
||||||
|
cft_dir.join("chromedriver-mac-x64/chromedriver"),
|
||||||
|
// Linux paths
|
||||||
|
cft_dir.join("chromedriver-linux64/chromedriver"),
|
||||||
|
];
|
||||||
|
|
||||||
|
for candidate in &candidates {
|
||||||
|
if candidate.exists() {
|
||||||
|
debug!("Auto-detected ChromeDriver for Testing: {}", candidate.display());
|
||||||
|
return Some(candidate.to_string_lossy().into_owned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
// Port checking helpers
|
// Port checking helpers
|
||||||
// ─────────────────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
@@ -170,8 +198,12 @@ async fn start_safari_driver<W: UiWriter>(ctx: &ToolContext<'_, W>) -> Result<St
|
|||||||
async fn start_chrome_driver<W: UiWriter>(ctx: &ToolContext<'_, W>) -> Result<String> {
|
async fn start_chrome_driver<W: UiWriter>(ctx: &ToolContext<'_, W>) -> Result<String> {
|
||||||
let port = ctx.config.webdriver.chrome_port;
|
let port = ctx.config.webdriver.chrome_port;
|
||||||
|
|
||||||
// Resolve Chrome binary: use configured path, or auto-detect Chrome for Testing
|
// Resolve Chrome binary: use configured path (with tilde expansion), or auto-detect Chrome for Testing
|
||||||
let chrome_binary = ctx.config.webdriver.chrome_binary.clone()
|
let chrome_binary = ctx.config.webdriver.chrome_binary.as_deref()
|
||||||
|
.map(|p| {
|
||||||
|
let expanded = shellexpand::tilde(p);
|
||||||
|
expanded.into_owned()
|
||||||
|
})
|
||||||
.or_else(|| detect_chrome_for_testing());
|
.or_else(|| detect_chrome_for_testing());
|
||||||
let chrome_binary_ref = chrome_binary.as_deref();
|
let chrome_binary_ref = chrome_binary.as_deref();
|
||||||
|
|
||||||
@@ -201,11 +233,14 @@ async fn start_chrome_driver<W: UiWriter>(ctx: &ToolContext<'_, W>) -> Result<St
|
|||||||
// If connection failed, fall through to start a new one
|
// If connection failed, fall through to start a new one
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use configured chromedriver binary or fall back to 'chromedriver' in PATH
|
// Resolve chromedriver binary: use configured path (with tilde expansion), auto-detect Chrome for Testing, or fall back to PATH
|
||||||
let chromedriver_cmd = ctx
|
let chromedriver_auto = ctx.config.webdriver.chromedriver_binary.as_deref()
|
||||||
.config
|
.map(|p| {
|
||||||
.webdriver
|
let expanded = shellexpand::tilde(p);
|
||||||
.chromedriver_binary
|
expanded.into_owned()
|
||||||
|
})
|
||||||
|
.or_else(|| detect_chromedriver_for_testing());
|
||||||
|
let chromedriver_cmd = chromedriver_auto
|
||||||
.as_deref()
|
.as_deref()
|
||||||
.unwrap_or("chromedriver");
|
.unwrap_or("chromedriver");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user