allwright-core 0.0.61

Lightweight allwright engine core with shared client and transport APIs.
Documentation
use allwright::{LaunchOptions, launch_firefox, set_server_addr, shutdown};

const DEFAULT_WEB_URL: &str = "https://themoderninternet.vercel.app";
const DEFAULT_WEB_ENTRY_SELECTOR: &str = "xpath=//div[contains(@class,'card')][.//h2[normalize-space()='Form Inputs']]//button[normalize-space()='Visit page']";
const DEFAULT_WEB_HEADING_SELECTOR: &str = "xpath=//h1[text()=\"Form Inputs\"]";
const DEFAULT_WEB_HEADING_TEXT: &str = "Form Inputs";

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    set_server_addr(
        &std::env::var("ALLWRIGHT_SERVER_ADDR").unwrap_or_else(|_| "127.0.0.1:50051".to_string()),
    )?;

    let browser = launch_firefox(LaunchOptions {
        browser_binary: std::env::var("ALLWRIGHT_BROWSER_BINARY").ok(),
        ..Default::default()
    })
    .await?;

    let result = async {
        let page = browser.page();
        page.navigate(
            std::env::var("ALLWRIGHT_WEB_URL").unwrap_or_else(|_| DEFAULT_WEB_URL.to_string()),
        )
        .await?;
        page.click(
            &std::env::var("ALLWRIGHT_WEB_ENTRY_SELECTOR")
                .unwrap_or_else(|_| DEFAULT_WEB_ENTRY_SELECTOR.to_string()),
        )
        .await?;
        page.wait_for_selector_with_options(
            &std::env::var("ALLWRIGHT_WEB_HEADING_SELECTOR")
                .unwrap_or_else(|_| DEFAULT_WEB_HEADING_SELECTOR.to_string()),
            allwright::WaitForSelectorOptions {
                visible: Some(true),
                timeout_ms: Some(10_000),
            },
        )
        .await?;
        let heading = page
            .text_content(
                &std::env::var("ALLWRIGHT_WEB_HEADING_SELECTOR")
                    .unwrap_or_else(|_| DEFAULT_WEB_HEADING_SELECTOR.to_string()),
            )
            .await?;
        let expected_heading = std::env::var("ALLWRIGHT_WEB_HEADING_TEXT")
            .unwrap_or_else(|_| DEFAULT_WEB_HEADING_TEXT.to_string());
        if !heading.text.contains(&expected_heading) {
            return Err(format!(
                "expected heading to contain {expected_heading:?}, got {:?}",
                heading.text
            )
            .into());
        }
        println!("[rust-web-basic] heading={:?}", heading.text);
        Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
    }
    .await;

    browser.close().await?;
    shutdown().await;
    result
}