captchaforge 0.2.36

[DO NOT USE — UNDER ACTIVE DEVELOPMENT, NOT PRODUCTION-READY] Captcha solver scaffolding for chromiumoxide-driven browsers. The architecture is in place (vendor solvers, retry-loop iframe walking, VLM provider abstraction, real-WAF bench harness) but the live-vendor success rate is still 0% — Cloudflare Turnstile / hCaptcha / reCAPTCHA detect us at a TLS / CDP fingerprint layer that no flag-based stealth has cleared. Watch the repo; do not depend on this for any real workload.
Documentation
//! Concurrent browser operation tests.

mod common;

#[tokio::test]
async fn two_browsers_independent() {
    let mut b1 = common::launch_browser().await;
    let mut b2 = common::launch_browser().await;

    let p1 = b1.new_page("about:blank").await.unwrap();
    let p2 = b2.new_page("about:blank").await.unwrap();

    let _: String = p1
        .evaluate("document.title = 'B1'; 'done'")
        .await
        .unwrap()
        .into_value()
        .unwrap();
    let _: String = p2
        .evaluate("document.title = 'B2'; 'done'")
        .await
        .unwrap()
        .into_value()
        .unwrap();

    let t1: String = p1
        .evaluate("document.title")
        .await
        .unwrap()
        .into_value()
        .unwrap();
    let t2: String = p2
        .evaluate("document.title")
        .await
        .unwrap()
        .into_value()
        .unwrap();

    assert_eq!(t1, "B1");
    assert_eq!(t2, "B2");

    b1.close().await.unwrap();
    b2.close().await.unwrap();
}

#[tokio::test]
async fn sequential_pages_same_browser_isolated() {
    let mut browser = common::launch_browser().await;

    let p1 = browser.new_page("about:blank").await.unwrap();
    let _: String = p1
        .evaluate("document.title = 'First'; 'done'")
        .await
        .unwrap()
        .into_value()
        .unwrap();

    let p2 = browser.new_page("about:blank").await.unwrap();
    let _: String = p2
        .evaluate("document.title = 'Second'; 'done'")
        .await
        .unwrap()
        .into_value()
        .unwrap();

    let t1: String = p1
        .evaluate("document.title")
        .await
        .unwrap()
        .into_value()
        .unwrap();
    let t2: String = p2
        .evaluate("document.title")
        .await
        .unwrap()
        .into_value()
        .unwrap();

    assert_eq!(t1, "First");
    assert_eq!(t2, "Second");

    browser.close().await.unwrap();
}

#[tokio::test]
async fn concurrent_evaluates_on_same_page() {
    let mut browser = common::launch_browser().await;
    let page = browser.new_page("about:blank").await.unwrap();

    let f1 = page.evaluate("1 + 1");
    let f2 = page.evaluate("2 + 2");
    let f3 = page.evaluate("3 + 3");

    let (r1, r2, r3) = tokio::join!(f1, f2, f3);

    assert_eq!(r1.unwrap().into_value::<i32>().unwrap(), 2);
    assert_eq!(r2.unwrap().into_value::<i32>().unwrap(), 4);
    assert_eq!(r3.unwrap().into_value::<i32>().unwrap(), 6);

    browser.close().await.unwrap();
}