import { expect, type Page, type TestInfo } from '@playwright/test'; import { resolve } from 'node:path'; import { writeFile } from 'node:fs/promises'; export async function collectRobotResults(page: Page) { await page.addInitScript(() => { window.addEventListener('robot-task-result', (event) => { sessionStorage.setItem('test-robot-result', JSON.stringify((event as CustomEvent).detail)); }); }); } export async function readRobotResult(page: Page) { await page.waitForFunction(() => sessionStorage.getItem('test-robot-result') !== null); return page.evaluate(() => JSON.parse(sessionStorage.getItem('test-robot-result')!)); } export async function loadWebsiteRobot(page: Page) { await collectRobotResults(page); await page.goto('/'); await page .locator('input[type=file]') .first() .setInputFiles(resolve('build/lekiwi/lekiwi-v1.zip')); const dialog = page.getByRole('dialog', { name: '配置 URDF 仿真组件' }); await expect(dialog).toBeVisible({ timeout: 30000 }); await dialog.getByLabel('URDF 机器人 profile').selectOption('lekiwi-v1'); await dialog.getByRole('button', { name: '转换并加载' }).click(); await expect(page.getByRole('button', { name: '▶ 播放' })).toBeEnabled({ timeout: 90000 }); await page.getByRole('tab', { name: '控制台', exact: true }).click(); await page.getByRole('button', { name: '机器人语言控制', exact: true }).click(); await expect(page.locator('input[type=password]')).toHaveCount(0); return page.getByLabel('机器人语言控制', { exact: true }); } export async function runWebsiteCommand( page: Page, instruction: string, info: TestInfo, name: string, ) { const panel = page.getByLabel('机器人语言控制', { exact: true }); await page.evaluate(() => sessionStorage.removeItem('test-robot-result')); await panel.getByRole('textbox', { name: '机器人指令' }).fill(instruction); const response = page.waitForResponse((r) => new URL(r.url()).pathname.endsWith('/command')); await panel.getByRole('button', { name: '执行指令', exact: true }).click(); expect((await response).status()).toBe(200); await expect(panel.getByTestId('robot-command-state')).toContainText(/已完成|安全停止|已停止/, { timeout: 240000, }); const data = await readRobotResult(page); await writeFile(info.outputPath(`${name}.json`), JSON.stringify(data, null, 2)); expect(data.state, data.error).toBe('succeeded'); expect(data.succeeded).toBe(true); return data; }