使用Selenium时,如何设置Safari浏览器拦截指定URL的网络请求?
Safari浏览器Java版Selenium拦截指定URL的方案
和Chrome通过启动参数修改域名映射的方式不同,Safari需要借助Selenium DevTools API实现请求拦截,具体步骤如下:
实现步骤与代码示例
import org.openqa.selenium.safari.SafariDriver; import org.openqa.selenium.safari.SafariOptions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v128.network.Network; import java.util.Optional; public class SafariUrlBlocker { public static void main(String[] args) { // 初始化Safari配置与驱动 SafariOptions options = new SafariOptions(); SafariDriver driver = new SafariDriver(options); // 启用DevTools会话 DevTools devTools = driver.getDevTools(); devTools.createSession(); // 开启网络监听能力 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 设置拦截规则:匹配目标URL后取消请求 devTools.addListener(Network.requestWillBeSent(), request -> { String requestUrl = request.getRequest().getUrl(); // 匹配需要拦截的域名/URL if (requestUrl.contains("www.googletagmanager.com")) { devTools.send(Network.cancelLoading(request.getRequestId())); } }); // 执行测试逻辑示例 driver.get("https://example.com"); // 关闭资源 driver.quit(); } }
关键注意事项
- 必须使用Selenium 4.x及以上版本,低版本不支持Safari的DevTools API
- 除了直接取消请求,也可根据需求调用
Network.redirectRequest()将请求重定向到本地地址(比如127.0.0.1) - 如需拦截多个URL,可扩展判断逻辑,例如用集合存储目标域名/URL,再批量匹配
另外,也可以通过修改系统hosts文件全局映射域名,但该方式是全局生效,无法仅针对单个测试会话隔离,适合不需要会话隔离的场景。
内容的提问来源于stack exchange,提问作者Dzmitry Kamarou
相关产品推荐
相关产品推荐

