use serde_json::json;
use super::ChromiumTab;
use crate::Result;
use crate::a11y::{self, AX_SNAPSHOT_JS, AxNode, AxTree};
impl ChromiumTab {
pub async fn ax_tree(&self) -> Result<AxTree> {
let _ = self.core.send("Accessibility.enable", json!({})).await;
let r = self
.core
.send("Accessibility.getFullAXTree", json!({}))
.await?;
Ok(a11y::build_from_cdp(&r))
}
pub async fn ax_snapshot(&self) -> Result<AxTree> {
let v = self.core.eval_value(AX_SNAPSHOT_JS).await?;
Ok(a11y::build_from_snapshot(&v))
}
pub async fn ax_find(&self, role: &str) -> Result<Vec<AxNode>> {
let tree = self.ax_tree().await?;
Ok(tree.find_by_role(role).into_iter().cloned().collect())
}
pub async fn ai_snapshot(
&self,
budget_ms: Option<u64>,
max_items: Option<usize>,
max_text_chars: Option<usize>,
) -> Result<crate::ai_snapshot::AiSnapshot> {
use crate::ai_snapshot::{
AiSnapshot, DEFAULT_BUDGET_MS, DEFAULT_MAX_ITEMS, DEFAULT_MAX_TEXT_CHARS,
ai_snapshot_js,
};
let js = ai_snapshot_js(
budget_ms.unwrap_or(DEFAULT_BUDGET_MS),
max_items.unwrap_or(DEFAULT_MAX_ITEMS),
max_text_chars.unwrap_or(DEFAULT_MAX_TEXT_CHARS),
);
let v = self.core.eval_value(&js).await?;
AiSnapshot::from_value(&v).ok_or_else(|| crate::Error::msg("ai snapshot 解析失败"))
}
}