You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

54 lines
3.1 KiB

  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import assert from 'node:assert/strict';
  4. import { chromium } from '@playwright/test';
  5. const report = path.resolve('reports/instructors-v2-20260914');
  6. const origin = 'http://127.0.0.1:8003';
  7. const values = new Map(fs.readFileSync('../账号.MD', 'utf8').split(/\r?\n/).flatMap(line => {
  8. const match = line.match(/^\s*([^::]+)\s*[::]\s*(.*?)\s*$/);
  9. return match ? [[match[1].trim(), match[2].trim()]] : [];
  10. }));
  11. const browser = await chromium.launch({ channel: 'msedge', headless: true,
  12. args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] });
  13. try {
  14. const context = await browser.newContext({ viewport: { width: 1920, height: 1080 } });
  15. const page = await context.newPage();
  16. const errors = [];
  17. page.on('pageerror', error => errors.push(error.message));
  18. await page.goto(origin + '/login');
  19. await page.locator('[data-role-code="admin"]').click();
  20. await page.locator('input[name="username"]').fill(values.get('账号') || values.get('用户名'));
  21. await page.locator('input[name="password"]').fill(values.get('密码'));
  22. await page.getByRole('button', { name: /^(?:登录|登录系统|正在验证身份)$/ }).click();
  23. await page.waitForURL(url => !url.pathname.startsWith('/login'), { timeout: 30000 });
  24. await page.goto(origin + '/assets/avatars');
  25. await page.locator('.avatar-card').first().waitFor();
  26. assert.equal(await page.locator('.avatar-card').count(), 3);
  27. await page.waitForFunction(() => [...document.querySelectorAll('.avatar-cover img')].every(image => image.complete && image.naturalWidth > 0));
  28. await page.screenshot({ path: report + '/catalog-v2.png', fullPage: true });
  29. const cards = await page.locator('.avatar-card').allTextContents();
  30. assert.ok(cards.find(text => text.includes('教员2'))?.includes('默认数字人'));
  31. const previews = [];
  32. for (const number of [1, 2, 3]) {
  33. const card = page.locator('.avatar-card').filter({ has: page.getByRole('heading', { name: `教员${number}`, exact: true }) });
  34. await card.getByRole('button', { name: '预览', exact: true }).click();
  35. const dialog = page.locator('.el-dialog:visible');
  36. await dialog.waitFor();
  37. const iframe = dialog.locator('iframe');
  38. await iframe.waitFor();
  39. const source = await iframe.getAttribute('src');
  40. assert.ok(source.includes(`a100000000000000000000000000000${number + 4}`));
  41. const frame = await (await iframe.elementHandle()).contentFrame();
  42. await frame.waitForFunction(() => window.DH_RUNTIME_READY, {}, { timeout: 120000 });
  43. await page.screenshot({ path: `${report}/catalog-preview-${number}.png`, fullPage: true });
  44. previews.push({ number, viewer: source, ready: true });
  45. await dialog.locator('.el-dialog__headerbtn').click();
  46. await dialog.waitFor({ state: 'hidden' });
  47. }
  48. assert.deepEqual(errors, []);
  49. const result = { count: 3, defaultInstructor: 2, previews, errors };
  50. fs.writeFileSync(`${report}/catalog-validation.json`, JSON.stringify(result, null, 2));
  51. console.log(JSON.stringify(result));
  52. } finally { await browser.close(); }