use playwright_rs::protocol::Playwright;
use playwright_rs::{expect, expect_page};
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let playwright = Playwright::launch().await?;
let browser = playwright.chromium().launch().await?;
let page = browser.new_page().await?;
page.goto("https://example.com", None).await?;
println!("✓ Navigated to example.com");
let heading = page.locator("h1").await;
expect(heading.clone()).to_be_visible().await?;
println!("✓ Heading is visible");
let dialog = page.locator("#dialog").await;
expect(dialog.clone()).to_be_hidden().await?;
println!("✓ Dialog is hidden");
expect(dialog.clone()).not().to_be_visible().await?;
println!("✓ Dialog is NOT visible (negation)");
expect(heading.clone())
.with_timeout(Duration::from_secs(10))
.to_be_visible()
.await?;
println!("✓ Heading is visible (with 10s timeout)");
page.evaluate_expression(
r#"
const delayed = document.createElement('div');
delayed.id = 'delayed-element';
delayed.textContent = 'I will appear!';
delayed.style.display = 'none';
document.body.appendChild(delayed);
setTimeout(() => {
delayed.style.display = 'block';
}, 1000);
"#,
)
.await?;
let delayed = page.locator("#delayed-element").await;
expect(delayed).to_be_visible().await?;
println!("✓ Delayed element became visible (auto-retry)");
expect(heading.clone())
.to_have_text("Example Domain")
.await?;
println!("✓ Heading has exact text");
expect(heading.clone()).to_contain_text("Example").await?;
println!("✓ Heading contains substring");
expect(heading.clone())
.to_have_text_regex(r"Example.*")
.await?;
println!("✓ Heading matches regex pattern");
page.evaluate_expression(
r#"
const input = document.createElement('input');
input.id = 'email-input';
input.value = 'user@example.com';
document.body.appendChild(input);
"#,
)
.await?;
let email_input = page.locator("#email-input").await;
expect(email_input.clone())
.to_have_value("user@example.com")
.await?;
println!("✓ Input has expected value");
expect(email_input)
.to_have_value_regex(r".*@example\.com")
.await?;
println!("✓ Input value matches regex");
page.evaluate_expression(
r#"
const hidden = document.createElement('div');
hidden.id = 'hidden-element';
hidden.style.display = 'none';
document.body.appendChild(hidden);
"#,
)
.await?;
let hidden = page.locator("#hidden-element").await;
let result = expect(hidden)
.with_timeout(Duration::from_millis(500))
.to_be_visible()
.await;
match result {
Ok(_) => println!("❌ Should have timed out"),
Err(e) => println!("✓ Assertion timed out as expected: {}", e),
}
expect_page(&page).to_have_title("Example Domain").await?;
println!("✓ Page has expected title");
expect_page(&page).to_have_title_regex("Example.*").await?;
println!("✓ Page title matches regex");
expect_page(&page)
.to_have_url("https://example.com/")
.await?;
println!("✓ Page has expected URL");
expect_page(&page)
.to_have_url_regex("https://example\\.com.*")
.await?;
println!("✓ Page URL matches regex");
expect_page(&page)
.not()
.to_have_title("Wrong Title")
.await?;
println!("✓ Page does NOT have wrong title");
browser.close().await?;
println!("\n✅ All assertion examples completed!");
Ok(())
}