Selenium WebUI自动化测试三:登录cookies和浏览器复用

为解决脚本执行和调试得过程中重复登录得问题,可采用复用浏览器得方式,跳过前面得自动化执行步骤,轻松复现出问题。

1.复用浏览器

1.退出所有浏览器:windows需要关闭浏览器进程
2.配置谷歌浏览器的环境变量

获取启动路径:

image

设置环境变量

3.重启命令行,输入命令

chrome --remote-debugging-port=9222

可以启动浏览器,说明配置正确

MAC电脑:

  1. 获取启动路径(注意:使用 tab 键,不要手动输入)
  2. 将启动路径配置到环境变量中

举例,地址自拟 export PATH=$PATH:/Applications/Google\ Chrome.app/Contents/MacOS

配置好环境,当执行代码报错时执行以下代码,直接调试即可

from selenium.webdriver.chrome.options import Options
option = Options()
option.debugger_address = "localhost:9222"
self._driver = webdriver.Chrome(options=option)
driver.find_element(By.id,'username').send_keys('jjj')

2.cookie复用

具体实现方法为:

  • 1.登录后获取cookie信息:

driver.get_cookies()

  • 2.保存cookie信息到文件:
with open("cookies.yaml","w") as f:
     yaml.safe_dump(cookie,f)
  • 3.使用时从文件读取,按键值对添加cookie

# 从文件中获取cookies 
cookie = yaml.safe_load(open("cookie.yaml")) 
# 3. 植入cookie 
for c in cookie: 
    self.drvier.add_cookie(c)
  • 4.重新打开网页

driver.get("www.baidu.com")

利用显示等待来操作登录,cookie过期时扫码登录后获取心得cookie,未过期时采用保存得cookie获取登录信息

def setup_class(self):
    with allure.step("打开企微首页"):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(3)
        self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")

    # 定义获取token显式等待函数,返回应是函数对象,而不是函数调用
    def is_login(element):
        flag = False

        def inner(driver):
            # 使用历史cookies文件登录
            nonlocal flag
            print(flag)
            if not flag:
                cookies = yaml.safe_load(open("cookies.yml"))
                for cook in cookies:
                    driver.add_cookie(cook)
                driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
            # 使用定位首页某个元素判断是否登录成功,登录失败,将重置cookies文件标志置位
            # 定位不到返回为空列表
            locator = driver.find_elements(By.CSS_SELECTOR, element)
            if not locator:
                flag = True
            # 当需要重置cookies文件和首页均为True时,保存新的cookies,即cookies失效后重置
            if flag and locator:
                cookies = driver.get_cookies()
                with open("./cookies.yml", "w") as f:
                    yaml.safe_dump(cookies, f)
            return locator
        return inner
    with allure.step("cookie载入"):
        # until函数传入的是函数对象,而不是函数调用,此处传入的是is_login返回的内函数对象
        WebDriverWait(self.driver, 15).until(is_login(".index_explore_title"))