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