AI_UIAutomation/tests/automation/automation_helper_validatio...

140 lines
4.5 KiB
TypeScript

import { describe, it, beforeAll, afterAll, beforeEach, expect } from 'vitest';
import { DeviceDriver } from '../../drivers/types';
import { createDriver } from '../../drivers/factory';
import { TestReporter } from '../../utils/test-reporter';
import { AutomationHelper } from '../../utils/automation-helper';
import { sleep } from '../../utils/common/element.helper';
import * as dotenv from 'dotenv';
import * as path from 'path';
dotenv.config({ path: path.resolve(__dirname, '../../.env') });
describe('【通用自动化】- 创建/删除流程验证', () => {
let driver: DeviceDriver;
let reporter: TestReporter;
let helper: AutomationHelper;
beforeAll(async () => {
driver = createDriver();
await driver.createSession();
reporter = new TestReporter('Automation_General', driver.platform.toUpperCase());
helper = new AutomationHelper(driver);
});
beforeEach(async () => {
await driver.dismissPopupIfPresent();
helper.clearSteps();
});
afterAll(async () => {
reporter.generate();
await driver.destroySession();
});
function isAndroid() { return driver.platform === 'android'; }
async function logPageElements(): Promise<void> {
if (!isAndroid()) return;
const src = await driver.getSource();
const textRe = /text="([^"]{1,80})"/g;
const descRe = /content-desc="([^"]{1,80})"/g;
const texts: string[] = [];
const descs: string[] = [];
let m;
while ((m = textRe.exec(src)) !== null) {
if (m[1] && !texts.includes(m[1])) texts.push(m[1]);
}
while ((m = descRe.exec(src)) !== null) {
if (m[1] && !descs.includes(m[1])) descs.push(m[1]);
}
console.log('Page texts:', texts.join(' | '));
if (descs.length) console.log('Page descs:', descs.join(' | '));
}
it('2.1 导航到Automation Tab', { timeout: 60000 }, async () => {
const start = Date.now();
try {
const success = await helper.navigateToAutomationTab();
expect(success).toBe(true);
reporter.record('导航到Automation Tab', 'PASS', Date.now() - start, helper.getSteps().join(' → '));
} catch (e: any) {
reporter.record('导航到Automation Tab', 'FAIL', Date.now() - start, e.message);
throw e;
}
});
it('2.2 进入创建页面并探索', { timeout: 90000 }, async () => {
const start = Date.now();
try {
const onTab = await helper.navigateToAutomationTab();
expect(onTab).toBe(true);
const onCreate = await helper.enterCreatePage();
expect(onCreate).toBe(true);
// Verify creation page elements
const src = await driver.getSource();
expect(src).toContain('Add condition');
expect(src).toContain('Add action');
expect(src).toContain('Save');
reporter.record('进入创建页面', 'PASS', Date.now() - start, helper.getSteps().join(' → '));
} catch (e: any) {
await logPageElements();
reporter.record('进入创建页面', 'FAIL', Date.now() - start, e.message);
throw e;
}
});
it('2.3 选择条件-Smart Devices', { timeout: 120000 }, async () => {
const start = Date.now();
try {
const onTab = await helper.navigateToAutomationTab();
expect(onTab).toBe(true);
const onCreate = await helper.enterCreatePage();
expect(onCreate).toBe(true);
const condOk = await helper.selectCondition({
type: 'Smart Devices'
});
expect(condOk).toBe(true);
// Log what devices are available
await logPageElements();
helper.getSteps().push('设备列表已打印');
reporter.record('选择条件-Smart Devices', 'PASS', Date.now() - start, helper.getSteps().join(' → '));
} catch (e: any) {
await logPageElements();
reporter.record('选择条件-Smart Devices', 'FAIL', Date.now() - start, e.message);
throw e;
}
});
it('2.4 选择条件-Schedules', { timeout: 120000 }, async () => {
const start = Date.now();
try {
const onTab = await helper.navigateToAutomationTab();
expect(onTab).toBe(true);
const onCreate = await helper.enterCreatePage();
expect(onCreate).toBe(true);
const condOk = await helper.selectCondition({
type: 'Schedules'
});
expect(condOk).toBe(true);
// Log what schedule options are available
await logPageElements();
reporter.record('选择条件-Schedules', 'PASS', Date.now() - start, helper.getSteps().join(' → '));
} catch (e: any) {
await logPageElements();
reporter.record('选择条件-Schedules', 'FAIL', Date.now() - start, e.message);
throw e;
}
});
});