pub struct Browser { /* private fields */ }Expand description
A browser instance = 1 chrome.exe process + CDP connection.
Implementations§
Source§impl Browser
impl Browser
Sourcepub fn builder() -> BrowserBuilder
pub fn builder() -> BrowserBuilder
Create a builder for fine-grained control.
Examples found in repository?
examples/input_test.rs (line 20)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== Input Simulation Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22 let page = browser.navigate("https://www.google.com").await
23 .expect("navigate failed");
24
25 println!("[1] Human idle (2s)...");
26 page.human_idle(2000).await.expect("idle failed");
27
28 println!("[2] Scroll...");
29 page.scroll(300).await.expect("scroll failed");
30
31 println!("[3] Click...");
32 page.click(600.0, 300.0).await.expect("click failed");
33
34 println!("[4] Type...");
35 page.type_text("hello").await.expect("type failed");
36
37 println!("[5] Shutting down...");
38 browser.shutdown().await.expect("shutdown failed");
39
40 println!("\n=== PASSED ===");
41}More examples
examples/capture_test.rs (line 9)
8async fn main() {
9 let browser = Browser::builder()
10 .headful()
11 .random()
12 .build().await
13 .expect("failed to create browser");
14
15 let page = browser.navigate("https://www.youtube.com").await
16 .expect("navigate failed");
17
18 // Wait for page to fully load
19 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
20
21 // 1. Capture full MHTML (HTML + JS + CSS + images)
22 println!("[1] Capturing MHTML...");
23 let mhtml = page.capture_mhtml().await.expect("mhtml failed");
24 std::fs::write("youtube.mhtml", &mhtml).expect("write failed");
25 println!(" Saved youtube.mhtml ({} bytes)", mhtml.len());
26
27 // 2. Capture HTML via DOM (scripts intact, no escaping issues)
28 println!("[2] Capturing HTML via DOM...");
29 let html = page.capture_html().await.expect("html failed");
30 std::fs::write("youtube.html", &html).expect("write failed");
31 println!(" Saved youtube.html ({} bytes)", html.len());
32
33 // Verify scripts are intact
34 let script_count = html.matches("<script").count();
35 println!(" <script> tags found: {}", script_count);
36
37 browser.shutdown().await.expect("shutdown failed");
38 println!("\nDone. Open youtube.mhtml in Chrome to verify.");
39}examples/rotate_test.rs (line 14)
8async fn main() {
9 println!("=== Profile Rotation Test (async) ===\n");
10
11 for i in 0..3 {
12 println!("--- Browser {} (random profile) ---", i + 1);
13
14 let browser = Browser::builder().headful().random().build().await
15 .expect("failed to create browser");
16
17 let page = browser.navigate("about:blank").await.expect("navigate failed");
18
19 let cores = page.js("navigator.hardwareConcurrency.toString()").await.unwrap_or_default();
20 let screen = page.js("screen.width+'x'+screen.height").await.unwrap_or_default();
21 let tz = page.js("Intl.DateTimeFormat().resolvedOptions().timeZone").await.unwrap_or_default();
22 let langs = page.js("JSON.stringify(navigator.languages)").await.unwrap_or_default();
23 let gl = page.js(
24 "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"
25 ).await.unwrap_or_default();
26
27 println!(" Cores: {} Screen: {}", cores, screen);
28 println!(" GPU: {}", gl);
29 println!(" TZ: {} Langs: {}", tz, langs);
30
31 browser.shutdown().await.expect("shutdown failed");
32 println!();
33 }
34
35 println!("=== DONE ===");
36}examples/smoke_test.rs (line 45)
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}examples/youtube_test.rs (line 20)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== YouTube Headful Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22
23 let page = browser.navigate("https://www.youtube.com").await
24 .expect("failed to navigate");
25
26 // Simulate human behavior
27 page.human_idle(1500).await.expect("idle failed");
28 page.scroll(200).await.expect("scroll failed");
29
30 println!("Title: {}", page.js("document.title").await.unwrap_or_default());
31 println!("URL: {}", page.js("window.location.href").await.unwrap_or_default());
32
33 let checks: &[(&str, &str)] = &[
34 ("UA", "navigator.userAgent"),
35 ("Cores", "navigator.hardwareConcurrency.toString()"),
36 ("Memory", "(navigator.deviceMemory||'?').toString()"),
37 ("webdriver", "navigator.webdriver.toString()"),
38 ("Screen", "screen.width+'x'+screen.height"),
39 ("Timezone", "Intl.DateTimeFormat().resolvedOptions().timeZone"),
40 ("GPU", "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"),
41 ];
42 for (name, code) in checks {
43 println!("{}: {}", name, page.js(code).await.unwrap_or_default());
44 }
45
46 browser.shutdown().await.expect("shutdown failed");
47 println!("\nDone.");
48}Navigate the current page to a URL.
Examples found in repository?
examples/input_test.rs (line 22)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== Input Simulation Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22 let page = browser.navigate("https://www.google.com").await
23 .expect("navigate failed");
24
25 println!("[1] Human idle (2s)...");
26 page.human_idle(2000).await.expect("idle failed");
27
28 println!("[2] Scroll...");
29 page.scroll(300).await.expect("scroll failed");
30
31 println!("[3] Click...");
32 page.click(600.0, 300.0).await.expect("click failed");
33
34 println!("[4] Type...");
35 page.type_text("hello").await.expect("type failed");
36
37 println!("[5] Shutting down...");
38 browser.shutdown().await.expect("shutdown failed");
39
40 println!("\n=== PASSED ===");
41}More examples
examples/capture_test.rs (line 15)
8async fn main() {
9 let browser = Browser::builder()
10 .headful()
11 .random()
12 .build().await
13 .expect("failed to create browser");
14
15 let page = browser.navigate("https://www.youtube.com").await
16 .expect("navigate failed");
17
18 // Wait for page to fully load
19 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
20
21 // 1. Capture full MHTML (HTML + JS + CSS + images)
22 println!("[1] Capturing MHTML...");
23 let mhtml = page.capture_mhtml().await.expect("mhtml failed");
24 std::fs::write("youtube.mhtml", &mhtml).expect("write failed");
25 println!(" Saved youtube.mhtml ({} bytes)", mhtml.len());
26
27 // 2. Capture HTML via DOM (scripts intact, no escaping issues)
28 println!("[2] Capturing HTML via DOM...");
29 let html = page.capture_html().await.expect("html failed");
30 std::fs::write("youtube.html", &html).expect("write failed");
31 println!(" Saved youtube.html ({} bytes)", html.len());
32
33 // Verify scripts are intact
34 let script_count = html.matches("<script").count();
35 println!(" <script> tags found: {}", script_count);
36
37 browser.shutdown().await.expect("shutdown failed");
38 println!("\nDone. Open youtube.mhtml in Chrome to verify.");
39}examples/rotate_test.rs (line 17)
8async fn main() {
9 println!("=== Profile Rotation Test (async) ===\n");
10
11 for i in 0..3 {
12 println!("--- Browser {} (random profile) ---", i + 1);
13
14 let browser = Browser::builder().headful().random().build().await
15 .expect("failed to create browser");
16
17 let page = browser.navigate("about:blank").await.expect("navigate failed");
18
19 let cores = page.js("navigator.hardwareConcurrency.toString()").await.unwrap_or_default();
20 let screen = page.js("screen.width+'x'+screen.height").await.unwrap_or_default();
21 let tz = page.js("Intl.DateTimeFormat().resolvedOptions().timeZone").await.unwrap_or_default();
22 let langs = page.js("JSON.stringify(navigator.languages)").await.unwrap_or_default();
23 let gl = page.js(
24 "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"
25 ).await.unwrap_or_default();
26
27 println!(" Cores: {} Screen: {}", cores, screen);
28 println!(" GPU: {}", gl);
29 println!(" TZ: {} Langs: {}", tz, langs);
30
31 browser.shutdown().await.expect("shutdown failed");
32 println!();
33 }
34
35 println!("=== DONE ===");
36}examples/smoke_test.rs (line 49)
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}examples/youtube_test.rs (line 23)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== YouTube Headful Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22
23 let page = browser.navigate("https://www.youtube.com").await
24 .expect("failed to navigate");
25
26 // Simulate human behavior
27 page.human_idle(1500).await.expect("idle failed");
28 page.scroll(200).await.expect("scroll failed");
29
30 println!("Title: {}", page.js("document.title").await.unwrap_or_default());
31 println!("URL: {}", page.js("window.location.href").await.unwrap_or_default());
32
33 let checks: &[(&str, &str)] = &[
34 ("UA", "navigator.userAgent"),
35 ("Cores", "navigator.hardwareConcurrency.toString()"),
36 ("Memory", "(navigator.deviceMemory||'?').toString()"),
37 ("webdriver", "navigator.webdriver.toString()"),
38 ("Screen", "screen.width+'x'+screen.height"),
39 ("Timezone", "Intl.DateTimeFormat().resolvedOptions().timeZone"),
40 ("GPU", "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"),
41 ];
42 for (name, code) in checks {
43 println!("{}: {}", name, page.js(code).await.unwrap_or_default());
44 }
45
46 browser.shutdown().await.expect("shutdown failed");
47 println!("\nDone.");
48}Get cookies for a URL (or all if empty).
Sourcepub async fn screenshot(&self) -> Result<Vec<u8>>
pub async fn screenshot(&self) -> Result<Vec<u8>>
Take a screenshot (PNG bytes).
Sourcepub async fn shutdown(self) -> Result<()>
pub async fn shutdown(self) -> Result<()>
Shut down the browser process cleanly.
Examples found in repository?
examples/input_test.rs (line 38)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== Input Simulation Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22 let page = browser.navigate("https://www.google.com").await
23 .expect("navigate failed");
24
25 println!("[1] Human idle (2s)...");
26 page.human_idle(2000).await.expect("idle failed");
27
28 println!("[2] Scroll...");
29 page.scroll(300).await.expect("scroll failed");
30
31 println!("[3] Click...");
32 page.click(600.0, 300.0).await.expect("click failed");
33
34 println!("[4] Type...");
35 page.type_text("hello").await.expect("type failed");
36
37 println!("[5] Shutting down...");
38 browser.shutdown().await.expect("shutdown failed");
39
40 println!("\n=== PASSED ===");
41}More examples
examples/capture_test.rs (line 37)
8async fn main() {
9 let browser = Browser::builder()
10 .headful()
11 .random()
12 .build().await
13 .expect("failed to create browser");
14
15 let page = browser.navigate("https://www.youtube.com").await
16 .expect("navigate failed");
17
18 // Wait for page to fully load
19 tokio::time::sleep(std::time::Duration::from_secs(3)).await;
20
21 // 1. Capture full MHTML (HTML + JS + CSS + images)
22 println!("[1] Capturing MHTML...");
23 let mhtml = page.capture_mhtml().await.expect("mhtml failed");
24 std::fs::write("youtube.mhtml", &mhtml).expect("write failed");
25 println!(" Saved youtube.mhtml ({} bytes)", mhtml.len());
26
27 // 2. Capture HTML via DOM (scripts intact, no escaping issues)
28 println!("[2] Capturing HTML via DOM...");
29 let html = page.capture_html().await.expect("html failed");
30 std::fs::write("youtube.html", &html).expect("write failed");
31 println!(" Saved youtube.html ({} bytes)", html.len());
32
33 // Verify scripts are intact
34 let script_count = html.matches("<script").count();
35 println!(" <script> tags found: {}", script_count);
36
37 browser.shutdown().await.expect("shutdown failed");
38 println!("\nDone. Open youtube.mhtml in Chrome to verify.");
39}examples/rotate_test.rs (line 31)
8async fn main() {
9 println!("=== Profile Rotation Test (async) ===\n");
10
11 for i in 0..3 {
12 println!("--- Browser {} (random profile) ---", i + 1);
13
14 let browser = Browser::builder().headful().random().build().await
15 .expect("failed to create browser");
16
17 let page = browser.navigate("about:blank").await.expect("navigate failed");
18
19 let cores = page.js("navigator.hardwareConcurrency.toString()").await.unwrap_or_default();
20 let screen = page.js("screen.width+'x'+screen.height").await.unwrap_or_default();
21 let tz = page.js("Intl.DateTimeFormat().resolvedOptions().timeZone").await.unwrap_or_default();
22 let langs = page.js("JSON.stringify(navigator.languages)").await.unwrap_or_default();
23 let gl = page.js(
24 "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"
25 ).await.unwrap_or_default();
26
27 println!(" Cores: {} Screen: {}", cores, screen);
28 println!(" GPU: {}", gl);
29 println!(" TZ: {} Langs: {}", tz, langs);
30
31 browser.shutdown().await.expect("shutdown failed");
32 println!();
33 }
34
35 println!("=== DONE ===");
36}examples/smoke_test.rs (line 53)
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}examples/youtube_test.rs (line 46)
8async fn main() {
9 let config = std::env::var("CLAWSER_CONFIG").unwrap_or_else(|_| {
10 if let Ok(chrome) = std::env::var("CLAWSER_CHROME_PATH") {
11 let dir = std::path::Path::new(&chrome).parent().unwrap_or(std::path::Path::new("."));
12 let cfg = dir.join("test_profile.json");
13 if cfg.exists() { return cfg.to_string_lossy().to_string(); }
14 }
15 "out/Default/test_profile.json".to_string()
16 });
17
18 println!("=== YouTube Headful Test (async) ===\n");
19
20 let browser = Browser::builder().headful().config(&config).build().await
21 .expect("failed to create browser");
22
23 let page = browser.navigate("https://www.youtube.com").await
24 .expect("failed to navigate");
25
26 // Simulate human behavior
27 page.human_idle(1500).await.expect("idle failed");
28 page.scroll(200).await.expect("scroll failed");
29
30 println!("Title: {}", page.js("document.title").await.unwrap_or_default());
31 println!("URL: {}", page.js("window.location.href").await.unwrap_or_default());
32
33 let checks: &[(&str, &str)] = &[
34 ("UA", "navigator.userAgent"),
35 ("Cores", "navigator.hardwareConcurrency.toString()"),
36 ("Memory", "(navigator.deviceMemory||'?').toString()"),
37 ("webdriver", "navigator.webdriver.toString()"),
38 ("Screen", "screen.width+'x'+screen.height"),
39 ("Timezone", "Intl.DateTimeFormat().resolvedOptions().timeZone"),
40 ("GPU", "(function(){var c=document.createElement('canvas');var g=c.getContext('webgl');if(!g)return'no';var d=g.getExtension('WEBGL_debug_renderer_info');return d?g.getParameter(d.UNMASKED_RENDERER_WEBGL):'no'})()"),
41 ];
42 for (name, code) in checks {
43 println!("{}: {}", name, page.js(code).await.unwrap_or_default());
44 }
45
46 browser.shutdown().await.expect("shutdown failed");
47 println!("\nDone.");
48}Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Browser
impl !RefUnwindSafe for Browser
impl Send for Browser
impl Sync for Browser
impl Unpin for Browser
impl UnsafeUnpin for Browser
impl !UnwindSafe for Browser
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more