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, } from '../../utils/common'; import * as dotenv from 'dotenv'; import * as path from 'path'; dotenv.config({ path: path.resolve(__dirname, '../../.env') }); const deviceName = getDeviceName('stripLight', 'STRIP_LIGHT_DEVICE'); // 必测项控制锚点: 点击控制Strip Light开/关 BLE 15975#4poyiVwD / WiFi 15974#QgX4dX7X const PROTO = process.env.PROTO === 'wifi' ? 'wifi' : 'ble'; const CTRL_STRIP = PROTO === 'wifi' ? '[P0][ONES:15974#QgX4dX7X][wifi]' : '[P0][ONES:15975#4poyiVwD][ble]'; describe('StripLight Control - 灯带功能页', () => { let driver: DeviceDriver; let reporter: TestReporter; beforeAll(async () => { driver = createDriver(); await driver.createSession(); reporter = new TestReporter('StripLight_Control', driver.platform.toUpperCase()); }); beforeEach(async () => { await driver.dismissPopupIfPresent(); await driver.goBackToHomepage(); await driver.dismissPopupIfPresent(); }); afterAll(async () => { reporter.generate(); await driver.destroySession(); }); async function enterStripLightControl(): Promise { const 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 enterStripLightControl(); const powerEl = await driver.findElementRaw('name', 'Power') || await driver.findElementRaw('name', 'power') || await driver.findElementRaw('name', 'ON'); expect(powerEl).not.toBeNull(); await driver.tapElement(powerEl!); await sleep(3000); const source = await driver.getSource(); const isOn = source.includes('ON') || source.includes('White') || source.includes('Scene'); expect(isOn).toBe(true); reporter.record(`${CTRL_STRIP} 打开开关`, 'PASS', Date.now() - start, `灯带已开启`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record(`${CTRL_STRIP} 打开开关`, 'FAIL', Date.now() - start, e.message, ss); throw e; } }); it('切换到白光模式', async () => { const start = Date.now(); try { await enterStripLightControl(); const whiteEl = await driver.findElementRaw('name', 'White') || await driver.findElementRaw('name', 'white') || await driver.findElementRaw('name', 'WHITE'); expect(whiteEl).not.toBeNull(); await driver.tapElement(whiteEl!); await sleep(3000); const source = await driver.getSource(); const isWhite = source.includes('White') || source.includes('white'); expect(isWhite).toBe(true); reporter.record('切换到白光模式', 'PASS', Date.now() - start, `已切换到白光模式`); } 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 enterStripLightControl(); const sceneEl = await driver.findElementRaw('name', 'Scene') || await driver.findElementRaw('name', 'scene') || await driver.findElementRaw('name', 'SCENE'); expect(sceneEl).not.toBeNull(); await driver.tapElement(sceneEl!); await sleep(3000); const source = await driver.getSource(); const isScene = source.includes('Scene') || source.includes('scene'); expect(isScene).toBe(true); reporter.record('切换到场景模式', 'PASS', Date.now() - start, `已切换到场景模式`); } 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 enterStripLightControl(); const musicEl = await driver.findElementRaw('name', 'Music') || await driver.findElementRaw('name', 'music') || await driver.findElementRaw('name', 'MUSIC'); expect(musicEl).not.toBeNull(); await driver.tapElement(musicEl!); await sleep(3000); const source = await driver.getSource(); const isMusic = source.includes('Music') || source.includes('music'); expect(isMusic).toBe(true); reporter.record('切换到音乐模式', 'PASS', Date.now() - start, `已切换到音乐模式`); } 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 enterStripLightControl(); const tapped = await scrollToAndTap(driver, 'Delay'); expect(tapped).toBe(true); await sleep(2000); const source = await driver.getSource(); const hasDelay = source.includes('Delay') || source.includes('Timer') || source.includes('Hour') || source.includes('Min'); expect(hasDelay).toBe(true); // Confirm the delay setting const confirmEl = await driver.findElementRaw('name', 'Confirm') || await driver.findElementRaw('name', 'OK') || await driver.findElementRaw('name', 'Save'); if (confirmEl) { await driver.tapElement(confirmEl); await sleep(2000); } reporter.record('开启延迟', 'PASS', Date.now() - start, `延迟设置页面已打开`); } 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 enterStripLightControl(); const navOk = await navigateToTimerPage(driver); expect(navOk).toBe(true); await sleep(2000); const added = await addTimer(driver); expect(added).toBe(true); const source = await driver.getSource(); const hasTimer = source.includes('Only once') || source.includes('Timer'); console.log('定时器添加成功:', hasTimer); reporter.record('定时器添加', 'PASS', Date.now() - start, '添加定时器成功'); } 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 enterStripLightControl(); const navOk = await navigateToTimerPage(driver); expect(navOk).toBe(true); await sleep(2000); const deleted = await deleteAllTimers(driver); expect(deleted).toBe(true); console.log('定时器已清空: true'); reporter.record('定时器删除', 'PASS', Date.now() - start, '所有定时器已删除'); } 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 enterStripLightControl(); const powerEl = await driver.findElementRaw('name', 'Power') || await driver.findElementRaw('name', 'power') || await driver.findElementRaw('name', 'OFF'); expect(powerEl).not.toBeNull(); await driver.tapElement(powerEl!); await sleep(3000); const source = await driver.getSource(); const isOff = source.includes('OFF') || source.includes('off') || !source.includes('Scene'); console.log('灯带已关闭:', isOff); reporter.record(`${CTRL_STRIP} 关闭开关`, 'PASS', Date.now() - start, `灯带已关闭`); } catch (e: any) { const ss = await driver.screenshot().catch(() => ''); reporter.record(`${CTRL_STRIP} 关闭开关`, 'FAIL', Date.now() - start, e.message, ss); throw e; } }); });