use playwright_rs::protocol::{BrowserContextOptions, Playwright, Viewport};
use std::error::Error;
use tempfile::TempDir;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
tracing_subscriber::fmt()
.with_env_filter("playwright=debug,persistent_context=info")
.init();
let temp_dir = TempDir::new()?;
let user_data_dir = temp_dir.path().to_str().unwrap();
println!("=== Example 1: Basic Persistent Context ===");
example_basic_persistent_context(user_data_dir).await?;
println!("\n=== Example 2: App Mode (Standalone Window) ===");
example_app_mode(user_data_dir).await?;
println!("\n=== Example 3: Storage Persistence ===");
example_storage_persistence(user_data_dir).await?;
println!("\n=== Example 4: Custom Options ===");
example_custom_options(user_data_dir).await?;
println!("\nAll examples completed successfully!");
Ok(())
}
async fn example_basic_persistent_context(user_data_dir: &str) -> Result<(), Box<dyn Error>> {
let playwright = Playwright::launch().await?;
let chromium = playwright.chromium();
let context = chromium.launch_persistent_context(user_data_dir).await?;
let page = context.new_page().await?;
page.goto("https://example.com", None).await?;
println!(" ✓ Navigated to example.com with persistent context");
context.close().await?;
Ok(())
}
async fn example_app_mode(user_data_dir: &str) -> Result<(), Box<dyn Error>> {
let playwright = Playwright::launch().await?;
let chromium = playwright.chromium();
let options = BrowserContextOptions::builder()
.args(vec!["--app=https://example.com".to_string()])
.headless(false) .viewport(Viewport {
width: 1280,
height: 720,
})
.build();
let context = chromium
.launch_persistent_context_with_options(user_data_dir, options)
.await?;
println!(" ✓ Launched browser in app mode (standalone window)");
println!(" Note: Browser opens directly to the URL without address bar");
let pages = context.pages();
if !pages.is_empty() {
let initial_page = &pages[0];
println!(
" ✓ Accessed initial app mode page at: {}",
initial_page.url()
);
} else {
println!(" ⚠ No initial page found (this shouldn't happen in app mode)");
}
context.close().await?;
Ok(())
}
async fn example_storage_persistence(user_data_dir: &str) -> Result<(), Box<dyn Error>> {
let playwright = Playwright::launch().await?;
let chromium = playwright.chromium();
{
let context = chromium.launch_persistent_context(user_data_dir).await?;
let page = context.new_page().await?;
page.goto("https://example.com", None).await?;
page.evaluate_expression(
"localStorage.setItem('user_pref', 'dark_mode'); localStorage.setItem('last_visit', Date.now().toString());",
)
.await?;
println!(" ✓ Session 1: Stored user preferences");
context.close().await?;
}
{
let context = chromium.launch_persistent_context(user_data_dir).await?;
let page = context.new_page().await?;
page.goto("https://example.com", None).await?;
let user_pref = page
.evaluate_value("localStorage.getItem('user_pref')")
.await?;
let last_visit = page
.evaluate_value("localStorage.getItem('last_visit')")
.await?;
println!(" ✓ Session 2: Retrieved stored data");
println!(" - User preference: {}", user_pref);
println!(" - Last visit timestamp: {}", last_visit);
println!(" ✓ Storage persisted across browser sessions!");
context.close().await?;
}
Ok(())
}
async fn example_custom_options(user_data_dir: &str) -> Result<(), Box<dyn Error>> {
let playwright = Playwright::launch().await?;
let chromium = playwright.chromium();
let options = BrowserContextOptions::builder()
.viewport(Viewport {
width: 1920,
height: 1080,
})
.locale("en-US".to_string())
.timezone_id("America/New_York".to_string())
.headless(true)
.args(vec!["--no-sandbox".to_string()])
.build();
let context = chromium
.launch_persistent_context_with_options(user_data_dir, options)
.await?;
let page = context.new_page().await?;
page.goto("https://example.com", None).await?;
println!(" ✓ Launched with custom options:");
println!(" - Viewport: 1920x1080");
println!(" - Locale: en-US");
println!(" - Timezone: America/New_York");
println!(" - Headless mode with custom args");
context.close().await?;
Ok(())
}