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 { getDeviceName } from '../../config/device.config'; import { sleep, enterDeviceSettings, renameDevice, changeDeviceRoom, navigateToTimerPage, addTimer, deleteAllTimers, navigateToFirmwarePage, checkFirmwareVersion, navigateToDeviceInfo, getDeviceInfo, scrollToAndTap, waitForSource, enterEditInfo, addDeviceViaBLE, isDeviceOnHomepage, createScene, executeSceneFromHomepage, deleteScene, ensureHomeTab, } from '../../utils/common'; import * as dotenv from 'dotenv'; import * as path from 'path'; dotenv.config({ path: path.resolve(__dirname, '../../.env') }); const deviceName = getDeviceName('remote', 'REMOTE_DEVICE'); describe('Remote Control - Remote控制页', () => { let driver: DeviceDriver; let reporter: TestReporter; beforeAll(async () => { driver = createDriver(); await driver.createSession(); reporter = new TestReporter('Remote_Control', driver.platform.toUpperCase()); }); beforeEach(async () => { await driver.dismissPopupIfPresent(); await driver.goBackToHomepage(); await driver.dismissPopupIfPresent(); }); afterAll(async () => { reporter.generate(); await driver.destroySession(); }); async function enterRemoteControl(): Promise { let el = await driver.findElementRaw('name', deviceName); if (!el) { await driver.scrollDown(250); await sleep(1000); el = await driver.findElementRaw('name', deviceName); } if (!el) throw new Error(`找不到${deviceName}卡片`); await driver.tapElement(el); await sleep(3000); } it('查找设备', async () => { const start = Date.now(); try { await enterRemoteControl(); const findEl = await driver.findElementRaw('name', 'Find Device') || await driver.findElementRaw('name', 'Ring') || await driver.findElementRaw('name', 'Find'); if (!findEl) { // Try scrolling to find await driver.scrollDown(300); await sleep(1000); const el = await driver.findElementRaw('name', 'Find Device') || await driver.findElementRaw('name', 'Ring') || await driver.findElementRaw('name', 'Find'); if (!el) throw new Error('Find Device/Ring按钮未找到'); await driver.tapElement(el); } else { await driver.tapElement(findEl); } await sleep(3000); const source = await driver.getSource(); const responded = source.includes('Ring') || source.includes('Find') || source.includes('Beep') || source.includes('Stop'); console.log('查找设备响应:', responded); reporter.record('查找设备', 'PASS', Date.now() - start, `Find Device已执行, response=${responded}`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record('查找设备', 'FAIL', Date.now() - start, e.message, ss); throw e; } }); it('解绑设备', async () => { const start = Date.now(); try { await enterRemoteControl(); const unbindEl = await driver.findElementRaw('name', 'Unbind') || await driver.findElementRaw('name', 'Unpair') || await driver.findElementRaw('name', 'Remove'); if (!unbindEl) { await driver.scrollDown(300); await sleep(1000); const el = await driver.findElementRaw('name', 'Unbind') || await driver.findElementRaw('name', 'Unpair'); if (!el) throw new Error('Unbind/Unpair按钮未找到'); await driver.tapElement(el); } else { await driver.tapElement(unbindEl); } await sleep(2000); // Confirm dialog const confirmEl = await driver.findElementRaw('name', 'Confirm') || await driver.findElementRaw('name', 'OK') || await driver.findElementRaw('name', 'Yes'); if (confirmEl) { await driver.tapElement(confirmEl); await sleep(3000); } const source = await driver.getSource(); const unbound = source.includes('Bind') || source.includes('Pair') || source.includes('Add') || !source.includes(deviceName); console.log('解绑结果:', unbound); reporter.record('解绑设备', 'PASS', Date.now() - start, `Unbind完成, unbound=${unbound}`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record('解绑设备', 'FAIL', Date.now() - start, e.message, ss); throw e; } }); it('按键配置-上键', async () => { const start = Date.now(); try { await enterRemoteControl(); // Navigate to key configuration const keyConfigEl = await driver.findElementRaw('name', 'Key Config') || await driver.findElementRaw('name', 'Button Settings') || await driver.findElementRaw('name', 'Key Configuration'); if (!keyConfigEl) { const tapped = await scrollToAndTap(driver, 'Key Config'); if (!tapped) { const tapped2 = await scrollToAndTap(driver, 'Button Settings'); if (!tapped2) throw new Error('Key Config/Button Settings未找到'); } } else { await driver.tapElement(keyConfigEl); } await sleep(2000); // Select UP key const upEl = await driver.findElementRaw('name', 'UP') || await driver.findElementRaw('name', 'Up') || await driver.findElementRaw('name', 'Button 1') || await driver.findElementRaw('name', 'Top Button'); if (!upEl) throw new Error('UP按键选项未找到'); await driver.tapElement(upEl); await sleep(2000); // Assign action - Bot toggle const botEl = await driver.findElementRaw('name', 'Bot') || await driver.findElementRaw('name', 'Toggle'); if (botEl) { await driver.tapElement(botEl); await sleep(2000); } // Save configuration const saveEl = await driver.findElementRaw('name', 'Save') || await driver.findElementRaw('name', 'Confirm') || await driver.findElementRaw('name', 'Done'); if (saveEl) { await driver.tapElement(saveEl); await sleep(2000); } const source = await driver.getSource(); const configured = source.includes('Bot') || source.includes('Toggle') || source.includes('UP'); console.log('上键配置:', configured); reporter.record('按键配置-上键', 'PASS', Date.now() - start, `UP键配置Bot toggle=${configured}`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record('按键配置-上键', 'FAIL', Date.now() - start, e.message, ss); throw e; } }); it('按键配置-下键', async () => { const start = Date.now(); try { await enterRemoteControl(); // Navigate to key configuration const keyConfigEl = await driver.findElementRaw('name', 'Key Config') || await driver.findElementRaw('name', 'Button Settings') || await driver.findElementRaw('name', 'Key Configuration'); if (!keyConfigEl) { const tapped = await scrollToAndTap(driver, 'Key Config'); if (!tapped) { const tapped2 = await scrollToAndTap(driver, 'Button Settings'); if (!tapped2) throw new Error('Key Config/Button Settings未找到'); } } else { await driver.tapElement(keyConfigEl); } await sleep(2000); // Select DOWN key const downEl = await driver.findElementRaw('name', 'DOWN') || await driver.findElementRaw('name', 'Down') || await driver.findElementRaw('name', 'Button 2') || await driver.findElementRaw('name', 'Bottom Button'); if (!downEl) throw new Error('DOWN按键选项未找到'); await driver.tapElement(downEl); await sleep(2000); // Assign action - Scene const sceneEl = await driver.findElementRaw('name', 'Scene') || await driver.findElementRaw('name', 'Execute Scene'); if (sceneEl) { await driver.tapElement(sceneEl); await sleep(2000); // Select first available scene const source = await driver.getSource(); if (source.includes('Scene')) { const firstScene = await driver.findElementRaw('name', 'Scene'); if (firstScene) { await driver.tapElement(firstScene); await sleep(1000); } } } // Save configuration const saveEl = await driver.findElementRaw('name', 'Save') || await driver.findElementRaw('name', 'Confirm') || await driver.findElementRaw('name', 'Done'); if (saveEl) { await driver.tapElement(saveEl); await sleep(2000); } const source = await driver.getSource(); const configured = source.includes('Scene') || source.includes('DOWN') || source.includes('Down'); console.log('下键配置:', configured); reporter.record('按键配置-下键', 'PASS', Date.now() - start, `DOWN键配置Scene=${configured}`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record('按键配置-下键', 'FAIL', Date.now() - start, e.message, ss); throw e; } }); });