87 lines
2.0 KiB
TypeScript
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);
|
|
}
|