feat(web-platform): release V0.5.2 前端优化

This commit is contained in:
2026-08-28 13:32:34 +08:00
parent ecfcd3c869
commit 8e3d56d619
23 changed files with 345 additions and 70 deletions
+46 -3
View File
@@ -43,8 +43,8 @@ test('显示中文平台骨架并加载单文件模型', async ({page}) => {
page.on('response', (response) => { if (response.status() >= 400 || response.url().endsWith('.wasm')) console.log(`[browser:response] ${response.status()} ${response.url()} ${response.headers()['content-type'] ?? ''}`); });
await page.goto('/');
await page.setViewportSize({width:1024,height:768});
const toolBox=await page.getByRole('toolbar',{name:'视口交互模式'}).boundingBox(),playBox=await page.getByRole('button',{name:'▶ 播放'}).boundingBox();
expect(toolBox&&playBox&&toolBox.x+toolBox.width<=playBox.x).toBeTruthy();
const resetCameraBox=await page.getByRole('button',{name:'相机复位'}).boundingBox(),playBox=await page.getByRole('button',{name:'▶ 播放'}).boundingBox();
expect(resetCameraBox&&playBox&&resetCameraBox.x+resetCameraBox.width<=playBox.x).toBeTruthy();
await page.getByRole('button',{name:'更多工作台操作'}).click();await expect(page.getByRole('menuitem',{name:'工作台设置'})).toBeVisible();await page.keyboard.press('Escape');
await page.setViewportSize({width:1440,height:900});
await expect(page.getByRole('heading', {name: 'MuJoCo Web 仿真平台'})).toBeVisible();
@@ -77,6 +77,9 @@ test('显示中文平台骨架并加载单文件模型', async ({page}) => {
});
await expect(page.getByText('WASM 已加载')).toBeVisible({timeout: 30_000});
await page.getByRole('button',{name:'显示设置'}).click();
const displayDialog=page.getByRole('dialog',{name:'视图显示设置'});await expect(displayDialog).toBeVisible();await expect(displayDialog.getByRole('switch')).toHaveCount(7);
const centerOfMassSwitch=displayDialog.getByRole('switch',{name:/^质心/});await centerOfMassSwitch.click();await expect(centerOfMassSwitch).toHaveAttribute('aria-checked','true');await page.keyboard.press('Escape');await expect(displayDialog).toBeHidden();
await page.getByRole('button',{name:'通知中心'}).click();await expect(page.getByRole('dialog',{name:'通知中心'})).toContainText('模型加载完成');await page.getByText('事件日志').click();await expect(page.getByRole('dialog',{name:'诊断与事件日志'})).toBeVisible();await page.keyboard.press('Escape');
await page.getByRole('button',{name:/FPS .*物理/}).click();
await expect(page.getByRole('dialog',{name:'性能详情'})).toBeVisible();
@@ -102,6 +105,28 @@ test('显示中文平台骨架并加载单文件模型', async ({page}) => {
await expect(page.getByRole('button',{name:'▶ 播放'})).toBeVisible();
});
test('窄视口默认保留完整视口并可按需打开侧栏',async({page})=>{
await page.setViewportSize({width:800,height:700});
await page.goto('/');
await expect(page.getByRole('main')).toBeInViewport();
await expect(page.getByRole('button',{name:'显示工程面板'})).toBeVisible();
await expect(page.getByRole('button',{name:'显示属性面板'})).toBeVisible();
await page.getByRole('button',{name:'显示属性面板'}).click();
await expect(page.getByRole('complementary').filter({hasText:'导入模型后显示属性'})).toBeVisible();
});
test('工作区布局与视口显示偏好在刷新后保留',async({page})=>{
await page.setViewportSize({width:1440,height:900});
await page.goto('/');
await page.getByRole('button',{name:'隐藏工程面板'}).click();
await page.getByRole('button',{name:'显示设置'}).click();
await page.getByRole('switch',{name:/^坐标系/}).click();
await page.reload();
await expect(page.getByRole('button',{name:'显示工程面板'})).toBeVisible();
await page.getByRole('button',{name:'显示设置'}).click();
await expect(page.getByRole('switch',{name:/^坐标系/})).toHaveAttribute('aria-checked','true');
});
test('转换后的 MJCF 可编辑并重新载入', async ({page}) => {
await page.goto('/');
await page.locator('input[type="file"]').first().setInputFiles({name:'model.xml',mimeType:'text/xml',buffer:Buffer.from(SIMPLE_MODEL)});
@@ -120,6 +145,24 @@ test('转换后的 MJCF 可编辑并重新载入', async ({page}) => {
await expect(page.getByRole('button',{name:'导出 MJCF'})).toHaveCount(0);
});
test('关闭已修改的 MJCF 前要求确认',async({page})=>{
await page.goto('/');
await page.locator('input[type="file"]').first().setInputFiles({name:'model.xml',mimeType:'text/xml',buffer:Buffer.from(SIMPLE_MODEL)});
await expect(page.getByText('WASM 已加载')).toBeVisible({timeout:30_000});
await page.getByRole('button',{name:'源代码'}).click();
const editorDialog=page.getByRole('dialog',{name:'转换后的 MJCF 编辑器'});
await editorDialog.locator('.monaco-editor').click({position:{x:240,y:120}});
await page.keyboard.press('Control+End');await page.keyboard.insertText('\n');
await editorDialog.getByRole('button',{name:'关闭源代码编辑器'}).click();
const confirm=page.getByRole('dialog',{name:'放弃未保存的修改?'});
await expect(confirm).toBeVisible();
await confirm.getByRole('button',{name:'继续编辑'}).click();
await expect(editorDialog).toBeVisible();
await editorDialog.getByRole('button',{name:'关闭源代码编辑器'}).click();
await page.getByRole('dialog',{name:'放弃未保存的修改?'}).getByRole('button',{name:'放弃修改'}).click();
await expect(editorDialog).toHaveCount(0);
});
test('加载包含 include、OBJ、STL 与 PNG 的工程', async ({page}) => {
await page.goto('/');
await page.locator('input[type="file"]').first().setInputFiles([
@@ -150,7 +193,7 @@ test('加载引用 OBJ 的 URDF 工程', async ({page}) => {
await expect(page.getByLabel('URDF 基座类型')).toHaveValue('floating');
await page.getByRole('button',{name:'通知中心'}).click();
const notifications=page.getByRole('dialog',{name:'通知中心'});
await expect(notifications).toContainText('URDF 兼容处理');
await expect(notifications).toContainText(/模型已加载 · \d+ 项兼容调整/);
await expect(notifications).toContainText(/URDF 已转换为 MJCF(浮动基座),并整体平移/);
await page.keyboard.press('Escape');
await expect(page.getByLabel('显示碰撞几何')).not.toBeChecked();