Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

54 rindas
3.8 KiB

  1. import {chromium,expect} from '@playwright/test';
  2. import assert from 'node:assert/strict';
  3. import fs from 'node:fs';
  4. import {login,call} from './role-permissions-live.mjs';
  5. import {manifest,videos,activeRelease} from '../../unreal_tran_web/src/features/virtual-training-scripts/narration-release.js';
  6. const dir='reports/bridge-narration-junhao-20260921';
  7. const origin=process.env.BASE_URL||'http://127.0.0.1:6180';
  8. const signed=await login('root'),results=[],errors=[];
  9. const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  10. const page=await browser.newPage({viewport:{width:1440,height:900}});
  11. await page.addInitScript(token=>{
  12. sessionStorage.setItem('unreal-tran:web:access-token:v1',token);
  13. localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));
  14. window.__prematureNarration=[];
  15. document.addEventListener('playing',e=>{
  16. if(e.target.matches?.('.training-server-video')&&document.querySelector('[data-role="loading"]:not(.is-hidden)'))window.__prematureNarration.push(e.target.currentSrc);
  17. },true);
  18. },signed.accessToken);
  19. page.on('pageerror',e=>errors.push(e.message));
  20. try{
  21. for(const [i,pack]of manifest.scripts.entries()){
  22. const task=(await call('tran/v1/teaching/assignments/'+(86+i),signed.accessToken)).data;
  23. const videoPack=videos.scripts.find(p=>p.code===pack.code);
  24. await page.goto(`${origin}/teaching/virtual-training/preview/${task.id}`);
  25. await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});
  26. const skip=page.locator('.training-introduction [data-intro-command="skip"]');if(await skip.isVisible())await skip.click();
  27. const launch=page.locator('[data-role="teacher-launch"]');if(await launch.isVisible())await launch.click();
  28. const toggle=page.locator('[data-action="toggle-teacher-media"]');
  29. await expect(toggle).toContainText('切换语音');
  30. await page.locator('[data-action="teacher-speak"]').click();
  31. const media=page.locator('.training-server-video');
  32. await expect(media).toBeVisible();
  33. await expect.poll(()=>media.evaluate(v=>v.currentTime),{timeout:20000}).toBeGreaterThan(.1);
  34. const playback=await media.evaluate(v=>({src:new URL(v.currentSrc).pathname,width:v.videoWidth,height:v.videoHeight,error:v.error?.message}));
  35. assert.equal(playback.src,videoPack.steps[0].url);assert.deepEqual([playback.width,playback.height],[480,640]);assert.equal(playback.error,undefined);
  36. await page.screenshot({path:`${dir}/${pack.code}-new-video.png`});
  37. await toggle.click();await expect(media).toBeHidden();
  38. await expect.poll(()=>media.evaluate(v=>new URL(v.currentSrc||v.src,location.href).pathname)).toBe(pack.steps[0].url);
  39. await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
  40. await toggle.click();await expect(media).toBeVisible();
  41. await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
  42. await media.evaluate(v=>{v.src='data:video/mp4;base64,AA==';v.load();});
  43. await expect(media).toBeHidden();
  44. await expect.poll(()=>media.evaluate(v=>new URL(v.currentSrc||v.src,location.href).pathname)).toBe(pack.steps[0].url);
  45. await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
  46. assert.deepEqual(await page.evaluate(()=>window.__prematureNarration),[]);
  47. results.push({code:pack.code,activeRelease,defaultVideo:true,newVideo:playback.src,newAudioFallback:pack.steps[0].url,failedVideoFallback:true,noPlaybackDuringLoading:true});
  48. console.log('PASS',pack.code);
  49. }
  50. assert.deepEqual(errors,[]);
  51. fs.writeFileSync(`${dir}/${origin.includes('127.0.0.1')?'playback':'lan-playback'}.json`,JSON.stringify({origin,pass:true,results,errors},null,2));
  52. }catch(e){await page.screenshot({path:`${dir}/playback-failure.png`}).catch(()=>{});fs.writeFileSync(`${dir}/playback-failure.json`,JSON.stringify({error:e.message,results,errors},null,2));throw e;}
  53. finally{await browser.close();}