如何使用Selenium WebDriver Java在无头Chrome中启用通知权限
Chrome传统无头模式(headless参数)的运行逻辑和普通模式不同,不支持加载通过setExperimentalOption配置的prefs内容设置项,你配置的通知权限规则属于这类,所以无头模式下配置会失效。
解决方案
方案1:使用新版无头模式(推荐,Chrome 112及以上版本支持)
新版无头模式的功能和普通Chrome完全对齐,完美支持prefs配置,仅需替换无头模式启动参数即可,修改后代码如下:
if (browserName.equalsIgnoreCase("chrome_headless")) { System.setProperty("webdriver.chrome.driver", "lib/chromedriver.exe"); Map<String, Object> prefs = new HashMap<String, Object>(); // 1代表允许通知,2代表阻止,0为默认 prefs.put("profile.default_content_setting_values.notifications", 1); ChromeOptions options = new ChromeOptions(); // 替换原来的headless参数为新版无头 options.addArguments("headless=new"); options.addArguments("window-size=1366,768"); options.setExperimentalOption("prefs", prefs); driver = new ChromeDriver(options); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(15,TimeUnit.SECONDS); }
方案2:低版本Chrome兼容方案
如果你的Chrome版本低于112,无法使用新版无头模式,可以通过Chrome DevTools协议主动为站点授予通知权限,代码示例如下:
// 初始化driver后执行 ChromeDriver chromeDriver = (ChromeDriver) driver; // 给目标站点授予通知权限,替换成你测试的站点域名 Map<String, Object> permission = new HashMap<>(); permission.put("name", "notifications"); permission.put("origin", "https://你的测试站点域名.com"); permission.put("permission", "granted"); chromeDriver.executeCdpCommand("Browser.setPermission", permission);
内容的提问来源于stack exchange,提问作者Monita Shinkar
相关产品推荐
相关产品推荐

