做自动化时如何进行持久化登录封装?


相信在做自动化测试的同学都知道,我们在一些自动化过程中会遇到一些想要进行免登录的情况,顾名思义就是如何让登录进行持久化,这样我们在跑脚本的过程中就用一直频繁的进行登录的调用操作,这样在你维护脚本和编写其他页面脚本的时候就会比较方便,可以直接跳转到指定的页面进行测试,而不需要一直调用登录接口

在这里分享下自己的一些封装经验,可以借鉴参考,先来看看python版本的,java版本的照葫芦画瓢,原理都是一样的。

基于selenium实现

from selenium.webdriver.chrome.webdriver import WebDriver, Service
import platform
import getpass
import json
import os

system = platform.system()
if system.startswith('Windows'):
    EXEC_DIR_PATH = f'c:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/Application/chrome.exe'
    USER_DIR_PATH = f'c:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/User_Data'
elif system.startswith('Apple'):
    EXEC_DIR_PATH = f'/Users/{getpass.getuser()}/Library/Application Support/Google/Chrome/Application/chrome'
    USER_DIR_PATH = f'/Users/{getpass.getuser()}/Library/Application Support/Google/Chrome/User_Data'
elif system.startswith('Linux'):
    EXEC_DIR_PATH = f'/home/{getpass.getuser()}/AppData/Local/Google/Chrome/Application/chrome'
    USER_DIR_PATH = f'/home/{getpass.getuser()}/AppData/Local/Google/Chrome/User_Data'

def get_browser_1(page_url = None) -> WebDriver:
    # 浏览器配置对象
    options = webdriver.ChromeOptions()
    # 禁用自动化栏
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 屏蔽保存密码提示框
    options.add_experimental_option('prefs', {'credentials_enable_service': False,'profile_password_manager_enabled': False})
    # 窗口最大化
    options.add_argument("--start-maximized")
    # 无界面运行(无窗口,无头浏览器)
    # option.add_argument("--headless")
    # 禁用GPU 防止无头模式出现莫名奇妙的BUG
    # options.add_argument("--disable-gpu")
    # 禁止启动Blink运行时
    options.add_argument("--disable-blink-features=AutomationControlled")
    #options.binary_location = EXEC_DIR_PATH
    #service'
    driver_path = f'F:\projects\chromedriver\chromedriver.exe'
    service = Service(executable_path=driver_path)
    driver = webdriver.Chrome(service=service, options=options)
    # 待执行的JS代码,修改windows.navigator.webdriver的值
    # js_exec = 'Object.defineProperties(navigator,{webdriver:{get:()=> underfined}});'
    # 移除selenium当中爬虫的特征
    # driver.execute._cdp_cmd('Page.addScriptToEvaluateOnnewDocument','{"source','+ js_exec +'}')
    # driver.implicitly_wait(5)
    if page_url is not None:
        # 设置域名
        driver.get(page_url[:page_url.find('/', 8)])
        # 设置cookie
        load_cookies(driver)
        # 刷新cookies
        save_cookies(driver)
        # 请求url
        driver.get(page_url)
    return driver


def close_browser(browser: WebDriver):
    print("退出程序")
    #browser.close()
    browser.quit()

def save_cookies(browser: WebDriver):
    browser.refresh()
    cookies = browser.get_cookies()
    if len(cookies) <= 0:
        return
    with open('cookies.json', 'w', encoding='utf-8') as f:
        for cookie in cookies:
            f.write(json.dumps(cookie, ensure_ascii=False) + '\n')

def load_cookies(browser: WebDriver):
    if not os.path.exists('./cookies.json'):
        return
    browser.delete_all_cookies()
    with open('cookies.json', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for line in lines:
            if line is not None:
                browser.add_cookie(json.loads(line))`

基于playwright实现
from idlelib.debugger_r import debugging
from Tools.scripts.objgraph import ignore
from playwright.sync_api import Playwright,Page
import platform
import getpass
import json
import os
from Utils.seium_cookis_toos import system, load_cookies, save_cookies


System = platform.system()
if system.startswith('Windows'):
    EXEC_DIR_PATH = f'c:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/Application/chrome.exe'
    USER_DIR_PATH = f'c:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/User_Data'
elif system.startswith('Apple'):
    EXEC_DIR_PATH = f'/Users/{getpass.getuser()}/Library/Application Support/Google/Chrome/Application/chrome'
    USER_DIR_PATH = f'/Users/{getpass.getuser()}/Library/Application Support/Google/Chrome/User_Data'
elif system.startswith('Linux'):
    EXEC_DIR_PATH = f'/home/{getpass.getuser()}/AppData/Local/Google/Chrome/Application/chrome'
    USER_DIR_PATH = f'/home/{getpass.getuser()}/AppData/Local/Google/Chrome/User_Data'


def get_browser_1(playwright: Playwright,page_url=None) -> Page:
    browser = playwright.chromium.launch(
        headless=False,
        args=['--start-maximized'],
        executable_path=EXEC_DIR_PATH
    )
    context = browser.new_context(no_viewport=True)
    page = context.new_page()
    if page_url is not None:
        # 设置域名
        page.goto(page_url[:page_url.find('/'),8])
        # 加载cookie
        load_cookies(page)
        # 刷新cookie
        save_cookies(page)
        # 请求URL
        page.goto(page_url)
    return page


def get_browser_2(platwright:Playwright,page_url=None) -> Page:
    context = platwright.chromium.launch_persistent_context(
        headless=False,
        args=['--start-maximized'],
        executable_path=EXEC_DIR_PATH,
        user_data_dir=USER_DIR_PATH,
        channel = 'chrome',
        no_viewport=True,
        ignore_default_args=['--enable-automation']
    )
    return context.new_page()


def get_browser_3(playwright:Playwright)-> Page:
    import subprocess
    import time
    '''
    --remote-debugging-port=9999 # 是指定运行端口,只要没被占用就行
    --user-data-dir # 指定运行浏览器的运行数据,新建一个干净目录。不影响系统原来的 数据
    --incognito # 隐私板式打开
    --start-maximized #日最大化
    --new-window 直技打开网址
    '''
    #启动命令
    command = f'{EXEC_DIR_PATH} --remote-debugging-port=9999 --start-maximized'
    subprocess.Popen(command, shell=True)
    time.sleep(1)
    browser = playwright.chromium.connect_over_cdp("http://locathost:9999")
    context = browser.contexts[0]
    return context.pages[0]


def close_browser(browser: Page):
    print("退出程序")
    browser.close()
    browser.context.close()
    if browser.context.browser is not None:
        browser.context.browser.close()


def save_cookies(browser: Page):
    browser.reload()
    cookies = browser.context.cookies(browser.url)
    if len(cookies)<=0:
        return
    with open('./cookies,txt', 'w', encoding='utf-8') as f:
        for cookie in cookies:
            f.write(json.dumps(cookie)+"\n")



def load_cookies(browser: Page):
    if not os.path.exists("./cookies,txt "):
        return
    with open('./cookies.txt', 'r', encoding ='utf-8') as f:
        cookies =[]
        lines = f.readlines()
        for line in lines:
            if line is not None:
                cookies.append(json.loads(line))
        browser.context.clear_cookies()
        browser.context.add_cookies(cookies)


​
posted @ 2025-08-27 14:19  函数编程爱好者  阅读(12)  评论(0)    收藏  举报