学习selenium的Cookie这一节,用了很多时间都没有成功捕获登录信息实现自动登录,如果只是单纯使用getCookies()方法并不能获取Cookie里关键参数的name和value。,比如通过firebug,虽然可以看到www.baidu.com这个网页的cookie内容,但是实际允许登录的“BDUSS”这个参数并没有在cookie内容里体现。
最后还是搜到了虫师的文章,详细讲了如何通过fiddler抓包工具获取baidu的cookie的重要参数信息。
这里再补充一下,由于Host为"passport.baidu.com"的消息有很多条,需要找到Host为"passport.baidu.com",URL为v2/api/?login 的消息,查看右侧窗口Response里Set-Cookie的内容。
Cookie的处理分为:
服务器向客户端发送cookie
浏览器将cookie保存
之后每次http请求浏览器都会将cookie发送给服务器端
服务器端向客户端发送Cookie是通过HTTP响应报文实现的,在Set-Cookie中设置需要像客户端发送的cookie。参考文章:通过Cookie跳过登录验证码
准备工具:
------------------
fiddler
Python+selenium
------------------
以百度登录为例。
验证码是汉字的,我想通过程序识别起来有点难度,也会比较麻烦。
接下来开始动手。
1、开启Fiddler 工具,像这样!
2、通过浏览器登录正常登录百度账号。像这样!
3、通过Fiddler获取登录请求的Cookie。找到Host为“passport.baidu.com”的URL,在右侧窗口查看该请求的Cookie。
然后,找到重要的两个参数“BAIDUID”和“BDUSS”。
4、编写Selenium自动化测试脚本,跳过登录。
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") # 添加Cookie driver.add_cookie({'name':'BAIDUID','value':'AAAAAAAAAAAAAA:FG=1'}) driver.add_cookie({'name':'BDUSS','value':'AAAAAAAAAAAAAAAAAAAAAAAAAA'}) # 刷新页面 driver.refresh() # 获取登录用户名并打印 username = driver.find_element_by_class_name("user-name").text print(username) #关闭浏览器 driver.quit()
首先,访问百度首页,处于未登录状态。
然后,通过Selenium所提供add_cookie()方法添加Cookie信息。
最后,刷新页面,现在已经是登录状态了,获取登录之后的用户名并打印。
附上自己用java实现的代码:
package cookie;
import java.util.Set;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class CookieBaidu {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.baidu.com");
Thread.sleep(3000);
System.out.println(driver.manage().getCookies());
// 通过fiddler抓包工具,找到Host为“passport.baidu.com”的URL,在右侧窗口查看该请求的Cookie,
// 找到重要的两个参数“BAIDUID”和“BDUSS”
Cookie c1 = new Cookie("BAIDUID", "66666666666666666666666:FG=1");
Cookie c2 = new Cookie("BDUSS", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN~e-lnf3vpZc");
driver.manage().addCookie(c1);
driver.manage().addCookie(c2);
driver.navigate().refresh();
// 获得登录用户名
String username = driver.findElement(By.className("user-name")).getText();
System.out.println("username = " + username);
System.out.println(driver.manage().getCookies());
Thread.sleep(3000);
driver.quit();
}
}