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

如何在Browserstack中关闭Safari推送通知弹窗?

解决BrowserStack中Safari推送通知权限弹窗阻塞自动化测试的问题

我之前也碰到过一模一样的坑!Safari的推送权限弹窗是系统原生弹窗,根本不是JavaScript生成的alert,所以你用browser.switchTo().alert()肯定抓不到,窗口切换也没用——它压根就不是新窗口。下面给你几个靠谱的解决办法:

方法1:用BrowserStack原生能力提前授予权限

BrowserStack提供了专门针对Safari权限配置的Desired Capability,直接在测试初始化时设置推送通知为允许,从根源上避免弹窗出现。

给你几个主流语言的示例:

  • Java:
    DesiredCapabilities caps = new DesiredCapabilities();
    // 配置推送通知权限为允许
    caps.setCapability("browserstack.safari.permissions", "{\"notifications\": \"allow\"}");
    // 其他必要配置(比如浏览器版本、设备信息等)
    caps.setCapability("browser", "Safari");
    caps.setCapability("browser_version", "16.0");
    
  • Python:
    desired_cap = {
        "browserstack.safari.permissions": '{"notifications": "allow"}',
        "browser": "Safari",
        "browser_version": "16.0"
        # 其他测试配置项
    }
    

这个方法是最推荐的,直接通过BrowserStack底层配置搞定,不需要修改测试逻辑或页面代码。

方法2:Mock Notification.requestPermission() 方法

如果因为某些限制没法用BrowserStack的权限配置,可以在页面加载前注入JavaScript,把请求权限的方法mock掉,让它直接返回"granted",这样页面就不会触发弹窗了。

示例代码(以Selenium Java为例):

// 在访问目标页面之前执行这段脚本
browser.executeScript("Notification.requestPermission = function() { return Promise.resolve('granted'); };");
// 然后再打开测试页面
browser.get("your-test-url");

这个思路是拦截页面的权限请求,直接模拟用户授权的结果,适合无法修改浏览器配置的场景。

补充:为什么之前的方法没用?

再给你理清楚原因:Safari的推送通知弹窗是系统级的UI元素,不属于WebDriver能控制的浏览器DOM或JavaScript上下文范畴,所以常规的alert切换、窗口切换方法对它完全无效——WebDriver管不到系统原生弹窗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:33