playwright使用
Whisper Lv5

安装

1
pip install playwright

安装浏览器驱动

输入命令后,playwright会自动下载浏览器驱动

1
playwright install

第一个代码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from playwright.sync_api import sync_playwright

# 上下文管理器,自动启动/关闭浏览器
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=500) # 操作延迟500ms

# 创建一个新的标签页
page = browser.new_page()

# 访问百度
page.goto("https://www.baidu.com")

# 截图
page.screenshot(path="baidu_home.png")
# 上下文管理器会自动关闭浏览器,当然也可以手动调用 browser.close()
browser.close()

print("操作完成")

常用元素定位

ID

1
`page.locator("#kw")`

Name属性

1
page.locator("[name=wd]")

CSS 选择器

id:

1
page.locator("#kw")

class:

1
page.locator(".s_ipt")

XPath 选择器

1
page.locator("//*[@id='kw']") # id定位

元素交互

按键操作

1
2
# 搜索框输入后,按回车键提交(替换点击按钮)
search_input.press("Enter")

勾选复选框/单选框

1
2
page.locator("#agree").check()  # 勾选「同意协议」复选框
page.locator("#agree").uncheck() # 取消勾选「同意协议」复选框

下拉框选择

1
2
3
# 下拉框选择
page.locator("#city").select_option(label="北京") # 文本选择「北京」
page.locator("#city").select_option(value="bj") # 按值选择「bj」

获取元素文本/属性

1
2
3
4
kw = page.locator("#kw")
print("获取文本:", kw.inner_text())

href = kw.get_attribute("href") # 获取属性用get_attribute

悬浮操作

1
page.locator("#nav-setting").hover()  # 悬浮到设置按钮

等待

Playwright 内置自动等待机制,会在操作元素前,自动等待元素「可交互」(默认超时 30 秒),无需手动加等待。

  • 操作元素(click()/fill() 等)时,自动等待元素出现、可交互。
  • 可手动设置超时时间(如 page.locator("#kw").fill("内容", timeout=10000),10 秒超时)
1
2
3
4
5
6
7
8
# 1. 等待元素可见
page.locator("#kw").wait_for(state="visible")

# 2. 等待页面加载完成(load:DOM 加载完成,networkidle:网络空闲)
page.wait_for_load_state("networkidle")

# 3. 等待自定义条件(如页面标题包含测试)
page.wait_for_function("document.title.includes('测试')")

iframe处理

先定位到iframe: page.frame_locator()

1
iframe = page.frame_locator("iframe[name='rich']")

定位内部元素:.locator() 定位 iframe 内部元素

1
2
3
p = iframe.locator("body > p")
text = p.inner_text()
print("文本:", text)

文件上传

input[type="file"]: 这种直接提交file名称。

1
2
page.locator("#upload-input").set_input_files("test.jpg")  # 单文件
page.locator("#upload-input").set_input_files(["test1.jpg", "test2.pdf"]) # 多文件

拖拽上传:

1
page.locator("#drop-area").set_input_files("test.jpg")

穿透影子DOM

直接使用css定位

1
page.locator("#my-component button.primary").click()

断言

安装断言库

1
pip install playwright-stubs

实例

1
2
3
4
5
6
7
8
9
10
11
from playwright.sync_api import sync_playwright, expect
......
# 断言标题
expect(page).to_have_title("百度一下,你就知道")
# 断言输入框可见、可编辑
search = page.locator("#kw")
expect(search).to_be_visible()
expect(search).to_be_enabled()

# 断言文本存在
expect(page.locator("text=百度一下")).to_be_visible()

报告

安装pytest-playwright

1
pip install pytest-playwright

结合pytest使用。