Playwright 测试中如何禁用 JavaScript
Playwright 禁用 JavaScript:在 test.use({ javaScriptEnabled: false }) 中关闭(对当前 describe 生效),或在 playwright.config.ts 的 use 里全局设置。用于验证无 JS 环境下的可访问性与渐进增强基线。
在测试里用 test.use({ javaScriptEnabled: false }) 即可禁用 JavaScript——作用于当前 describe 块;想全局生效就在 playwright.config.ts 的 use 配置里加同一选项。禁用 JS 能暴露页面在无脚本环境下的真实表现:屏幕阅读器用户、严格安全策略浏览器、弱网脚本加载失败时的降级体验,都依赖这份基线。
单个测试组禁用
import { test, expect } from '@playwright/test';
test.describe('禁用 JavaScript', () => {
test.use({ javaScriptEnabled: false });
test('页面在无 JS 下仍可访问核心内容', async ({ page }) => {
await page.goto('https://example.com');
await expect(page.locator('h1')).toBeVisible();
});
});
全局禁用
// playwright.config.ts
export default defineConfig({
use: { javaScriptEnabled: false },
});
更实用的做法是定义一个专门的 project,同一套代码跑"有 JS / 无 JS"两组对照:
projects: [
{ name: 'js-on' },
{ name: 'js-off', use: { javaScriptEnabled: false } },
]
测试什么
- 核心内容是否服务端渲染可见(标题、正文、导航);
- 表单能否以原生提交方式工作;
- 关键链接是否为真实
<a href>而不是 JS 跳转; - 无 JS 时是否有合理的提示或降级样式。
常见问题(FAQ)
Q:禁用 JS 后 page.click 等操作还能用吗?
Playwright 自身的操作不受影响(它在浏览器协议层工作,不依赖页面 JS),但页面上依赖 JS 的交互当然全部失效——这正是要测试的状态。
Q:能模拟 JS 加载失败而非完全禁用吗?
可以用路由拦截:page.route('**/*.js', route => route.abort()),只阻断脚本请求,更接近"弱网脚本超时"的场景。
Q:这个选项对 SPA 意味着什么?
纯客户端渲染的 SPA 禁用 JS 后基本是空白页。如果测试暴露出这种情况,考虑引入 SSR/SSG 或至少提供 noscript 提示。