use drission::prelude::*;
const BUILD_PAGE: &str = r#"
document.body.innerHTML = '<input id="t" value="" style="font-size:20px;width:300px">';
window.__keys = [];
const t = document.getElementById('t');
t.addEventListener('keydown', e => {
window.__keys.push({ key: e.key, ctrl: e.ctrlKey, meta: e.metaKey, shift: e.shiftKey, alt: e.altKey });
});
'ok'
"#;
#[tokio::main]
async fn main() -> drission::Result<()> {
let headless = std::env::var("HL").map(|v| v != "0").unwrap_or(true);
println!("[*] 启动 Chrome(headless={headless})");
let browser = Browser::launch(BrowserOptions::new().headless(headless)).await?;
let tab = browser.new_tab(Some("about:blank")).await?;
tab.get("about:blank").await?;
tab.run_js(BUILD_PAGE).await?;
let mut failed = false;
macro_rules! check {
($cond:expr, $($arg:tt)*) => {{
let ok = $cond;
println!("[{}] {}", if ok { "ok" } else { "FAIL" }, format!($($arg)*));
if !ok { failed = true; }
}};
}
let inp = tab.ele("#t").await?;
inp.click().await?; inp.input_human("hello world").await?;
let val = inp.value().await?;
check!(
val == "hello world",
"input_human → value == \"hello world\"(实得 {val:?})"
);
let typed_keys = tab
.run_js("window.__keys.length")
.await?
.as_u64()
.unwrap_or(0);
check!(
typed_keys >= 11,
"逐字符 keydown 计数 >= 11(实得 {typed_keys})"
);
let on_mac = cfg!(target_os = "macos");
let sel_mod = if on_mac { Keys::META } else { Keys::CONTROL };
let mod_name = if on_mac { "meta" } else { "ctrl" };
inp.shortcut(&[sel_mod, "a"]).await?;
let mod_seen = tab
.run_js(&format!(
"(()=>{{const k=window.__keys.filter(x=>x.key==='a'); return k.length>0 && k[k.length-1].{mod_name}===true;}})()"
))
.await?
.as_bool()
.unwrap_or(false);
check!(
mod_seen,
"组合键 keydown 的 e.{mod_name}Key === true(modifiers 已下发)"
);
let val_after = inp.value().await?;
check!(
val_after == "hello world",
"组合键不键入字符(value 仍为 \"hello world\",实得 {val_after:?})"
);
let all_selected = tab
.run_js("(()=>{const t=document.getElementById('t');return t.selectionStart===0 && t.selectionEnd===t.value.length && t.value.length>0;})()")
.await?
.as_bool()
.unwrap_or(false);
check!(all_selected, "全选生效:selection 覆盖整个输入框");
tab.press_key(Keys::BACKSPACE).await?;
let val_cleared = inp.value().await?;
check!(
val_cleared.is_empty(),
"全选 + Backspace 清空(实得 {val_cleared:?})"
);
inp.input("abc").await?;
tab.key_combo(&[sel_mod, "a"]).await?;
tab.press_key(Keys::BACKSPACE).await?;
let val2 = inp.value().await?;
check!(
val2.is_empty(),
"tab.key_combo 全选+删除清空(实得 {val2:?})"
);
browser.quit().await?;
if failed {
eprintln!("==== SOME CHECKS FAILED ====");
std::process::exit(1);
}
println!("\n==== ALL CHECKS PASSED ====");
Ok(())
}