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
集成服务器托管模型、自然语言移动与有界抓放、内置 LeKiwi URL 导入和双摄像头;同步部署契约与指定域名 iframe 白名单,保留原有物理安全、会话及调用预算防护。 更新 npm 包及锁文件版本、CHANGELOG 与发布文档。提交前 typecheck、120 项定向前端测试和 44 项后端测试通过(3 项可选跳过);真实 v2 云模型抓放仍待单独验收,不包含运行密钥或构建产物。
54 lines
2.5 KiB
TypeScript
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;
|
|
}
|