如何使用Java + Selenium WebDriver保存并加载所有Cookie
核心说明
原生driver.manage().getCookies()仅支持获取当前活跃页面对应域名的Cookie,要获取浏览器实例内所有域名的全量Cookie,需调用Chrome DevTools Protocol(CDP)接口实现,addCookie单条添加的限制可以通过循环遍历批量处理解决。
完整实现
前置依赖
本方案基于Selenium 4.0+版本实现,无需额外引入第三方依赖,旧版本Selenium可通过driver.executeCdpCommand()直接执行CDP命令达到相同效果。
1. 保存全域名Cookie到txt文件
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v125.network.Network; import org.openqa.selenium.devtools.v125.network.model.Cookie; import java.io.File; import java.io.IOException; import java.util.List; public class CookieSaver { public static void saveAllCookies(ChromeDriver driver, String filePath) throws IOException { // 开启DevTools连接 DevTools devTools = driver.getDevTools(); devTools.createSessionIfThereIsNotOne(); // 启用Network域 devTools.send(Network.enable(java.util.Optional.empty(), java.util.Optional.empty(), java.util.Optional.empty())); // 获取所有域名的全部Cookie List<Cookie> allCookies = devTools.send(Network.getAllCookies()); // 序列化Cookie列表写入txt文件 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writeValue(new File(filePath), allCookies); } }
注:代码中v125对应你的Chrome浏览器大版本,需和本地Chrome版本匹配,也可以用不带版本的通用DevTools接口
2. 从txt文件加载全量Cookie恢复会话
添加Cookie前需要先导航到对应Cookie的域名下(Selenium限制添加Cookie时当前页面必须属于目标域名),可通过访问对应域名的静态资源(如favicon.ico)避免跳转影响业务逻辑:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.v125.network.model.Cookie; import java.io.File; import java.io.IOException; import java.util.List; public class CookieLoader { public static void loadAllCookies(ChromeDriver driver, String filePath) throws IOException { // 读取文件中的Cookie列表 ObjectMapper objectMapper = new ObjectMapper(); List<Cookie> savedCookies = objectMapper.readValue(new File(filePath), new TypeReference<List<Cookie>>() {}); for (Cookie cookie : savedCookies) { // 处理域名前缀的点号,避免访问失败 String domain = cookie.getDomain().startsWith(".") ? cookie.getDomain().substring(1) : cookie.getDomain(); // 先导航到对应域名的静态资源页,满足Cookie添加的域名限制 driver.get(String.format("https://%s/favicon.ico", domain)); // 构建并添加Cookie org.openqa.selenium.Cookie seleniumCookie = new org.openqa.selenium.Cookie.Builder(cookie.getName(), cookie.getValue()) .domain(cookie.getDomain()) .path(cookie.getPath()) .isSecure(cookie.getSecure()) .isHttpOnly(cookie.getHttpOnly()) .expiresOn(cookie.getExpires() != null ? java.util.Date.from(cookie.getExpires()) : null) .build(); driver.manage().addCookie(seleniumCookie); } } }
注意事项
- 本方案默认适配Chromium内核浏览器(Chrome、Edge等),Firefox等其他内核浏览器可替换为对应内核的DevTools接口,逻辑一致
- 存储Cookie的txt文件包含身份敏感信息,生产环境使用建议做加密存储
- 如果Cookie对应域名只支持HTTP协议,导航时将
https替换为http即可
内容的提问来源于stack exchange,提问作者S.O.S
相关产品推荐
相关产品推荐

