做自动化时如何进行持久化登录封装?
相信在做自动化测试的同学都知道,我们在一些自动化过程中会遇到一些想要进行免登录的情况,顾名思义就是如何让登录进行持久化,这样我们在跑脚本的过程中就用一直频繁的进行登录的调用操作,这样在你维护脚本和编写其他页面脚本的时候就会比较方便,可以直接跳转到指定的页面进行测试,而不需要一直调用登录接口
在这里分享下自己的一些封装经验,可以借鉴参考,先来看看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)
浙公网安备 33010602011771号