具体问题为,在使用 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 刷新页面,最后通过规则指定是否加载(登录)成功。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于