Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

38 Zeilen
3.4 KiB

  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import assert from 'node:assert/strict';
  4. import {chromium,expect} from '@playwright/test';
  5. import {login,call} from './role-permissions-live.mjs';
  6. const report=path.resolve('reports/animation-capabilities-20260912'),f=JSON.parse(fs.readFileSync(path.join(report,'fixture.json'),'utf8'));
  7. const session=await login('root'),browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  8. const context=await browser.newContext({viewport:{width:1920,height:1080}});
  9. await context.addInitScript(s=>{sessionStorage.setItem('unreal-tran:web:access-token:v1',s.accessToken);sessionStorage.setItem('unreal-tran:web:refresh-token:v1',s.refreshToken)},session);
  10. const page=await context.newPage(),checks=[],errors=[];page.on('pageerror',e=>errors.push(e.message));
  11. try{
  12. await page.goto(`http://127.0.0.1:6180/content/training-projects/${f.animationTrainingId}/legacy`);
  13. const open=page.locator('[data-action="open-content-resources"][data-resource-scope="animation"]');
  14. await expect(open).toBeVisible({timeout:60000});await open.click();
  15. const key=`animation-content-model-${f.modelId}-${f.modelVersionId}-work`;
  16. const button=page.locator(`[data-action="bind-content-resource"][data-resource-id="${key}"]`);
  17. await expect(button).toBeVisible({timeout:60000});
  18. await expect(page.locator(`[data-resource-id="animation-content-model-${f.modelId}-${f.modelVersionId}-reset"]`)).toBeVisible();
  19. await button.scrollIntoViewIfNeeded();await page.screenshot({path:path.join(report,'11-training-action-library.png')});
  20. if(await button.innerText()==='取消绑定')await button.click();
  21. await button.click();
  22. await page.locator('[data-action="close-dialog"]').last().click();
  23. await expect(page.locator('.te-step-animation-binding')).toContainText('旋出与清洁演示');
  24. const save=page.locator('[data-action="save"]');console.log('SAVE_COUNT',await save.count());
  25. const wait=page.waitForResponse(r=>r.request().method()==='PUT'&&r.url().includes(`/content/projects/${f.animationTrainingId}`),{timeout:60000});
  26. await save.click();const response=await wait;assert.ok(response.ok(),(await response.text()).slice(0,200));
  27. const result=await call(`tran/v1/content/projects/${f.animationTrainingId}`,session.accessToken);
  28. const binding=result.data.currentVersion.content.steps[0].animationBinding;
  29. assert.equal(binding.clipName,'旋出与清洁演示');assert.equal(binding.modelAssetId,`content-model-${f.modelId}-${f.modelVersionId}`);
  30. checks.push({name:'训练编辑器从正式模型库选择命名动作并通过真实保存接口持久化',pass:true,binding});
  31. await page.screenshot({path:path.join(report,'12-training-action-bound.png')});
  32. const assignment=await call(`tran/v1/teaching/assignments/${f.animationAssignmentId}`,session.accessToken);
  33. assert.equal(assignment.data.contentVersionId,f.animationAssignmentContentVersionId || '482');
  34. checks.push({name:'训练编辑草稿不会覆盖已创建任务的固定发布快照',pass:true});
  35. assert.equal(errors.length,0,errors.join('\n'));
  36. }catch(error){checks.push({name:'训练动画绑定端到端',pass:false,error:error.message});process.exitCode=1;console.error(error.message);await page.screenshot({path:path.join(report,'training-editor-failure.png')}).catch(()=>{});}
  37. finally{fs.writeFileSync(path.join(report,'training-editor-checks.json'),JSON.stringify({checks,errors},null,2));await browser.close();}