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


    测试需求:

    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()
  • 相关阅读:
    Mac OS terminal 查看内存使用情况的命令
    【教程】5分钟在以太坊上发行自己的代币
    Mac下eclipse的快捷键
    Mac上编辑文本的一些实用快捷键:跳转、选中等操作
    Mysql数据库用source命令导入SQL文件,利用navicat修改MySQL用户root密码,忘记mysql密码如何修改
    比特币1个确认和6个确认的区别在哪里?什么是双花问题?
    以 1、3、bc1 开头的比特币地址都有啥区别?转账手续费那种便宜,隔离见证地址为什么手续费便宜?
    以太坊 2.0 中的 DeFi:城市、郊区、农村
    Mac版navicat生成ER图把表结构导出pdf
    下载文件(API接口,Angularjs前端)
  • 原文地址:https://www.cnblogs.com/Cc905/p/12912703.html
Copyright © 2020-2023  润新知