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.
 
 
 
 

72 Zeilen
4.8 KiB

  1. import { captureScreenshot, expect, test } from './fixtures'
  2. import { TeachingContractMock } from './teaching-contract-mock'
  3. test.describe('教员只读预览工作台', () => {
  4. test('按原型呈现完整工作台且所有演练保持浏览器本地只读', async ({ page }, testInfo) => {
  5. await page.setViewportSize({ width: 1920, height: 1080 })
  6. const contract = new TeachingContractMock('admin')
  7. await contract.install(page)
  8. await page.goto('/teaching/virtual-training/preview/assignment-virtual-preview')
  9. const workbench = page.locator('.teaching-preview-workbench')
  10. await expect(workbench).toBeVisible()
  11. await expect(workbench).toContainText('教员预览 · 不计成绩')
  12. await expect(workbench.locator('.preview-step-panel > header')).toContainText('1 / 8')
  13. await expect(workbench.locator('.preview-step-panel li')).toHaveCount(8)
  14. await expect(workbench.locator('.preview-step-panel')).toContainText('卸压确认与故障基线采集')
  15. await expect(workbench.locator('.preview-step-panel')).toContainText('密封复验与中修闭环')
  16. await expect(workbench.locator('.preview-runtime-viewport canvas')).toBeVisible()
  17. await expect(workbench.locator('.preview-digital-teacher')).toContainText('点火系统维修教研员')
  18. await expect(workbench.locator('.preview-digital-teacher')).toContainText('确认压力表回零,记录故障压力和泄漏现象。')
  19. await expect(workbench.locator('.preview-digital-teacher img')).toHaveJSProperty('complete', true)
  20. await expect(workbench.locator('iframe')).toHaveCount(0)
  21. await captureScreenshot(page, testInfo, 'teaching-teacher-preview-initial')
  22. const writesBefore = contract.requests.filter((request) => ['POST', 'PUT', 'DELETE'].includes(request.method)).length
  23. await workbench.getByRole('button', { name: '打开在线答疑', exact: true }).click()
  24. const onlineDrawer = page.locator('.el-drawer:visible').filter({ hasText: '点火系统维修教研员 · 在线答疑' }).last()
  25. const digitalInstructor = onlineDrawer.getByTestId('digital-instructor-embed')
  26. await expect(digitalInstructor).toBeVisible()
  27. const instructorFrame = digitalInstructor.locator('iframe')
  28. await expect(instructorFrame).toHaveAttribute('src', /\/embed\/dh-b69424ed0904\?open=1$/)
  29. await expect(instructorFrame).toHaveAttribute('allow', 'autoplay; microphone')
  30. await expect(digitalInstructor.locator('.digital-instructor-embed__status')).toHaveText('页面已加载')
  31. await expect(page.frameLocator('[data-testid="digital-instructor-embed"] iframe').getByTestId('mock-ai-person')).toHaveText('虚拟教员在线答疑')
  32. await expect.poll(() => contract.digitalInstructorFrameLoads).toBe(1)
  33. expect(contract.requests.filter((request) => ['POST', 'PUT', 'DELETE'].includes(request.method))).toHaveLength(writesBefore)
  34. await page.keyboard.press('Escape')
  35. await expect(onlineDrawer).toBeHidden()
  36. await expect(page.locator('[data-testid="digital-instructor-embed"] iframe')).toHaveCount(0)
  37. await workbench.getByRole('button', { name: '判定详情', exact: true }).click()
  38. await expect(workbench.locator('.preview-rule-drawer')).toContainText('RELEASE_PRESSURE_BASELINE')
  39. await expect(workbench.locator('.preview-rule-drawer')).toContainText('这里只展示发布快照中的公开字段')
  40. await workbench.getByRole('button', { name: '规则演示', exact: true }).click()
  41. await workbench.getByRole('button', { name: '步骤演示', exact: true }).click()
  42. await workbench.getByRole('button', { name: '引导完成', exact: true }).click()
  43. await expect(workbench.getByRole('button', { name: /下一步/ })).toBeEnabled()
  44. await workbench.getByRole('button', { name: /下一步/ }).click()
  45. await expect(workbench.getByRole('heading', { name: /第 2 步:油管与接头外泄检查/ })).toBeVisible()
  46. await expect(workbench.locator('.preview-step-panel > header')).toContainText('2 / 8')
  47. await workbench.getByRole('button', { name: /过程记录/ }).click()
  48. const drawer = page.locator('.el-drawer:visible').last()
  49. await expect(drawer).toContainText('不会提交到教学事件接口')
  50. await expect(drawer).toContainText('本地试走步骤')
  51. await expect(drawer).toContainText('规则演示')
  52. await expect(drawer).toContainText('步骤演示')
  53. const writesAfter = contract.requests.filter((request) => ['POST', 'PUT', 'DELETE'].includes(request.method)).length
  54. expect(writesAfter).toBe(writesBefore)
  55. await page.keyboard.press('Escape')
  56. await expect(drawer).toBeHidden()
  57. await captureScreenshot(page, testInfo, 'teaching-teacher-preview-workbench')
  58. await workbench.getByRole('button', { name: '返回任务列表', exact: true }).click()
  59. await expect(page).toHaveURL(/\/teaching\/virtual-training$/)
  60. })
  61. })