|
- import {chromium,expect} from '@playwright/test';
- import assert from 'node:assert/strict';
- import fs from 'node:fs';
- import {login,call} from './role-permissions-live.mjs';
- import {manifest,videos,activeRelease} from '../../unreal_tran_web/src/features/virtual-training-scripts/narration-release.js';
- const dir='reports/bridge-narration-junhao-20260921';
- const origin=process.env.BASE_URL||'http://127.0.0.1:6180';
- const signed=await login('root'),results=[],errors=[];
- const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
- const page=await browser.newPage({viewport:{width:1440,height:900}});
- await page.addInitScript(token=>{
- sessionStorage.setItem('unreal-tran:web:access-token:v1',token);
- localStorage.setItem('unreal-tran:web:preferences:v1',JSON.stringify({themeMode:'military'}));
- window.__prematureNarration=[];
- document.addEventListener('playing',e=>{
- if(e.target.matches?.('.training-server-video')&&document.querySelector('[data-role="loading"]:not(.is-hidden)'))window.__prematureNarration.push(e.target.currentSrc);
- },true);
- },signed.accessToken);
- page.on('pageerror',e=>errors.push(e.message));
- try{
- for(const [i,pack]of manifest.scripts.entries()){
- const task=(await call('tran/v1/teaching/assignments/'+(86+i),signed.accessToken)).data;
- const videoPack=videos.scripts.find(p=>p.code===pack.code);
- await page.goto(`${origin}/teaching/virtual-training/preview/${task.id}`);
- await expect(page.locator('[data-role="loading"]')).toHaveClass(/is-hidden/,{timeout:120000});
- const skip=page.locator('.training-introduction [data-intro-command="skip"]');if(await skip.isVisible())await skip.click();
- const launch=page.locator('[data-role="teacher-launch"]');if(await launch.isVisible())await launch.click();
- const toggle=page.locator('[data-action="toggle-teacher-media"]');
- await expect(toggle).toContainText('切换语音');
- await page.locator('[data-action="teacher-speak"]').click();
- const media=page.locator('.training-server-video');
- await expect(media).toBeVisible();
- await expect.poll(()=>media.evaluate(v=>v.currentTime),{timeout:20000}).toBeGreaterThan(.1);
- const playback=await media.evaluate(v=>({src:new URL(v.currentSrc).pathname,width:v.videoWidth,height:v.videoHeight,error:v.error?.message}));
- assert.equal(playback.src,videoPack.steps[0].url);assert.deepEqual([playback.width,playback.height],[480,640]);assert.equal(playback.error,undefined);
- await page.screenshot({path:`${dir}/${pack.code}-new-video.png`});
- await toggle.click();await expect(media).toBeHidden();
- await expect.poll(()=>media.evaluate(v=>new URL(v.currentSrc||v.src,location.href).pathname)).toBe(pack.steps[0].url);
- await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
- await toggle.click();await expect(media).toBeVisible();
- await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
- await media.evaluate(v=>{v.src='data:video/mp4;base64,AA==';v.load();});
- await expect(media).toBeHidden();
- await expect.poll(()=>media.evaluate(v=>new URL(v.currentSrc||v.src,location.href).pathname)).toBe(pack.steps[0].url);
- await expect.poll(()=>media.evaluate(v=>v.currentTime)).toBeGreaterThan(.1);
- assert.deepEqual(await page.evaluate(()=>window.__prematureNarration),[]);
- results.push({code:pack.code,activeRelease,defaultVideo:true,newVideo:playback.src,newAudioFallback:pack.steps[0].url,failedVideoFallback:true,noPlaybackDuringLoading:true});
- console.log('PASS',pack.code);
- }
- assert.deepEqual(errors,[]);
- fs.writeFileSync(`${dir}/${origin.includes('127.0.0.1')?'playback':'lan-playback'}.json`,JSON.stringify({origin,pass:true,results,errors},null,2));
- }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;}
- finally{await browser.close();}
|