AI_UIAutomation/utils/common/element.helper.ts

87 lines
2.0 KiB
TypeScript

import { DeviceDriver } from '../../drivers/types';
export function sleep(ms: number): Promise<void> {
return new Promise(r => setTimeout(r, ms));
}
export async function waitForElement(
driver: DeviceDriver,
using: string,
value: string,
timeout = 10000
): Promise<string | null> {
const start = Date.now();
while (Date.now() - start < timeout) {
const el = await driver.findElementRaw(using, value);
if (el) return el;
await sleep(1000);
}
return null;
}
export async function waitForSource(
driver: DeviceDriver,
keyword: string,
timeout = 10000
): Promise<boolean> {
const start = Date.now();
while (Date.now() - start < timeout) {
const src = await driver.getSource();
if (src.includes(keyword)) return true;
await sleep(1000);
}
return false;
}
export async function scrollUntilFound(
driver: DeviceDriver,
using: string,
value: string,
maxScrolls = 5,
scrollDistance = 300
): Promise<string | null> {
for (let i = 0; i < maxScrolls; i++) {
const el = await driver.findElementRaw(using, value);
if (el) return el;
await driver.scrollDown(scrollDistance);
await sleep(800);
}
return null;
}
export async function tapWithRetry(
driver: DeviceDriver,
using: string,
value: string,
retries = 3
): Promise<boolean> {
for (let i = 0; i < retries; i++) {
try {
const el = await driver.findElementRaw(using, value);
if (el) {
await driver.tapElement(el);
return true;
}
} catch { /* stale element, retry */ }
await sleep(500);
}
return false;
}
export async function sourceContains(driver: DeviceDriver, keyword: string): Promise<boolean> {
const src = await driver.getSource();
return src.includes(keyword);
}
export async function findElementOnScreen(
driver: DeviceDriver,
keyword: string
): Promise<boolean> {
let src = await driver.getSource();
if (src.includes(keyword)) return true;
await driver.scrollDown(300);
await sleep(800);
src = await driver.getSource();
return src.includes(keyword);
}