九、selenium获取cookie实现免登陆,登录百度云后文件的上传

测试需求:

1.selenium实现保持百度云登录态,

2.上传文件到百度云

九、selenium获取cookie实现免登陆,登录百度云后文件的上传_第1张图片

 

 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机制等等)。

九、selenium获取cookie实现免登陆,登录百度云后文件的上传_第2张图片

 

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

 

你可能感兴趣的:(九、selenium获取cookie实现免登陆,登录百度云后文件的上传)