python+playwright 学习-89 cookies的获取保存删除相关操作

2024-05-29 18:38:56 浏览数 (2)

前言

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() 获取的格式一致

代码语言: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()

    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的筛选器。

代码语言:javascript复制
# 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")

0 人点赞