当前位置: 首页 > news >正文

Playwriter语法使用总结

一、安装与入口(极简)

pip install playwright
playwright install  # 安装浏览器驱动
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)  # 或 firefox / webkitpage = browser.new_page()# ... 业务代码browser.close()

二、页面导航与基础信息

page.goto("https://example.com")                # 跳转
page.goto("https://example.com", wait_until="networkidle")page.url                                          # 当前URL
page.title()                                      # 标题
page.content()                                    # 页面HTML
page.screenshot(path="s.png", full_page=True)   # 截图
page.pdf(path="out.pdf")                         # 仅无头chromium

三、元素定位(Locator,重点)

推荐统一用 page.locator(selector),返回 Locator 对象,可链式操作。

1)CSS / ID / 类 / 属性

page.locator("#id")                              # ID
page.locator(".class")                           # class
page.locator("input[name='pwd']")                # 属性
page.locator("div.container > button")          # 层级

2)XPath

page.locator("//button[@type='submit']")

3)文本定位(最实用)

page.get_by_text("登录")                         # 模糊匹配
page.get_by_text("登录", exact=True)            # 精确匹配
page.locator("text=登录")                        # 等价写法

4)角色定位(现代页面优先)

page.get_by_role("button", name="登录")
page.get_by_role("textbox", name="用户名")

5)组合、嵌套、多元素

page.locator("form >> input[name='user']")      # 组合
page.locator(".list").first                      # 第一个
page.locator(".list").last                       # 最后一个
page.locator(".list").nth(2)                     # 第3个(0开始)
page.locator(".item").count()                    # 数量

四、常用元素交互

1)点击

page.locator("button").click()
page.locator("button").click(force=True)        # 强制点击(不可见)

2)输入 / 清空

page.locator("#user").fill("test@example.com")  # 清空+输入(推荐)
page.locator("#user").type("slow", delay=100)   # 模拟慢速输入
page.locator("#user").clear()                     # 清空

3)单选 / 复选 / 下拉

page.locator("#agree").check()                    # 勾选
page.locator("#agree").uncheck()                  # 取消
page.locator("select").select_option("value")    # 下拉选值
page.locator("select").select_option(label="") # 按文本选

4)键盘与按键

page.locator("#input").press("Enter")
page.locator("#input").press("Control+A")        # 组合键

5)文件上传

page.locator("input[type='file']").set_input_files("a.jpg")

6)拖拽

page.locator("#src").drag_to(page.locator("#dst"))

五、等待机制(内置智能等待,极少需要手动 sleep)

1)等待元素

page.locator(".ready").wait_for()                 # 等待出现
page.locator(".hide").wait_for(state="hidden")    # 等待消失

2)等待页面 / 请求

page.wait_for_load_state("load")
page.wait_for_load_state("networkidle")
page.wait_for_url("**/success")

六、断言(推荐用 expect,自动等待)Playwright

from playwright.sync_api import expect# 元素文本/值
expect(page.locator("h1")).to_have_text("欢迎")
expect(page.locator("input")).to_have_value("123")# 页面
expect(page).to_have_title("首页")
expect(page).to_have_url("https://example.com")# 元素状态
expect(page.locator(".btn")).to_be_enabled()
expect(page.locator(".alert")).to_be_visible()
expect(page.locator("#agree")).to_be_checked()# 包含文本/数量
expect(page.locator(".msg")).to_contain_text("成功")
expect(page.locator(".item")).to_have_count(5)

七、执行 JavaScript

# 1. 简单执行+返回值
title = page.evaluate("document.title")
sum_val = page.evaluate("([a,b]) => a+b", [1,2])# 2. 元素上执行
page.locator("#box").evaluate("el => el.style.color='red'")# 3. 页面加载前注入脚本
page.add_init_script("Math.random = () => 0.1")

八、浏览器上下文与多页面

context = browser.new_context()             # 独立上下文(cookie隔离)
page = context.new_page()# 监听新页面
with context.expect_page() as new_info:page.click("a[target='_blank']")
new_page = new_info.value
new_page.wait_for_load_state()# 切换页面
context.pages[1].bring_to_front()

九、高频简写(快速写用例)

# 链式一气呵成
page.locator("#user").fill("admin")
page.locator("#pwd").fill("123456")
page.locator("text=登录").click()
expect(page.locator("text=欢迎回来")).to_be_visible()

 

http://www.jsqmd.com/news/751216/

相关文章:

  • ElasticSearch集群状态红了黄了怎么办?手把手教你用Multi ElasticSearch Head插件快速定位问题
  • 魔兽争霸3终极优化伴侣:WarcraftHelper完整配置指南
  • 3步搞定Claude Code多终端同步:告别重复配置的烦恼
  • leetcode热题 - 5
  • AD9361 SPI no-os 文件移植 SoftConsole MPFS250T 初学(二) 接口适配
  • 亨得利全国7大直营服务中心维修保养地址电话全公开:百达翡丽、江诗丹顿、爱彼等高端腕表正规维修为何仅限北上广深等六城? - 时光修表匠
  • AC-3(通常指 Dolby Digital)音频解码器
  • video_to_axi_stream
  • 3分钟搞定微信语音转MP3:Silk v3解码器完全指南
  • 技术指南:Sabaki围棋软件构建专业级围棋分析与SGF编辑环境
  • day31-局部重绘视频创作
  • 厦门纹眉机构哪家靠谱?久匠连锁直营,专攻原生自然眉,长效定型超省心 - 企业博客发布
  • 在自动化脚本中如何实现文本转语音?
  • 打破语言壁垒:Translumo屏幕翻译工具让外语游戏与视频无障碍畅玩
  • 常州市涂料协会五届五次会员大会暨2026涂料行业高质量发展论坛在常州隆重召开 - 速递信息
  • 将 Hermes Agent 工具链接入 Taotoken 实现自定义模型调用
  • 百度网盘Mac版极速解锁秘籍:免费获取SVIP级下载体验
  • Zotero格式插件终极指南:3步实现文献元数据自动化格式化 [特殊字符]
  • 2026年不可错过!AI模型API聚合服务大揭秘,这几家让开发更高效、成本更低
  • 对比不同模型在taotoken上的token消耗与成本差异
  • MASA模组全家桶汉化包:5分钟快速安装指南,彻底解决Minecraft技术模组语言障碍
  • 深圳有什么靠谱纹眉店推荐?久匠十年专注半永久,温柔氛围感首选 - 企业博客发布
  • JPEGView:高效实用的轻量级图像查看器,为何值得你立即尝试?
  • 亨得利维修保养服务地址与预约电话全解析:为何百达翡丽、江诗丹顿等高端腕表只信赖这六城直营门店?(附官方服务中心指引) - 时光修表匠
  • 告别手动调价!一文读懂广告主如何利用智能出价(oCPC/eCPA)提升投放ROI
  • 高压均质机HPH的内部构造与核心原理
  • C++多线程编程:一张图看懂lock_guard、unique_lock、shared_lock和scoped_lock到底该怎么选
  • Postman便携版:如何实现零依赖的API测试环境部署?
  • 如何为《以撒的结合:忏悔》安装REPENTOGON脚本扩展器:从问题排查到性能优化的完整指南
  • SNP-sites:快速从多序列比对中提取SNP位点的终极指南