前言
playwright可以获取浏览器缓存的cookie信息,可以将这些cookies信息保存到本地,还可以加载本地cookies。
获取cookies 相关操作
在登录前和登录后分别打印 cookies 信息,对比查看是否获取成功。
代码语言:javascript复制from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
print(f"登录前,cookies为空:{context.cookies()}")
page.goto('http://127.0.0.1:8200/users/login/')
page.locator('#username').fill('test@qq.com')
page.locator('#password_l').fill('123456')
page.get_by_text('立即登录').click()
page.wait_for_load_state('networkidle')
# 获取cookies
print(f"登录后,cookies:{context.cookies()}")
运行结果
代码语言:javascript复制登录前,cookies为空:[]
登录后,cookies:[
{
'name': 'csrftoken',
'value': 'jLpzcaH8RiG8VstuqAXGL5wWq3nycAhtxb2e9yTPKhJBk1FxHFBwpbeD0p6C4DSM',
'domain': '127.0.0.1',
'path': '/',
'expires': 1747969603.971844,
'httpOnly': False,
'secure': False, 'sameSite': 'Lax'
}, {
'name': 'sessionid',
'value': 'jd49av5t88d0eulmxvy0ig15vtexaort',
'domain': '127.0.0.1', 'path': '/',
'expires': 1717729603.972194,
'httpOnly': True,
'secure': False,
'sameSite': 'Lax'
}
]
add_cookies 添加cookies
context.add_cookies()
可以添加 cookies,cookies的格式与 context.cookies()
获取的格式一致
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
cookies = [
{'name': 'csrftoken',
'value': 'jLpzcaH8RiG8VstuqAXGL5wWq3nycAhtxb2e9yTPKhJBk1FxHFBwpbeD0p6C4DSM',
'domain': '127.0.0.1',
'path': '/',
'expires': 1747969603.971844,
'httpOnly': False,
'secure': False,
'sameSite': 'Lax'
}, {
'name': 'sessionid',
'value': 'jd49av5t88d0eulmxvy0ig15vtexaort',
'domain': '127.0.0.1',
'path': '/',
'expires': 1717729603.972194,
'httpOnly': True,
'secure': False,
'sameSite': 'Lax'
}
]
context.add_cookies(cookies)
print(f"添加后,查看cookies:{context.cookies()}")
# 访问页面,验证是否成功
page.goto('http://127.0.0.1:8200/users/userinfo/')
添加cookies的格式与前面context.cookies()
获取cookies的格式是一致的。
storageState保存登录cookies
Playwright 提供了一种在测试中重用登录状态的方法。这样您就可以只登录一次,然后跳过所有测试的登录步骤。 Web 应用程序使用基于 cookie 或基于令牌的身份验证,其中经过身份验证的状态存储为cookie或本地存储。Playwright 提供browserContext.storageState([options])方法,可用于从经过身份验证的上下文中检索存储状态,然后创建具有预填充状态的新上下文。 Cookie 和本地存储状态可以跨不同的浏览器使用。它们取决于您的应用程序的身份验证模型:某些应用程序可能需要 cookie 和本地存储。
以下代码片段从经过身份验证的上下文中检索状态,并使用该状态创建一个新上下文。
代码语言:javascript复制from playwright.sync_api import Playwright, sync_playwright, expect
# 上海悠悠 wx:283340479
# blog:https://www.cnblogs.com/yoyoketang/
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto('https://github.com/login')
# Interact with login form
page.get_by_label("Username or email address").fill("yoyo")
page.get_by_label("Password").fill("*********")
page.get_by_role("button", name="Sign in").click()
# Continue with the test
# 保存storage state 到指定的文件
storage = context.storage_state(path="auth/state.json")
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
于是在本地会保存一个state.json文件
这样在其它地方就可以使用本地的cookies
代码语言:javascript复制# Create a new context with the saved storage state.context = browser.new_context(storage_state="state.json")
需注意的是context.storage_state()
保存的cookies格式和 context.cookies()
获取的cookies格式是不一样的。
所以加载本地的cookies格式不能直接保存context.cookies()
获取的cookies。
清空 clear_cookies()
1.43 版本后,browser_context.clear_cookies()
支持仅删除某些cookie的筛选器。
# Clear all cookies.context.clear_cookies()# New: clear cookies with a particular name.context.clear_cookies(name="session-id")# New: clear cookies for a particular domain.context.clear_cookies(domain="my-origin.com")