测试需求:
1.selenium实现保持百度云登录态,
2.上传文件到百度云
保持登录态
方法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格式转换后,把转换后的数据写入文本。
上传文件
百度云的上传文件是个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定义的常量
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()
看完点赞 ~养成好习惯,以上内容希望对你有帮助,如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加入我们。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。