
Playwright 是一个开源的、跨浏览器的自动化测试和网页抓取工具支持 Chromium、Firefox 和 WebKit即 Chrome、Edge、Firefox、Safari三大渲染引擎具备无头headless和有头headed模式专为现代 Web 应用设计。其核心优势包括✅多浏览器支持一套代码可运行于 Chromium/Firefox/WebKit无需修改✅无界面Headless默认运行启动快、资源占用低适合 CI/CD 和服务器环境✅自动等待与抗竞态内置智能等待如page.locator().click()会自动等待元素可交互✅网络拦截与模拟可 mock API、拦截请求、修改响应、模拟离线/慢网等✅多语言支持官方提供 TypeScript/JavaScript、Python、.NET、Java 绑定✅真实浏览器上下文支持多页面、多标签页、iframe、认证、文件上传/下载等完整浏览器能力 基础 Python 示例无界面执行fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:# 启动无头浏览器默认即 headlessTruebrowserp.chromium.launch()pagebrowser.new_page()page.goto(https://example.com)print(page.title())browser.close()⚠️ 注意首次运行需执行playwright install或playwright install chromium firefox webkit下载对应浏览器二进制。Playwright 不依赖 Selenium WebDriver 协议而是通过 DevTools Protocol 或私有协议直接通信因此更稳定、更快、API 更简洁。Playwright 提供多种灵活且可靠的方式处理登录态实现会话保持Session Persistence适用于自动化测试、爬虫或工作流集成场景。核心方法包括✅1. 保存与复用浏览器上下文推荐Playwright 的BrowserContext是会话隔离单元天然保存 Cookie、localStorage、sessionStorage、HTTP 认证凭据等。可将其序列化为“状态文件”storage_state并复用# 登录后保存状态withsync_playwright()asp:browserp.chromium.launch()contextbrowser.new_context()pagecontext.new_page()page.goto(https://example.com/login)page.fill(#username,user)page.fill(#password,pass)page.click(#login-btn)page.wait_for_url(/dashboard)# 确保登录成功# ✅ 保存完整会话状态含 cookies localStorage sessionStoragecontext.storage_state(pathauth.json)# 后续复用该状态无需重复登录new_contextbrowser.new_context(storage_stateauth.json)new_pagenew_context.new_page()new_page.goto(https://example.com/dashboard)# 直接访问受保护页面✅2. 手动操作存储精细控制可读写 Cookie 或 localStorage# 获取/设置 Cookiecookiespage.context.cookies()page.context.add_cookies([{name:auth_token,value:xxx,url:https://example.com}])# 操作 localStoragepage.evaluate((data) { localStorage.setItem(token, data.token); },{token:abc123})✅3. HTTP 认证Basic / Digest直接在context或page级别设置凭据contextbrowser.new_context(http_credentials{username:api_user,password:secret})✅4. OAuth / SSO 场景处理技巧使用context.route()拦截授权回调注入 token 或跳过重定向复用已登录的context避免反复走 OAuth 流程结合storage_state 定期刷新 token如通过 API 调用更新 localStorage⚠️ 注意事项storage_state不包含内存中未持久化的数据如未触发localStorage.setItem的 JS 变量若网站使用 IndexedDB 或 Service Worker 缓存需额外处理Playwright 当前不自动序列化它们多标签页共享同一context即共享登录态符合真实用户行为。