九、selenium獲取cookie實現免登陸,登入百度雲後文件的上傳
測試需求:
1.selenium實現保持百度雲登入態,
2.上傳檔案到百度雲
1.保持登入態
方法1:獲取本地儲存的cookie
profile_dir = r"C:\Users\v_yddchen\AppData\Roaming\Mozilla\Firefox\Profiles\9f5vispa.default" profile = webdriver.FirefoxProfile(profile_dir) profile.set_preference('browser.download.dir', 'E:\\download_file') firefox_driver= webdriver.Firefox(profile) firefox_driver.get("https://pan.baidu.com/") firefox_driver.implicitly_wait(10) # chrome保持登入態 # option = webdriver.ChromeOptions() # option.add_argument(r"C:\Users\v_yddchen\AppData\Local\Google\Chrome\User Data") # chrome_driver = webdriver.Chrome('chromedriver', 0, option)# chrome_driver.get("https://pan.baidu.com/")
方法2:使用get_cookie獲取cookie儲存到檔案中。
1.開啟百度雲,掃碼登入,並且獲取cookie儲存到檔案中
# 獲取cookie,儲存到檔案baiduyun_user_cookie.txt中 firefox_driver = webdriver.Firefox() baiduyun_homepage = firefox_driver.get('https://pan.baidu.com/') time.sleep(15) bdiduyun_cookie= firefox_driver.get_cookies() print('列印cookie列表\n') print(bdiduyun_cookie) print(type(bdiduyun_cookie)) # list print('列印cookie str') print(type(json.dumps(bdiduyun_cookie))) # str print(json.dumps(bdiduyun_cookie)) with open('baiduyun_user_cookie.txt', 'w', encoding='utf-8') as f: json.dump(bdiduyun_cookie, f)
2.讀取檔案中的cookie
# 獲取檔案中的cookie with open('baiduyun_user_cookie.txt', 'r') as f: cookie_list = json.loads(f.read(), encoding='utf-8') print(type(cookie_list)) # 讀取到的是list for cookie_ in cookie_list: firefox_driver.add_cookie(cookie_) # add_cookie(self, cookie_dict) print(type(cookie_)) # dict firefox_driver.refresh() time.sleep(5) firefox_driver.quit()
注意:
get_cookie獲取到的cookie格式是list,每個元素是一個dict。json.dumps(get_cookie())把資料格式轉換成了str。
json.dump()和json.load()用於檔案寫和讀,也可以把cookie格式轉換後,把轉換後的資料寫入文字。
2.上傳檔案
百度雲的上傳檔案是個window視窗,剛好以前用過pywin32(可訪問windows API,提供了齊全的windows常量、介面、執行緒以及COM機制等等)。
1.宣告定義window檔案上傳視窗的函式
FindWindow(lpClassName=None,lpWindwName=None):自頂層開始搜尋條件匹配的窗體,不搜尋子視窗,不區分大小寫,找不到就返回0
FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 搜尋類名和窗體名匹配的窗體,並返回這個窗體的控制代碼,找不到就返回0。
hwndParent父控制代碼,若不為0,則從父控制代碼的子窗體中找
hwndChildAfter=0 若不為0,則安裝z-index的順序,從hwndChileAfter向後開始搜尋子窗體,否則從第一個子窗體開始搜尋
lpszClass=None 窗體類名
lpszWindow=None 視窗名
PostMessage(hWnd,msg,wParam,lParam) 在訊息佇列中為指定窗體加入一條訊息,並且馬上返回,不等待執行緒對訊息的處理。
SendMessage(hWnd, Msg, wParam, lParam) 在訊息佇列中加入為指定的窗體加入一條訊息,直到窗體處理完資訊才返回,設定成功返回true
hWnd;視窗控制代碼
msg:訊息型別 win32con定義的常量
關於wparam和lparam參見https://blog.csdn.net/ljd_1986413/article/details/6258604
def set_file_path(file_path): """ 操作window上傳檔案視窗 :param file_path: 待上傳檔案的絕對路徑 :return: no return """ parent_handle = win32gui.FindWindow(None, '檔案上傳') combo_box_ex32 = win32gui.FindWindowEx(parent_handle, 0, "ComboBoxEx32", None) combo_box = win32gui.FindWindowEx(combo_box_ex32, 0, "ComboBox", None) edit = win32gui.FindWindowEx(combo_box, 0, "Edit", None) button = win32gui.FindWindowEx(parent_handle, 0, "Button", "開啟(&O)") win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, file_path) win32gui.SendMessage(parent_handle, win32con.WM_COMMAND, 1, button)
2.點選baiduyun頁面的“上傳”,呼叫函式set_file_path設定檔案上傳路徑,上傳檔案
# 獲取cookie,儲存到檔案baiduyun_user_cookie.txt中 firefox_driver = webdriver.Firefox() firefox_driver.get('https://pan.baidu.com/') first_window_handle_1 = firefox_driver.current_window_handle # 獲取檔案中的cookie with open('baiduyun_user_cookie.txt', 'r') as f: cookie_list = json.loads(f.read(), encoding='utf-8') print(type(cookie_list)) # 讀取到的是list for cookie_ in cookie_list: firefox_driver.add_cookie(cookie_) print(type(cookie_)) # dict firefox_driver.refresh() time.sleep(10) window_handles = firefox_driver.window_handles for current_window_baidu in window_handles: if current_window_baidu != first_window_handle_1: firefox_driver.switch_to.window(current_window_baidu) upload_button = firefox_driver.find_element_by_css_selector('.g-button[title="上傳"]') upload_button.click() time.sleep(1) set_file_path(r'C:\Users\xxx\Desktop\web.txt') time.sleep(5) firefox_driver.quit()