#![cfg(feature = "integration")]
mod common;
use std::time::Duration;
use viewpoint_core::{Browser, DocumentLoadState, Selector};
async fn setup() -> (
Browser,
viewpoint_core::BrowserContext,
viewpoint_core::Page,
) {
common::launch_with_page().await
}
#[tokio::test]
async fn test_locator_click() {
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 link = page.locator("a");
link.click().await.expect("Failed to click link");
tokio::time::sleep(Duration::from_millis(500)).await;
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_hover() {
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 heading = page.locator("h1");
heading.hover().await.expect("Failed to hover");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_text_content() {
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 heading = page.locator("h1");
let text = heading.text_content().await.expect("Failed to get text");
assert!(text.is_some());
assert!(text.unwrap().contains("Example Domain"));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_is_visible() {
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 heading = page.locator("h1");
let visible = heading
.is_visible()
.await
.expect("Failed to check visibility");
assert!(visible);
let nonexistent = page.locator("#does-not-exist-12345");
let not_visible = nonexistent
.is_visible()
.await
.expect("Failed to check visibility");
assert!(!not_visible);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_count() {
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 heading = page.locator("h1");
let count = heading.count().await.expect("Failed to count");
assert_eq!(count, 1);
let paragraphs = page.locator("p");
let p_count = paragraphs.count().await.expect("Failed to count");
assert!(p_count >= 1);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_dblclick() {
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 heading = page.locator("h1");
heading.dblclick().await.expect("Failed to double-click");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_all() {
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 paragraphs = page.locator("p");
let all_p = paragraphs.all().await.expect("Failed to get all");
assert!(!all_p.is_empty());
for p in all_p {
assert!(matches!(p.selector(), Selector::Nth { .. }));
}
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_all_text_contents() {
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 paragraphs = page.locator("p");
let texts = paragraphs
.all_text_contents()
.await
.expect("Failed to get texts");
assert!(!texts.is_empty());
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_all_inner_texts() {
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 paragraphs = page.locator("p");
let texts = paragraphs
.all_inner_texts()
.await
.expect("Failed to get inner texts");
assert!(!texts.is_empty());
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_locator_get_attribute() {
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 link = page.locator("a");
let href = link
.get_attribute("href")
.await
.expect("Failed to get attribute");
assert!(href.is_some());
assert!(href.unwrap().contains("iana.org"));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_scroll_into_view() {
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 link = page.locator("a");
link.scroll_into_view_if_needed()
.await
.expect("Failed to scroll into view");
browser.close().await.expect("Failed to close browser");
}