Files
Mujoco_WASM/web_platform/e2e/website.helpers.ts
T
chenlin 0d986f60bd
web-platform-ci / Standalone decision service (no cloud credentials) (push) Has been cancelled
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
lekiwi-compatibility / cpu-compatibility (push) Has been cancelled
feat: release v1.0.2 LeKiwi 语言控制与网站嵌入
集成服务器托管模型、自然语言移动与有界抓放、内置 LeKiwi URL 导入和双摄像头;同步部署契约与指定域名 iframe 白名单,保留原有物理安全、会话及调用预算防护。

更新 npm 包及锁文件版本、CHANGELOG 与发布文档。提交前 typecheck、120 项定向前端测试和 44 项后端测试通过(3 项可选跳过);真实 v2 云模型抓放仍待单独验收,不包含运行密钥或构建产物。
2026-09-24 15:29:49 +08:00

54 lines
2.5 KiB
TypeScript

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