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(); } })();