#![cfg(feature = "integration")]
mod common;
use viewpoint_core::{AriaRole, Browser, DocumentLoadState, Selector};
async fn setup() -> (
Browser,
viewpoint_core::BrowserContext,
viewpoint_core::Page,
) {
common::launch_with_page().await
}
#[tokio::test]
async fn test_locator_creation() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let by_css = page.locator("h1");
let by_text = page.get_by_text("Example Domain");
let by_role = page.get_by_role(AriaRole::Heading).build();
assert!(matches!(by_css.selector(), Selector::Css(_)));
assert!(matches!(by_text.selector(), Selector::Text { .. }));
assert!(matches!(by_role.selector(), Selector::Role { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_chaining() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let chained = page.locator("body").locator("div").locator("h1");
assert!(matches!(chained.selector(), Selector::Chained(_, _)));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_nth_selection() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let first = page.locator("p").first();
let last = page.locator("p").last();
let nth = page.locator("p").nth(0);
assert!(matches!(first.selector(), Selector::Nth { .. }));
assert!(matches!(last.selector(), Selector::Nth { .. }));
assert!(matches!(nth.selector(), Selector::Nth { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_get_by_label() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://httpbin.org/forms/post")
.wait_until(DocumentLoadState::Load)
.goto()
.await
.expect("Failed to navigate");
let label_locator = page.get_by_label("Customer name");
assert!(matches!(label_locator.selector(), Selector::Label { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_get_by_placeholder() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let placeholder_locator = page.get_by_placeholder("Search...");
assert!(matches!(
placeholder_locator.selector(),
Selector::Placeholder { .. }
));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_get_by_test_id() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let test_id_locator = page.get_by_test_id("submit-button");
assert!(matches!(test_id_locator.selector(), Selector::TestId(_)));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_get_by_alt_text() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let alt_locator = page.get_by_alt_text("Logo");
assert!(matches!(alt_locator.selector(), Selector::AltText { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_get_by_title() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let title_locator = page.get_by_title("Help");
assert!(matches!(title_locator.selector(), Selector::Title { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_and_composition() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let locator1 = page.locator("div");
let locator2 = page.locator("p");
let combined = locator1.and(locator2);
assert!(matches!(combined.selector(), Selector::And(_, _)));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_or_composition() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let locator1 = page.locator("h1");
let locator2 = page.locator("h2");
let combined = locator1.or(locator2);
assert!(matches!(combined.selector(), Selector::Or(_, _)));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_filter_has_text() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let filtered = page.locator("div").filter().has_text("Example");
assert!(matches!(filtered.selector(), Selector::FilterText { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_filter_has_not_text() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let filtered = page.locator("div").filter().has_not_text("NonExistent");
assert!(matches!(filtered.selector(), Selector::FilterText { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_filter_has_child() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let child = page.locator("h1");
let filtered = page.locator("div").filter().has(child);
assert!(matches!(filtered.selector(), Selector::FilterHas { .. }));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_css_selector_patterns() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let by_tag = page.locator("h1");
let by_class = page.locator(".example-class");
let by_id = page.locator("#example-id");
let by_attr = page.locator("[href]");
let by_combined = page.locator("a[href*='iana']");
assert!(matches!(by_tag.selector(), Selector::Css(_)));
assert!(matches!(by_class.selector(), Selector::Css(_)));
assert!(matches!(by_id.selector(), Selector::Css(_)));
assert!(matches!(by_attr.selector(), Selector::Css(_)));
assert!(matches!(by_combined.selector(), Selector::Css(_)));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_text_selector_patterns() {
common::init_tracing();
let (browser, _context, page) = setup().await;
page.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let exact_text = page.get_by_text("Example Domain");
assert!(matches!(exact_text.selector(), Selector::Text { .. }));
browser.close().await.expect("Failed to close browser");
}