记录一次 Selenium WebDriver 无法正常加载 www.xxx.com 域名 Cookie 文件的解决办法

本贴最后更新于 2275 天前,其中的信息可能已经物是人非

具体问题为,在使用 WebDriver 正常登录网址后,进行了 Cookie 保存,但在下次自动反序列化加载 Cookie 时发现无法正常加载,导致每次需要重新登录验证,目前采用了一种曲线救国的方式,在序列化 Cookie 时调整域名为 xxx.com,具体方案如下。

具体问题大家也可以参见:Add cookie exception when dot exists before domain name

首先,在成功登录后序列化 Cookie 时:

/** * 序列化CookieStore * @param driver WebDriver * @param cookieFile 序列化地址 * @return 是否序列化成功 */ public static boolean saveCookies(WebDriver driver, String cookieFile){ try{ Options options = driver.manage(); Set<Cookie> cookieSet = options.getCookies(); CookieStore cookieStore = CookieUtils.driverCookie2HttpCookie(cookieSet); return ObjectUtils.serializeFile(cookieStore, cookieFile); }catch(Exception e){ e.printStackTrace(); return false; } }
/** * 将获取的DriverCookie值转换为HttpCookie * @param driver WebDriver * @return CookieStore */ public static CookieStore driverCookie2HttpCookie(Set<org.openqa.selenium.Cookie> cookies) { CookieStore store = new BasicCookieStore(); for (org.openqa.selenium.Cookie cookie : cookies) { BasicClientCookie bcc = new BasicClientCookie(cookie.getName(), cookie.getValue()); // log.debug("[" + cookie.getName() + "]=[" + cookie.getValue() + "]" + cookie.getDomain() == null ? "" : cookie.getDomain()); // 整理Cookie,将www去掉,否则Driver在addCookies时将会自动在前面加.,即www.abc.com变成.www.abc.com,从而无法使用 String domain = cookie.getDomain(); bcc.setDomain(StringUtils.isEmpty(domain) ? null : domain.startWiths("www") ? domain.substring(3) : domain); bcc.setPath(cookie.getPath().equals("//") ? "/" : cookie.getPath()); bcc.setExpiryDate(cookie.getExpiry()); store.addCookie(bcc); } return store; }

然后就可以在下次加载 WebDriver 时正常加载 Cookie 了

/** * 给指定的URL填充Cookie * @param url 要加载的地址 */ protected void addCookies(String url) { driver.get(url); if(null != cookieStore){ driver.addCookies(cookieStore); driver.refresh(); driver.waitPageLoad(); } }
/** * 给Driver增加Cookie * @param driver * @return */ public void addCookies(CookieStore cookieStore) { Options options = driver.manage(); List<Cookie> cookieList = CookieUtils.httpCookie2DriverCookie(cookieStore); for(Cookie cookie : cookieList){ // 整理Cookie,将www去掉,否则回填时将会自动在前面加.,即www.abc.com,将变成.www.abc.com,而无法使用 // 一般情况下在序列化时已经解决了前置www的问题,在这儿应该就不需要再验证了,但考虑到部分已经存在的CookieStore还存在前置www的问题,所以可以应用验证 // cookie = new Cookie(cookie.getName(), cookie.getValue(), // CookieUtils.modifyDomain4Driver(cookie.getDomain()), cookie.getPath(), cookie.getExpiry(), false, false); options.addCookie(cookie); } }

到这儿,可能有人要问了,序列化时干嘛转来转去的,把 Set转换为 CookieStore,纯粹 CookieStore 有其它用处,你也可以不转换直接序列化。

另外,注意在 WebDriver 加载 Cookie 前需要先打开网址,不能直接先加载 Cookie,Cookie 要加载到某个域名下,因此,需要先打开网址,再加载 Cookie,加载完成后 refresh 刷新页面,最后通过规则指定是否加载(登录)成功。

参见:Issue #4861 · SeleniumHQ/selenium

  • Selenium
    17 引用 • 13 回帖
  • 调试
    5 引用 • 35 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone
    作者

    目前还没找到更优雅的方式来解决这个域名问题,不过经测试,有的网站在更改 Cookie 域名后也没问题,有的就不行,显示未登录状态。
    另外,还有一个思路,增加 Driver 池,仅在第一次需要登录,后面直接从池中拿 Driver,但貌似进程一多内存耗不起。
    后面有空了再继续 Google 吧。也欢迎大家讨论。

推荐标签 标签

  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 100 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 541 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 109 关注
  • 印象笔记
    3 引用 • 16 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 36 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 24 关注
  • Access
    1 引用 • 3 回帖 • 7 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 2 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 61 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    443 引用 • 1238 回帖 • 601 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 512 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 522 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 563 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 543 回帖 • 3 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 391 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 745 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 761 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 83 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • AWS
    11 引用 • 28 回帖 • 5 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 6 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 1 关注