1. 程式人生 > 實用技巧 >九、selenium獲取cookie實現免登陸,登入百度雲後文件的上傳

九、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()