native-environment.spec.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { test, expect } from '@playwright/test'
  2. test('shows device permissions only in Bot settings and keeps Web authorization read-only', async ({ page }, testInfo) => {
  3. await page.goto('/conversations')
  4. await page.getByRole('textbox', { name: '账号', exact: true }).fill('fixture')
  5. await page.getByRole('textbox', { name: '密码', exact: true }).fill('fixture-pass')
  6. await page.getByRole('button', { name: '登录', exact: true }).click()
  7. await expect(page.locator('.desktop-sidebar .sidebar-create-trigger')).toBeVisible()
  8. const seed = await (await page.request.post('/__test/computer', { data: {} })).json()
  9. await page.goto(`/conversations/${seed.conversationId}`)
  10. await page.getByRole('button', { name: '电脑与定时任务', exact: true }).click()
  11. const panel = page.getByRole('complementary', { name: '机器人电脑面板' })
  12. await expect(panel).toBeVisible()
  13. await expect(panel.locator('.host-permission')).toHaveCount(0)
  14. await expect(panel.locator('option[value^="desktop:"]')).toHaveCount(0)
  15. await expect(panel.getByRole('button', { name: /授权/ })).toHaveCount(0)
  16. await page.screenshot({ path: testInfo.outputPath('computer-panel.png') })
  17. await page.locator('.desktop-sidebar').getByRole('button', { name: '工具', exact: true }).click()
  18. await page.getByRole('menuitem', { name: 'Bot 设置', exact: true }).click()
  19. const settings = page.getByRole('dialog', { name: 'Bot 设置', exact: true })
  20. await settings.getByRole('button', { name: '环境与授权', exact: true }).click()
  21. const devices = settings.locator('.device-authorization')
  22. await expect(devices.locator('article').first()).toBeVisible()
  23. await expect(devices).toContainText('屏幕控制')
  24. await expect(devices).toContainText('浏览器和手机端仅可查看设备状态')
  25. await expect(devices.locator('article button')).toHaveCount(0)
  26. for (const theme of ['light', 'dark'] as const) {
  27. await page.emulateMedia({ colorScheme: theme, reducedMotion: 'reduce' })
  28. await page.screenshot({ path: testInfo.outputPath(`device-status-${theme}.png`) })
  29. }
  30. for (const viewport of [{ width: 375, height: 812 }, { width: 812, height: 375 }]) {
  31. await page.setViewportSize(viewport)
  32. await devices.locator('article').first().scrollIntoViewIfNeeded()
  33. expect(await page.evaluate(() => document.documentElement.scrollWidth > window.innerWidth)).toBe(false)
  34. expect(await devices.evaluate(element => element.scrollWidth > element.clientWidth)).toBe(false)
  35. await page.screenshot({ path: testInfo.outputPath(`device-status-${viewport.width}.png`) })
  36. }
  37. })