测试需求:
1.selenium实现保持百度云登录态,
2.上传文件到百度云
1.保持登录态
方法1:获取本地保存的cookie
profile_dir = r"C:Usersv_yddchenAppDataRoamingMozillaFirefoxProfiles9f5vispa.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:Usersv_yddchenAppDataLocalGoogleChromeUser 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列表 ') 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:UsersxxxDesktopweb.txt') time.sleep(5) firefox_driver.quit()