main.rs
1 #![allow(dead_code)] 2 3 mod actor; 4 mod locators; 5 mod scenarios; 6 mod tasks; 7 8 use actor::Actor; 9 use playwright_rs::{BrowserContextOptions, LaunchOptions, Playwright}; 10 use tasks::Navigate; 11 12 macro_rules! scenario { 13 ($actor:expr, $name:expr, $run:path, $p:expr, $f:expr) => {{ 14 match $run(&$actor).await { 15 Ok(()) => { 16 $p += 1; 17 println!(" ✓ {}", $name); 18 } 19 Err(e) => { 20 $f += 1; 21 eprintln!(" ✗ {}: {e}", $name); 22 } 23 } 24 }}; 25 } 26 27 #[tokio::main] 28 async fn main() { 29 let playwright = Playwright::launch().await.expect("launch playwright"); 30 let browser = playwright 31 .chromium() 32 .launch_with_options(LaunchOptions::default().headless(false)) 33 .await 34 .expect("launch browser"); 35 36 let context = browser 37 .new_context_with_options( 38 BrowserContextOptions::builder() 39 .permissions(vec![ 40 "clipboard-read".into(), 41 "clipboard-write".into(), 42 "notifications".into(), 43 ]) 44 .build(), 45 ) 46 .await 47 .expect("create context"); 48 let page = context.new_page().await.expect("new page"); 49 let actor = Actor::new(page); 50 actor.attempts_to(Navigate::to("/")).await.expect("navigate to app"); 51 52 let mut passed = 0u32; 53 let mut failed = 0u32; 54 55 scenario!(actor, "navigation", scenarios::navigation::run, passed, failed); 56 scenario!(actor, "layout", scenarios::layout::run, passed, failed); 57 scenario!(actor, "connected home", scenarios::connected_home::run, passed, failed); 58 scenario!(actor, "status badge", scenarios::status_badge::run, passed, failed); 59 scenario!(actor, "network sheet", scenarios::network_sheet::run, passed, failed); 60 scenario!(actor, "command palette", scenarios::command_palette::run, passed, failed); 61 scenario!(actor, "sleep panel", scenarios::sleep_panel::run, passed, failed); 62 scenario!(actor, "filesystem panel", scenarios::filesystem_panel::run, passed, failed); 63 scenario!(actor, "measurement panel", scenarios::measurement_panel::run, passed, failed); 64 scenario!(actor, "flash panel", scenarios::flash_panel::run, passed, failed); 65 scenario!(actor, "not found", scenarios::not_found::run, passed, failed); 66 67 context.close().await.ok(); 68 browser.close().await.ok(); 69 70 println!("\n{passed} passed, {failed} failed"); 71 if failed > 0 { 72 std::process::exit(1); 73 } 74 }