web 企业微信实战(一)

标题

web 企业微信实战(一)

课程价值

  • 了解 selenium IDE
  • 掌握使用remote复用已有的浏览器
  • 掌握使用cookie登陆

大纲

  • selenium简介
  • selenium IDE
  • 使用remote复用已有的浏览器
  • 使用cookie登陆

时长

90分钟

PPT

https://pdf.ceshiren.com/xly2/selenium%20企业微信1/assets/player/KeynoteDHTMLPlayer.html#0

脚本编写

应用

参考链接

selenium 官网:https://www.selenium.dev/
selenium python doc: https://seleniumhq.github.io/selenium/docs/api/py/
chromedriver下载路径:CNPM Binaries Mirror

常见问题

  • 下载好的对应driver,(比如chromedriver,firefox drive…)的配置问题。

    • 下载浏览器对应的driver版本,chromedriver 配置环境变量
    • 配置完环境变量打印一下 PATH
    • 重启命令行以及 pycharm
  • 学会找报错信息,以及理解报错信息的含义
    1、从后往前看,找到最后的几个E
    2、找到 【当前文件名:行号】 ,点到代码中,分析是否由于书写问题,定位的问题…

不建议使用IDE录制

1、生成代码过于冗余
2、复杂的业务逻辑难以实现
3、没有实现断言, 结果的验证

复用浏览器

  • 注意,浏览器
    1. 需要退出当前所有的谷歌浏览器(特别注意)
    1. 找到chrome的启动路径(下一页ppt)
    1. 配置环境变量(下一页ppt)
    1. 启动命令windows:chrome --remote-debugging-port=9222
  • 启动命令mac:Google\ Chrome --remote-debugging-port=9222
    1. 访问http://localhost:9222/

配置

启动命令:
chrome --remote-debugging-port=9222

  • Mac
    启动命令:
    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome - -remote-debugging-port=9222
  • 注意:使用tab键,不要手动输入

代码加入option

option = Options()
option.debugger_address = '127.0.0.1:9222'
self.driver = webdriver.Chrome(options=option)

