From 0074a9aab16741714784446123ff244b1ff7d418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Thu, 5 Mar 2026 15:48:07 +0800 Subject: [PATCH] feat: add mobile PWA functionality test suite --- .../mobile/pwa/pwa-functionality.spec.ts | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 e2e/src/tests/mobile/pwa/pwa-functionality.spec.ts diff --git a/e2e/src/tests/mobile/pwa/pwa-functionality.spec.ts b/e2e/src/tests/mobile/pwa/pwa-functionality.spec.ts new file mode 100644 index 0000000..0c7a011 --- /dev/null +++ b/e2e/src/tests/mobile/pwa/pwa-functionality.spec.ts @@ -0,0 +1,114 @@ +import { test, expect } from '@playwright/test'; + +test.describe('移动端 PWA 功能测试 @mobile @pwa', () => { + test('Service Worker 注册成功', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }); + await page.goto('/'); + + const swRegistration = await page.evaluate(() => { + return new Promise((resolve) => { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.getRegistration().then((registration) => { + resolve(registration !== null); + }).catch(() => { + resolve(false); + }); + } else { + resolve(false); + } + }); + }); + + expect(swRegistration).toBe(true); + }); + + test('离线功能正常', async ({ page, context }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/'); + await page.waitForLoadState('networkidle'); + + await context.setOffline(true); + + await page.reload(); + await expect(page.locator('header')).toBeVisible(); + await expect(page.locator('main')).toBeVisible(); + + await context.setOffline(false); + }); + + test('离线缓存功能正常', async ({ page, context }) => { + await page.setViewportSize({ width: 414, height: 896 }); + await page.goto('/'); + await page.waitForLoadState('networkidle'); + + await context.setOffline(true); + + await page.reload(); + await expect(page.locator('header')).toBeVisible(); + await expect(page.locator('main')).toBeVisible(); + + await context.setOffline(false); + }); + + test('PWA manifest 加载正常', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }); + await page.goto('/'); + + const manifestLink = await page.evaluate(() => { + const link = document.querySelector('link[rel="manifest"]'); + return link ? link.getAttribute('href') : null; + }); + + expect(manifestLink).toBeTruthy(); + }); + + test('PWA 可安装提示', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/'); + + const beforeInstallPrompt = await page.evaluate(() => { + return new Promise((resolve) => { + let promptFired = false; + + window.addEventListener('beforeinstallprompt', () => { + promptFired = true; + resolve(true); + }); + + setTimeout(() => { + resolve(promptFired); + }, 2000); + }); + }); + + expect(beforeInstallPrompt).toBeDefined(); + }); + + test('PWA 响应式设计', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }); + await page.goto('/'); + + await expect(page.locator('header')).toBeVisible(); + await expect(page.locator('main')).toBeVisible(); + await expect(page.locator('footer')).toBeVisible(); + + await page.setViewportSize({ width: 768, height: 1024 }); + + await expect(page.locator('header')).toBeVisible(); + await expect(page.locator('main')).toBeVisible(); + await expect(page.locator('footer')).toBeVisible(); + }); + + test('PWA 离线页面显示', async ({ page, context }) => { + await page.setViewportSize({ width: 414, height: 896 }); + await page.goto('/'); + await page.waitForLoadState('networkidle'); + + await context.setOffline(true); + + await page.goto('/offline'); + await expect(page.locator('h1')).toContainText('离线'); + + await context.setOffline(false); + }); +}); \ No newline at end of file