Webdriver+Java实现使用cookie跳过登录

 

Webdriver模拟登录过程中很有可能遇到验证码,最近认真学习了下如何使用cookie直接跳过登录过程。

一、cookie的定义

来源百度百科:

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265(可以叫做浏览器缓存)。

Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息 。

目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。持续的 Cookie 则保存在用户的 Cookie 文件中,下一次用户返回时,仍然可以对它进行调用。

临时的Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。当访客结束其浏览器对话时,即终止的所有 Cookie。持续的Cookie 可存储在计算机的硬驱上。

二、cookie的组成

一个cookie一般包括name,value,domain,path,expiry,isSecure。

简单实例如下:

Set-Cookie: name = VALUE;

expires = DATE;

path = PATH;

domain = DOMAIN_NAME;

三、使用Webdriver模拟登录后,将cookie写入cookie.data文件中,再次从文件中读取后跳过登录,具体代码如下:

 package XXX;

 import XXX;

 public class CookieTest implements Serializable{

 /**
 * 序列化
 */
 private static final long serialVersionUID = 1L;

 private WebDriver driver;
 private String baseUrl;
 private String homeUrl;
 private String cookiePath;
 private boolean acceptNextAlert = true;
 private StringBuffer verificationErrors = new StringBuffer();

 @Before
 /*
 * 方法名 setUp()
 * 加载chrome浏览器的驱动文件
 * 初始化chrome浏览器配置信息
 * 设置默认访问baseUrl = "XXXXXX";
 */
 public void setUp() throws Exception {
 System.setProperty("webdriver.chrome.driver","lib\\chromedriver_new.exe");
 ChromeOptions options = new ChromeOptions();
 options.addArguments("--start-maximized");// 让Chrome浏览器窗口最大化
 options.addArguments("--disable-popup-blocking");
 options.addArguments("no-sandbox");
 options.addArguments("disable-extensions");
 options.addArguments("no-default-browser-check");
 Map<String, Object> prefs = new HashMap<String, Object>();
 prefs.put("credentials_enable_service", false);
 prefs.put("profile.password_manager_enabled", false);
 options.setExperimentalOption("prefs", prefs);

 driver = new ChromeDriver(options);
 baseUrl = "XXXXXX";
 homeUrl = baseUrl+"XXXXXX";
 cookiePath = "cookie.data";
 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
 }

 @Test
 public void saveCookieTest() throws FileNotFoundException, InterruptedException, IOException{
 //saveCookieNew("XXX","XXXX","cookie.data");
 getCookieLogin(homeUrl,cookiePath);
 }

 @SuppressWarnings("deprecation")
 public void getCookieLogin(String url,String cookiePath){
 driver.get(url);
 sleep(3000);
 File file = new File(cookiePath);
 try {
 FileReader fr = new FileReader(file);
 BufferedReader br = new BufferedReader(fr);
 String line;
 while((line = br.readLine())!= null){
 StringTokenizer st = new StringTokenizer(line,";");
 while(st.hasMoreTokens()){
 String name = st.nextToken();
 //System.out.println("name:"+name);//for test
 String value = st.nextToken();
 //System.out.println("value:"+value);//for test
 String domain = st.nextToken();
 //System.out.println("domain:"+domain);//for test
 String path = st.nextToken();
 //System.out.println("path:"+path);//for test
 Date expiry = null;//cookie的失效时间,默认存在浏览器打开期间
 String expiryString = st.nextToken();
 /*if(!(expiryString.equals(null)&& expiryString.equals("false")))
 {
 //expiry = new Date(expiryString);
 System.out.println("expiry:"+expiryString);//for test
 }*/
 boolean isSecure = new Boolean(st.nextToken()).booleanValue();
 //System.out.println("isSecure:"+isSecure);//for test

 Cookie ck = new Cookie(name,value,domain,path,expiry,isSecure);
 //System.out.println(ck.toString());//for test
 driver.manage().addCookie(ck);
 }
 }
 } catch (IOException e) {
 e.printStackTrace();
 }
 driver.get(url);
 sleep(60000);
 }

 /**
 * 分别打印cookie信息
 * 使用BufferedWriter和FileWriter对象保存cookies到指定文件中
 * 保存格式:name;value;domain;expires;isSecure
 * @param username
 * @param password
 * @param cookiepath
 * @throws IOException
 */
 public void saveCookieNew(String username,String password,String cookiepath) {
 driver.get(baseUrl+"XXXXXX");
 sleep(1000);
 driver.findElement(By.id("userName")).clear();
 driver.findElement(By.id("userName")).sendKeys(username);
 sleep(1000);
 driver.findElement(By.id("password")).clear();
 driver.findElement(By.id("password")).sendKeys(password);
 sleep(2000);
 driver.findElement(By.xpath("//button[@type='button']")).click();
 sleep(5000);
 //driver.get(baseUrl+"ExerciseBookManager/web/home");

 //获取cookies
 Set<Cookie> cookies = driver.manage().getCookies();
 System.out.println("cookie_size:"+cookies.size());
 Iterator<Cookie> it = cookies.iterator();
 File file = new File(cookiepath);
 file.delete();
 try {
 file.createNewFile();
 FileWriter fw = new FileWriter(file);
 BufferedWriter bw = new BufferedWriter(fw);
 for(Cookie ck : cookies){
 bw.write(ck.getName()+";"+ck.getValue()+";"+ck.getDomain()+";"+ck.getPath()+";"+ck.getExpiry()+";"+ck.isSecure());
 bw.newLine();
 }
 bw.flush();
 bw.close();
 fw.close();

 } catch (IOException e) {
 e.printStackTrace();
 }

 }

 /**
 * 分别打印cookie信息
 * 使用ObjectOutputStream和FileOutputStream对象保存cookies到指定文件中
 * @param username
 * @param password
 * @param savecookiepath
 * @throws InterruptedException
 * @throws FileNotFoundException
 * @throws IOException
 */
 public void saveCookie(String username,String password,String savecookiepath) throws InterruptedException, FileNotFoundException, IOException {
 driver.get(baseUrl+"ExerciseBookManager/web/auth/login");
 Thread.sleep(1000);
 driver.findElement(By.id("userName")).clear();
 driver.findElement(By.id("userName")).sendKeys(username);
 Thread.sleep(1000);
 driver.findElement(By.id("password")).clear();
 driver.findElement(By.id("password")).sendKeys(password);
 Thread.sleep(1000);
 driver.findElement(By.xpath("//button[@type='button']")).click();
 Thread.sleep(5000);
 //driver.get(baseUrl+"ExerciseBookManager/web/home");

 //获取cookies
 Set<Cookie> cookies = driver.manage().getCookies();
 System.out.println("cookie_size:"+cookies.size());
 Iterator<Cookie> it = cookies.iterator();
 CookieStore cookieStore = new BasicCookieStore();
 while(it.hasNext()){
 Cookie cookie = it.next();
 BasicClientCookie bcs = new BasicClientCookie(cookie.getName(),cookie.getValue());
 bcs.setDomain(cookie.getDomain());
 bcs.setPath(cookie.getPath());
 System.out.println(cookie.toString());
 cookieStore.addCookie(bcs);
 }
 //将Cookies保存到文件中
 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(savecookiepath)));
 oos.writeObject(cookieStore);
 oos.close();
 }

 @After
 public void tearDown() throws Exception {
 driver.quit();//关闭浏览器
 String verificationErrorString = verificationErrors.toString();
 if (!"".equals(verificationErrorString)) {
 fail(verificationErrorString);
 }
 }

 //等待时间
 public void sleep(long time){
 try {
 Thread.sleep(time);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }

Webdriver+Java实现使用cookie跳过登录的更多相关文章

  1. Cookie跳转登录验证码

    对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...

  2. 自动化测试 -- 通过Cookie跳过登录验证码

    之前写过一篇博客:自动化测试如何解决验证码的问题. http://www.cnblogs.com/fnng/p/3606934.html 介绍了验证码的几种处理方式,最后一种就是通过Cookie跳转过 ...

  3. python通过Cookie跳过登录验证码

    1.通过浏览器获取登录cookie,找到重要的两个参数“BAIDUID”和“BDUSS”: 2.编写Selenium自动化测试脚本,跳过登录. from selenium import webdriv ...

  4. 通过Cookie跳过登录验证码【限cookie不失效有用】

    验证码,相信每个写web自动化测试的同学来说,都是个头疼的事,怎么办呢? 方法还是有的,先说今天这种方式,通过cookie绕过登录验证码 思路: 需要你通过抓包工具抓到你登录的cookie 接下来开始 ...

  5. 【vue】axios + cookie + 跳转登录方法

    axios 部分: import axios from 'axios' import cookie from './cookie.js' // import constVal from './cons ...

  6. Asp.net MVC访问框架页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

    一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是 ...

  7. selenium2 Webdriver + Java 自动化测试实战和完全教程

    selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...

  8. 《手把手教你》系列技巧篇(六十四)-java+ selenium自动化测试 - cookie -中篇(详细教程)

    1.简介 今天按照原计划宏哥要用实例来给小伙伴或童鞋们来演示一下,如何利用cookie实现跳过验证码进行登录.这个场景是自动登陆.有很多系统的登陆信息都是保存在cookie里的,因此只要往cookie ...

  9. java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)

    标题有点问题,没有进行修改. 一 Discuz论坛搭建步骤 1:服务器环境配置 服务器要支持php语言+支持mysql 5.0以上的数据库 + Apache服务器(支持网站的一个服务器,通过域名的能访 ...

随机推荐

  1. Linux 入门笔记

    一开始对linux总有些抵触,黑黑的命令框不知道如何下手,这次因为工作交接的缘故需要负责之前同事的Node后端部分,node,redis这些都是部署在Linux上的,看了几次运维的同学噼里啪啦的敲命令 ...

  2. ASP.NET Core 网站在Docker中运行

    Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...

  3. maven私服搭建nexus/windows/linux(一)

    为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,还有就是公司内部开发的一些版本的jar包,如果没有私服需要一人拷贝一份然后再自己安 ...

  4. jQuery的发展史

    jQuery的发展史,你知道吗? 每天多学一点知识,就少写一行代码2006年1月,jQuery的第一个版本面世,至今已经有6年多了(注:这个时间点是截止至出书时间).虽然过了这么久,但它依然以其简洁. ...

  5. [洛谷P2580]于是他错误的点名开始了

    洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> using ...

  6. ClickHouse 快速入门

    ClickHouse 是什么 ClickHouse 是一个开源的面向联机分析处理(OLAP, On-Line Analytical Processing) 的列式存储数据库管理系统. 在一个 &quo ...

  7. IDEA第三章----idea常用配置

    前两章讲解了idea的git.maven.jdk.tomcat.编码等基本配置,可以让你的项目正常运行,这一章将讲解idea的一些常用设置,这些也正是idea可爱之处,大大提高了开发的效率. 第一节: ...

  8. 2017-4-26 winform tab和无边框窗体制作

    TabIndex-----------------------------------确定此控件将占用的Tab键顺序索引 Tabstop-------------------------------指 ...

  9. cmd 菜单学习

    @ECHO OFF&PUSHD %~DP0 &TITLE 标题是随意的 mode con cols=36 lines=20 color 2C :menu cls echo. echo ...

  10. 编写一个简单的java服务器程序

    import java.net.*;import java.io.*; public class server{ ); //监听在80端口 Socket sock = server.accept(); ...