2019独角兽企业重金招聘Python工程师标准>>>
介绍selenium操作cookie之前,先简单介绍一下cookie的基础知识
cookie
cookie一般用来识别用户身份和记录用户状态,存储在客户端电脑上。IE的cookie文件路径(win7):
“C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies”
如果windows下没有cookies文件夹,需要把隐藏受保护的系统文件夹前面的勾去掉;chrome的cookie路径(win7):
“C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\Cookies”
IE把不同的cookie存储为不同的txt文件,所以每个文件都较小,chrome是存储在一个cookies文件中,该文件较大。
通过js操作cookie
可以通过如下方式添加方式
cookie演示
IE浏览器会在上述文件夹下生成一个txt文件,内容即为刚才的键值对
chrome浏览器可以直接查看cookie,地址栏输入chrome://settings/content即可,注意过期时间是一天以后
想要获取cookie也很简单,把赋值语句倒过来写即可
cookie演示
获得cookie
有两种方法可以获得cookie,第一种是直接通过cookie名称来获取
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class NewTest{
public static void main(String[] args) throws InterruptedException {
System.setProperty ( "webdriver.chrome.driver" ,
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );
WebDriver driver = new ChromeDriver();
driver.get("http://localhost/cookie.html");
//这两句不能省略
WebElement element=driver.findElement(By.xpath("//input[@id='1']"));
element.click();
System.out.println(driver.manage().getCookieNamed("name"));
Thread.sleep(3000);
driver.quit();
}
}
输出如下
和我们在页面中添加的cookie是一样的,第二种是通过selenium提供的Cookie类获取,接口中有云:
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class NewTest{
public static void main(String[] args) throws InterruptedException {
System.setProperty ( "webdriver.chrome.driver" ,
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );
WebDriver driver = new ChromeDriver();
driver.get("http://localhost/cookie.html");
//这两句不能省略
WebElement element=driver.findElement(By.xpath("//input[@id='1']"));
element.click();
Set cookies=driver.manage().getCookies();
System.out.println("cookie总数为"+cookies.size());
for(Cookie cookie:cookies)
System.out.println("作用域:"+cookie.getDomain()+", 名称:"+cookie.getName()+
", 值:"+cookie.getValue()+", 范围:"+cookie.getPath()+
", 过期时间"+cookie.getExpiry());
Thread.sleep(3000);
driver.quit();
}
}
输出大概是这样子
添加cookie
添加cookie就很简单了
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class NewTest{
public static void main(String[] args) throws InterruptedException {
System.setProperty ( "webdriver.chrome.driver" ,
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );
WebDriver driver = new ChromeDriver();
driver.get("http://localhost/cookie.html");
//这两句不能省略
WebElement element=driver.findElement(By.xpath("//input[@id='1']"));
element.click();
Cookie cookie=new Cookie("java","eclipse","/",null);
driver.manage().addCookie(cookie);
System.out.println(driver.manage().getCookieNamed("java"));
Thread.sleep(3000);
driver.quit();
}
}
可以看到,我们先是生成了一个cookie实例,然后通过addCookie方法添加cookie.参数的含义可以在cookie类的定义中找到,位于org.openqa.selenium.Cookie,下面是其中的一个
删除cookie
有三种途径:
deleteAllCookies 删除所有cookie
deleteCookie 删除指定的cookie,参数一个cookie对象
deleteCookieNamed 根据cookie名称删除
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class NewTest{
public static void main(String[] args) throws InterruptedException {
System.setProperty ( "webdriver.chrome.driver" ,
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );
WebDriver driver = new ChromeDriver();
driver.get("http://localhost/cookie.html");
//这两句不能省略
WebElement element=driver.findElement(By.xpath("//input[@id='1']"));
element.click();
Cookie cookie=new Cookie("java","eclipse","/",null);
driver.manage().addCookie(cookie);
//删除名称为value的cookie
driver.manage().deleteCookieNamed("value");
//删除刚才新增的cookie java
driver.manage().deleteCookie(cookie);
//输出现有cookie
Set cks=driver.manage().getCookies();
System.out.println("cookie总数为"+cks.size());
for(Cookie ck:cks)
System.out.println("作用域:"+ck.getDomain()+", 名称:"+ck.getName()+
", 值:"+ck.getValue()+", 范围:"+ck.getPath()+
", 过期时间"+ck.getExpiry());
//删除全部cookie
driver.manage().deleteAllCookies();
Set c=driver.manage().getCookies();
System.out.println("cookie总数为"+c.size());
Thread.sleep(3000);
driver.quit();
}
}
说了这么多,selenium来操作cookie到底有什么用呢?主要有两点:
1.测试web程序经常需要清楚浏览器缓存,以消除不同版本的影响,selenium就可以自动执行了,每次测试新版本前先清楚缓存文件
2.用来完成自动登陆的功能,无需再编写登录的公共方法了
现在有两个页面cookie.php为登录页面,login.php是登陆后跳转的页面,如果用户已经登录即已有用户的cookie就自动跳转到login.php.
cookie.php:
cookie演示
";
echo "window.location.href='login.php'";
echo "";
}
?>
login.php:
可以这样写selenium,就可以用用户eclipse自动登录了(忽略了密码验证)
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class NewTest{
public static void main(String[] args) throws InterruptedException {
System.setProperty ( "webdriver.chrome.driver" ,
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );
WebDriver driver = new ChromeDriver();
driver.get("http://localhost/cookie.php");
driver.manage().deleteAllCookies();
Cookie cookie=new Cookie("username","eclipse","/",null);
driver.manage().addCookie(cookie);
Cookie cookie1=new Cookie("password","[email protected]","/",null);
driver.manage().addCookie(cookie1);
driver.get("http://localhost/cookie.php");
Thread.sleep(3000);
driver.quit();
}
}