Playwright 测试中如何禁用 JavaScript

Playwright 禁用 JavaScript:在 test.use({ javaScriptEnabled: false }) 中关闭(对当前 describe 生效),或在 playwright.config.ts 的 use 里全局设置。用于验证无 JS 环境下的可访问性与渐进增强基线。

最佳实践
Node.js 事件循环与异步任务示意

在测试里用 test.use({ javaScriptEnabled: false }) 即可禁用 JavaScript——作用于当前 describe 块;想全局生效就在 playwright.config.ts 的 use 配置里加同一选项。禁用 JS 能暴露页面在无脚本环境下的真实表现:严格安全策略浏览器、脚本加载失败时的降级体验可据此检查;屏幕阅读器通常也会在启用 JS 的浏览器中工作,无 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
import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: { javaScriptEnabled: false },
});

更实用的做法是定义一个专门的 project,同一套代码跑"有 JS / 无 JS"两组对照:

projects: [
  { name: 'js-on', use: { javaScriptEnabled: true } },
  { name: 'js-off', use: { javaScriptEnabled: false } },
]

测试什么

  • 核心内容是否服务端渲染可见(标题、正文、导航);
  • 表单能否以原生提交方式工作;
  • 关键链接是否为真实 <a href> 而不是 JS 跳转;
  • 无 JS 时是否有合理的提示或降级样式。

常见问题(FAQ)

Q:禁用 JS 后 page.click 等操作还能用吗?

Playwright 自身的操作不受影响(它在浏览器协议层工作,不依赖页面 JS),但页面上依赖 JS 的交互当然全部失效——这正是要测试的状态。

Q:能模拟 JS 加载失败而非完全禁用吗?

可以在导航前按资源类型拦截:await page.route('**/*', route => route.request().resourceType() === 'script' ? route.abort() : route.continue())。它阻断脚本请求,但不禁用内联或已加载脚本;主动中止也不等于模拟网络超时,并须注意 Service Worker 的拦截边界。

Q:这个选项对 SPA 意味着什么?

纯客户端渲染的 SPA 禁用 JS 后基本是空白页。如果测试暴露出这种情况,考虑引入 SSR/SSG 或至少提供 noscript 提示。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台