學習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();
}
}