代码参考


    def test_cookie(self):
        # get_cookies() 获取当前页面的cookies
        # cookies = self.driver.get_cookies()
        # print(cookies)
        # 打开 index页面,这时候需要登录
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")

        # 带有登录信息的cookie
        cookies = [{'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.vid', 'path': '/', 'secure': False, 'value': '1688851905935585'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.vid', 'path': '/', 'secure': False, 'value': '1688851905935585'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.corpid', 'path': '/', 'secure': False, 'value': '1970325054155915'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.sid', 'path': '/', 'secure': False, 'value': 'IiwmHmbRQC3UgqmekvGcsqnLM0KaswKi1tpUIxZ7ME4eQqVFuj_8swXg8U3bGeAA'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.d2st', 'path': '/', 'secure': False, 'value': 'a9205189'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ltype', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.work.weixin.qq.com', 'expiry': 1629378403.32131, 'httpOnly': False, 'name': 'Hm_lvt_9364e629af24cb52acc78b43e8c9f77d', 'path': '/', 'secure': False, 'value': '1597674494,1597732354,1597757140,1597842337'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ref', 'path': '/', 'secure': False, 'value': 'direct'}, {'domain': '.work.weixin.qq.com', 'expiry': 1629378336, 'httpOnly': False, 'name': 'wwrtx.c_gdpr', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.qq.com', 'expiry': 1660914455, 'httpOnly': False, 'name': '_ga', 'path': '/', 'secure': False, 'value': 'GA1.2.1737553657.1582007476'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'Hm_lpvt_9364e629af24cb52acc78b43e8c9f77d', 'path': '/', 'secure': False, 'value': '1597842403'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.refid', 'path': '/', 'secure': False, 'value': '9528437336544'}, {'domain': 'work.weixin.qq.com', 'expiry': 1597864124, 'httpOnly': True, 'name': 'ww_rtkey', 'path': '/', 'secure': False, 'value': '8vrdlbn'}, {'domain': '.qq.com', 'expiry': 1597928855, 'httpOnly': False, 'name': '_gid', 'path': '/', 'secure': False, 'value': 'GA1.2.1503122815.1597647640'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.vst', 'path': '/', 'secure': False, 'value': 'qRUzpbH0haAyOoSE7hvpm2vY8YCj94Yxh2h0CFjn4sps63nEtyWRxtWFq3zgA9Ox_oOqrJxdsBGlHIfvmQojMdXEzlaYwzBYb6bdZJLqJAPWwc1ZMBT0EGPYpEkXdqSlgs7cfLUeUrHrW4dDo5yKyequJSMbmefJqVgRVAQjDeytttEwajDTdF-HjpdzDoi1Qv377KsOSGSM6hITMWleJsZgBqxnXlFHF6NG3gd44jwN-_ayhvINXvBFrx-vS94xEjMkyu5oVq2_8qfY_NKUwQ'}, {'domain': '.work.weixin.qq.com', 'expiry': 1600434633, 'httpOnly': False, 'name': 'wwrtx.i18n_lan', 'path': '/', 'secure': False, 'value': 'en-us%2Cen'}]
        for cookie in cookies:
            if 'expiry' in cookie.keys():
                cookie.pop("expiry")
            self.driver.add_cookie(cookie)

        # 重新打开 已带有cookie 信息的index 页面
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
        sleep(3)

    def test_importcontact(self):
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")

        # 带有登录信息的cookie
        cookies = [
            {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.vid', 'path': '/', 'secure': False,
             'value': '1688851905935585'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.vid', 'path': '/', 'secure': False,
             'value': '1688851905935585'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.corpid', 'path': '/', 'secure': False,
             'value': '1970325054155915'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.sid', 'path': '/', 'secure': False,
             'value': 'IiwmHmbRQC3UgqmekvGcsqnLM0KaswKi1tpUIxZ7ME4eQqVFuj_8swXg8U3bGeAA'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.d2st', 'path': '/', 'secure': False,
             'value': 'a9205189'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ltype', 'path': '/', 'secure': False,
             'value': '1'}, {'domain': '.work.weixin.qq.com', 'expiry': 1629378403.32131, 'httpOnly': False,
                             'name': 'Hm_lvt_9364e629af24cb52acc78b43e8c9f77d', 'path': '/', 'secure': False,
                             'value': '1597674494,1597732354,1597757140,1597842337'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ref', 'path': '/', 'secure': False,
             'value': 'direct'},
            {'domain': '.work.weixin.qq.com', 'expiry': 1629378336, 'httpOnly': False, 'name': 'wwrtx.c_gdpr',
             'path': '/', 'secure': False, 'value': '0'},
            {'domain': '.qq.com', 'expiry': 1660914455, 'httpOnly': False, 'name': '_ga', 'path': '/', 'secure': False,
             'value': 'GA1.2.1737553657.1582007476'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'Hm_lpvt_9364e629af24cb52acc78b43e8c9f77d',
             'path': '/', 'secure': False, 'value': '1597842403'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.refid', 'path': '/', 'secure': False,
             'value': '9528437336544'},
            {'domain': 'work.weixin.qq.com', 'expiry': 1597864124, 'httpOnly': True, 'name': 'ww_rtkey', 'path': '/',
             'secure': False, 'value': '8vrdlbn'},
            {'domain': '.qq.com', 'expiry': 1597928855, 'httpOnly': False, 'name': '_gid', 'path': '/', 'secure': False,
             'value': 'GA1.2.1503122815.1597647640'},
            {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.vst', 'path': '/', 'secure': False,
             'value': 'qRUzpbH0haAyOoSE7hvpm2vY8YCj94Yxh2h0CFjn4sps63nEtyWRxtWFq3zgA9Ox_oOqrJxdsBGlHIfvmQojMdXEzlaYwzBYb6bdZJLqJAPWwc1ZMBT0EGPYpEkXdqSlgs7cfLUeUrHrW4dDo5yKyequJSMbmefJqVgRVAQjDeytttEwajDTdF-HjpdzDoi1Qv377KsOSGSM6hITMWleJsZgBqxnXlFHF6NG3gd44jwN-_ayhvINXvBFrx-vS94xEjMkyu5oVq2_8qfY_NKUwQ'},
            {'domain': '.work.weixin.qq.com', 'expiry': 1600434633, 'httpOnly': False, 'name': 'wwrtx.i18n_lan',
             'path': '/', 'secure': False, 'value': 'en-us%2Cen'}]
        for cookie in cookies:
            if 'expiry' in cookie.keys():
                cookie.pop("expiry")
            self.driver.add_cookie(cookie)

        # 重新打开 已带有cookie 信息的index 页面
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")

        self.driver.find_element(By.CSS_SELECTOR, ".index_service_cnt_itemWrap:nth-child(2)").click()
        self.driver.find_element(By.ID, "js_upload_file_input").send_keys("/Users/juanxu/Downloads/mydata.xlsx")
        assert "mydata.xlsx" == self.driver.find_element(By.ID, "upload_file_name").text

    # 实现 cookie 数据的持久化存储
    def test_shelve(self):
        # shelve python 内置的模块,相当于小型的数据库
        # 带有登录信息的cookie
        db = shelve.open('./mydbs/cookies')
        # db['cookie'] = cookies
        # db.close()
        cookies = db['cookie']
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
        for cookie in cookies:
            if 'expiry' in cookie.keys():
                cookie.pop("expiry")
            self.driver.add_cookie(cookie)

        # 重新打开 已带有cookie 信息的index 页面
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")

        self.driver.find_element(By.CSS_SELECTOR, ".index_service_cnt_itemWrap:nth-child(2)").click()
        self.driver.find_element(By.ID, "js_upload_file_input").send_keys("/Users/juanxu/Downloads/mydata.xlsx")
        assert "mydata.xlsx" == self.driver.find_element(By.ID, "upload_file_name").text


github 代码

https://github.com/ceshiren/HogwartsFIS02

作业

  • 使用cookie 登录企业微信,完成导入联系人,加上断言验证

课后反馈