AI_UIAutomation/scripts/probe-airpurifier.ts

49 lines
2.2 KiB
TypeScript

import { createDriver } from '../drivers/factory';
import * as fs from 'fs';
(async () => {
const driver = createDriver();
await driver.createSession();
const KW = process.env.AIR_PURIFIER_CARD || 'Air Purifier';
try {
await driver.dismissPopupIfPresent();
await driver.goBackToHomepage();
await new Promise((r) => setTimeout(r, 1000));
// 找卡片并点中心
let el: string | null = null;
for (let i = 0; i < 8; i++) {
el = await driver.findElementRaw('-android uiautomator', `new UiSelector().textContains("${KW}")`).catch(() => null);
if (el) break;
await driver.swipe(540, 1400, 540, 600, 0.4).catch(() => {});
await new Promise((r) => setTimeout(r, 900));
}
if (!el) throw new Error('找不到卡片');
const rect = await driver.getElementRect(el);
console.log(`卡片文本 rect=(${rect.x},${rect.y}) ${rect.width}x${rect.height}`);
await driver.tap(rect.x + rect.width / 2, rect.y + rect.height / 2);
await new Promise((r) => setTimeout(r, 2500));
const size = await driver.getWindowSize();
console.log(`屏幕 ${size.width}x${size.height}`);
const src = await driver.getSource();
const texts = Array.from(src.matchAll(/text="([^"]+)"/g)).map((m) => m[1]).filter((t) => t.trim());
console.log('=== 浮层文本节点 ===');
console.log(JSON.stringify([...new Set(texts)], null, 0));
// 把带 bounds 的可点节点也 dump 出来(找无文案电源键的可能容器)
const nodes = Array.from(src.matchAll(/<[^>]*?(?:text="([^"]*)")?[^>]*?(?:content-desc="([^"]*)")?[^>]*?clickable="true"[^>]*?bounds="(\[\d+,\d+\]\[\d+,\d+\])"[^>]*?>/g));
console.log('=== clickable 节点(text|desc|bounds) ===');
for (const n of nodes.slice(0, 40)) console.log(` "${n[1] || ''}" | "${n[2] || ''}" | ${n[3]}`);
const ss = await driver.screenshot();
fs.writeFileSync('/tmp/airpurifier_popup.png', Buffer.from(ss, 'base64'));
console.log('截图: /tmp/airpurifier_popup.png');
} catch (e: any) {
console.error('探针失败:', e.message);
const ss = await driver.screenshot().catch(() => '');
if (ss) fs.writeFileSync('/tmp/airpurifier_popup.png', Buffer.from(ss, 'base64'));
} finally {
await driver.destroySession();
}
})();