114 lines
3.4 KiB
TypeScript
114 lines
3.4 KiB
TypeScript
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);
|
|
});
|
|
}); |