You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无头Chrome中允许或阻止通知弹窗(Protractor测试场景)

嘿,我来帮你搞定无头Chrome下Protractor测试的通知权限问题,分几个关键点给你梳理清楚:

1. 先明确:无头Chrome会弹出通知弹窗吗?

其实无头模式下不会显示可视化的通知弹窗,但浏览器的通知权限状态是真实存在的——如果你的测试逻辑依赖权限状态(比如判断用户是否允许通知、后续业务逻辑是否触发),还是需要主动配置,不然可能和非无头模式的测试行为不一致。

2. 如何检测当前是否为无头模式?

你可以用两种简单的方式判断,方便后续根据模式切换配置:

  • 方式一:通过浏览器版本信息检测(最可靠)
async function isHeadless() {
  const browserCapabilities = await browser.getCapabilities();
  const browserVersion = browserCapabilities.get('browserVersion');
  // 无头Chrome的版本字符串里会包含"HeadlessChrome"标识
  return browserVersion.includes('HeadlessChrome');
}
  • 方式二:通过userAgent判断(简单快捷,测试环境足够用)
async function isHeadless() {
  const userAgent = await browser.executeScript(() => navigator.userAgent);
  return userAgent.includes('HeadlessChrome');
}
3. 配置通知权限:允许/阻止

不管是Angular还是非Angular应用,核心都是通过Chrome启动参数或CDP(Chrome DevTools协议)来设置,分两种场景:

3.1 全局静态配置(启动Chrome时直接生效)

在你的protractor.conf.js的capabilities中添加ChromeOptions参数,一次性配置所有站点的通知权限:

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: [
      '--headless=new', // 推荐用新版无头模式,行为更接近正常Chrome
      '--disable-gpu',
      // 允许所有站点的通知权限
      '--permissions-policy=notifications=*',
      // 如果要全局阻止通知,替换成下面这行
      // '--permissions-policy=notifications=()'
    ]
  }
}

注意:--permissions-policy是新版Chrome推荐的参数,替代了旧的--disable-notifications或--use-fake-ui-for-media-stream,对无头模式兼容性更好。

3.2 动态配置(测试过程中针对特定站点调整)

如果需要在测试中动态切换权限,或者只给某个目标站点设置权限,可以用CDP的Permissions API:

async function setNotificationPermission(permission = 'granted') {
  // 获取当前页面的Origin
  const currentOrigin = await browser.executeScript(() => window.location.origin);
  // 通过CDP发送权限设置命令
  await browser.driver.sendChromeCommand('Browser.setPermission', {
    origin: currentOrigin,
    permission: 'notifications',
    setting: permission // 可选值:granted(允许)、denied(阻止)、prompt(弹窗询问)
  });
}

// 在测试中使用:
beforeEach(async () => {
  const isHeadlessMode = await isHeadless();
  if (isHeadlessMode) {
    await setNotificationPermission('granted'); // 根据需求设置为granted或denied
  } else {
    // 这里复用你已经实现的非无头模式的权限配置逻辑
  }
});
4. Angular vs 非Angular应用的注意点

权限配置本身和应用是否基于Angular无关,都是浏览器层面的设置,但有个小细节要留意:

  • Angular应用中,如果通知请求是在组件初始化时触发的,要确保等待Angular稳定后再操作(比如用browser.waitForAngularEnabled(true),或者结合ExpectedConditions等待组件加载完成)
  • 非Angular应用则不需要等待Angular,直接设置权限后访问页面即可

内容的提问来源于stack exchange,提问作者Aditya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:46