Skip to main content

smoke_test/
smoke_test.rs

1//! Smoke test: headless + headful antidetect via chrome.exe + CDP.
2//!
3//! Run: CLAWSER_CHROME_PATH=out/Default/chrome.exe cargo run --manifest-path clawser-browser/Cargo.toml --example smoke_test
4
5use clawser_browser::Browser;
6use std::time::Instant;
7
8async fn test_antidetect(page: &clawser_browser::Page<'_>, label: &str) {
9    println!("\n  --- {} antidetect checks ---", label);
10    let checks: &[(&str, &str)] = &[
11        ("UA", "navigator.userAgent"),
12        ("Platform", "navigator.platform"),
13        ("Languages", "JSON.stringify(navigator.languages)"),
14        ("Cores", "navigator.hardwareConcurrency.toString()"),
15        ("webdriver", "navigator.webdriver.toString()"),
16        ("Screen", "screen.width + 'x' + screen.height"),
17        ("Timezone", "Intl.DateTimeFormat().resolvedOptions().timeZone"),
18        ("chrome", "typeof window.chrome"),
19        ("cdc_", "(function(){for(var k in window){if(/^cdc_/.test(k))return 'YES'}return 'NO'})()"),
20    ];
21    for (name, code) in checks {
22        match page.js(code).await {
23            Ok(val) => println!("    {}: {}", name, val),
24            Err(e) => println!("    {}: ERROR - {}", name, e),
25        }
26    }
27}
28
29#[tokio::main]
30async fn main() {
31    let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
32        if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
33            let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
34            let cfg = dir.join("test_profile.json");
35            if cfg.exists() { return cfg.to_string_lossy().to_string(); }
36        }
37        "out/Default/test_profile.json".to_string()
38    });
39
40    println!("=== clawser-browser smoke test (async) ===\n");
41
42    // HEADLESS
43    println!("[1] Creating HEADLESS browser...");
44    let start = Instant::now();
45    let browser = Browser::builder().headless().config(&config).build().await
46        .expect("Failed to create headless browser");
47    println!("    OK in {:?}", start.elapsed());
48
49    let page = browser.navigate("about:blank").await.expect("navigate failed");
50    let result = page.js("1 + 1").await.expect("js failed");
51    assert!(result.contains("2"));
52    test_antidetect(&page, "HEADLESS").await;
53    browser.shutdown().await.expect("shutdown failed");
54
55    // HEADFUL
56    println!("\n[2] Creating HEADFUL browser...");
57    let start = Instant::now();
58    let browser = Browser::builder().headful().config(&config).build().await
59        .expect("Failed to create headful browser");
60    println!("    OK in {:?}", start.elapsed());
61
62    let page = browser.navigate("about:blank").await.expect("navigate failed");
63    test_antidetect(&page, "HEADFUL").await;
64    browser.shutdown().await.expect("shutdown failed");
65
66    println!("\n=== ALL TESTS PASSED ===");
67}