use super::common;
#[tokio::test]
async fn test_selectors_accessible_from_playwright() {
let (playwright, browser, page) = common::setup().await;
let selectors = playwright.selectors();
selectors
.set_test_id_attribute("data-testid")
.await
.expect("Selectors should be accessible and accept set_test_id_attribute");
page.close().await.unwrap();
browser.close().await.unwrap();
playwright.shutdown().await.unwrap();
}
#[tokio::test]
async fn test_set_test_id_attribute() {
let (playwright, browser, page) = common::setup().await;
let selectors = playwright.selectors();
selectors
.set_test_id_attribute("data-custom-id")
.await
.expect("set_test_id_attribute should succeed");
page.goto(
"data:text/html,<html><body>\
<button data-custom-id=\"my-button\">Click me</button>\
</body></html>",
None,
)
.await
.expect("goto should succeed");
let button = page.get_by_test_id("my-button").await;
let text = button
.text_content()
.await
.expect("text_content should succeed");
assert_eq!(text, Some("Click me".to_string()));
selectors
.set_test_id_attribute("data-testid")
.await
.expect("restoring default test ID attribute should succeed");
page.close().await.unwrap();
browser.close().await.unwrap();
playwright.shutdown().await.unwrap();
}
#[tokio::test]
async fn test_register_custom_selector() {
let (playwright, browser, page) = common::setup().await;
let selectors = playwright.selectors();
let script = r#"
{
query(root, selector) {
return root.querySelector(selector);
},
queryAll(root, selector) {
return Array.from(root.querySelectorAll(selector));
}
}
"#;
selectors
.register("tag", script, None)
.await
.expect("register should succeed");
page.goto(
"data:text/html,<html><body><article>Hello article</article></body></html>",
None,
)
.await
.expect("goto should succeed");
let locator = page.locator("tag=article").await;
let text = locator
.text_content()
.await
.expect("text_content should succeed");
assert_eq!(text, Some("Hello article".to_string()));
page.close().await.unwrap();
browser.close().await.unwrap();
playwright.shutdown().await.unwrap();
}
#[tokio::test]
async fn test_register_custom_selector_with_content_script() {
let (playwright, browser, page) = common::setup().await;
let selectors = playwright.selectors();
let script = r#"
{
query(root, selector) {
return root.querySelector(selector);
},
queryAll(root, selector) {
return Array.from(root.querySelectorAll(selector));
}
}
"#;
selectors
.register("cstag", script, Some(true))
.await
.expect("register with content_script should succeed");
page.goto(
"data:text/html,<html><body><section>Content</section></body></html>",
None,
)
.await
.expect("goto should succeed");
let locator = page.locator("cstag=section").await;
let text = locator
.text_content()
.await
.expect("text_content should succeed");
assert_eq!(text, Some("Content".to_string()));
page.close().await.unwrap();
browser.close().await.unwrap();
playwright.shutdown().await.unwrap();
}
#[tokio::test]
async fn test_register_duplicate_selector_name_fails() {
let (playwright, browser, _page) = common::setup().await;
let selectors = playwright.selectors();
let script = r#"
{
query(root, selector) { return root.querySelector(selector); },
queryAll(root, selector) { return Array.from(root.querySelectorAll(selector)); }
}
"#;
selectors
.register("dup", script, None)
.await
.expect("first register should succeed");
let result = selectors.register("dup", script, None).await;
assert!(
result.is_err(),
"re-registering a selector engine should return an error"
);
browser.close().await.unwrap();
playwright.shutdown().await.unwrap();
}