安装
Bash
pip install playwright
安装浏览器
Bash
playwright install
自动化代码助手
Bash
playwright codegen
注意:该方法只能作为助手,它主要是记录人对页面的输入,并不能取代人自己写代码,特别是那些获取页面上信息的代码
运行配置
启动浏览器
Python
from playwright.sync_api import sync_playwright
#启动chrome浏览器
browser = p.chromium.launch(headless=False)
# 启动firefox浏览器
browser = p.firefox.launch(headless=False)
# 启动webkit浏览器
browser = p.webkit.launch(headless=False)
启动指定浏览器
Python
# 加上 executable_path参数
browser = p.chromium.launch(headless=False,executable_path='c:\Program Files\Google\Chrome\Application\chrome.exe')
界面等待
Python
page.wait_for_timeout(1000)
跟踪功能
Python
# 创建 BrowserContext对象
context = browser.new_context()
# 启动跟踪功能
context.tracing.start(snapshots=True, sources=True, screenshots=True)
page = context.new_page()
# 结束跟踪
context.tracing.stop(path="trace.zip")
查看跟踪文件:
直接访问 trace.playwright.dev这个网站,上传跟踪文件
执行命令 playwright show-trace trace.zip
编写用例
定位元素
locator对象
Python
# 根据Tag名定位
locators = page.locator('div')
# 根据ID定位
locators = page.locator('#searchtext')
# 根据class定位
locators = page.locator('.animal')
# 获得所有元素locator对象
locators = page.locator('div').all()
# 只需要得到某种表达式对应的元素数量
locators = page.locator('.animal').count()
# 只需要得到某种表达式对应的第一个,或者最后一个元素
locators = page.locator('.plant')
print(locators.first.inner_text(), locators.last.inner_text())
# 获取不可见(display:none)的文本
locators = page.locator('.plant')
print(locators.text_content())
# 获取元素属性
locator.get_attribute(name)
# 获取元素内部的html
locator.inner_html()
# 通过 nth 方法,获取指定次序的元素,计数从0开始
locators = page.locator('.plant')
print(locators.nth(0).inner_text())
根据文本内容定位
Python
# 获得所有文本内容包含11的元素
elements = page.get_by_text('11').all()
# 支持正则表达式匹配,如所有以11结尾的文本内容
import re
elements = page.get_by_text(re.compile('11$')).all()
根据role定位
Python
locators = page.get_by_role('alert')
执行动作
单击
Python
page.get_by_role("button").click()
# 双击
page.get_by_role("button").dblclick()
悬停
Python
page.get_by_role("link").hover()
等待元素可见
Python
page.locator("#source").wait_for()
判断元素是否可见
Python
page.locator("#source").is_visible()
输入框操作
Python
# 文本输入框
page.get_by_role("textbox").fill("example value")
# 文本框清空
page.get_by_role("textbox").clear()
# 获取输入框里的文字
value = page.get_by_role("textbox").input_value()
# 文件输入框
# 上传一个文件
page.get_by_label("Upload file").set_input_files('myfile.pdf')
# 上传多个文件
page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])
radio单选/checkbox多选
Python
#Check和click的区别,如果已经选中,click变为取消选中,check可以保证选中你所选中的选项
# 选择某内容
page.get_by_role("checkbox").check()
# 取消选择
page.get_by_role("checkbox").uncheck()
# 判断是否选中
checked = page.get_by_role("checkbox").is_checked()
select元素操作
Python
# select_option参数是选项option元素的value或者选项文本,要完全匹配
element.select_option("blue")
# 根据选项文本选择
element.select_option(label="blue")
# 根据value属性多选
element.select_option(value=["red", "green", "blue"])
# 清空所有选择
element.select_option([])
网页操作
Python
# 打开网址
page.goto(url)
# 刷新
page.reload()
# 前进
page.go_back()
# 后退
page.go_forward()
# 获取整个网页html
page.content()
# 获取整个网页的标题栏文本
page.title()
# 设置页面大小
page.set_viewport_size({"width": 640, "height": 480})
frame切换
iframe 元素非常的特殊,在html语法中,frame元素或者 iframe 元素的内部会包含一个被嵌入的另一份html文档。在我们使用Playwright打开一个网页时,操作范围缺省是当前的html,并不包含被嵌入的html文档里面的内容。如果我们要定位/操作被嵌入的 html文档中的元素,就必须切换操作范围到被嵌入的文档中
Python
# 产生一个 FrameLocator 对象
frame = page.frame_locator("iframe[src='sample1.html']")
# 再在其内部进行定位
lcs = frame.locator('.plant').all()
for lc in lcs:
print(lc.inner_text(timeout=1000))
窗口切换
在新窗口里面打开一个新网址,并且去自动化操作新窗口里面的元素,page变量对应的还是老窗口,自动化操作也还是在老窗口进行,需要使用 BrowserContext 对象
Python
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
# 创建 BrowserContext 对象
context = browser.new_context()
# 通过context 创建page
page = context.new_page()
page.goto("https://")
# 点击链接,打开新窗口
page.locator("a").click()
# 等待2秒,不能用 time.sleep
page.wait_for_timeout(2000)
# pages属性是 所有窗口对应Page对象的列表
newPage = context.pages[1]
# 打印新网页窗口标题
print(newPage.title())
# 打印老网页窗口标题
print(page.title())
冻结页面
Python
setTimeout(function(){debugger}, 5000)
截屏
Python
# 截屏当前页面可见内容,保存到当前工作目录下的1.png文件中
page.screenshot(path='1.png')
# 截屏完整页面,页面内容长度超过窗口高度时,包括不可见部分。
page.screenshot(path='1.png', full_page=True)
# 只对 某个元素的显示内容 进行截
page.locator('input[type=file]').screenshot(path='2.png')
拖拽
Python
# 要选中 span#t1 文本内容,并且拖拽到 输入框 [placeholder="captcha"] 里面去
# 选中 `span#t1` 文本内容
page.locator('#t1').select_text()
# 拖拽到 输入框 `[placeholder="captcha"]` 里面去
page.drag_and_drop('#t1', '[placeholder="captcha"]')
#如果被拖动元素的Locator对象已经产生,可以直接调用其 drag_to 方法 进行拖动
# 选中 `span#t1` 文本内容
lc = page.locator('#t1')
lc.select_text()
# 拖拽到 输入框 `[placeholder="captcha"]` 里面去
lc.drag_to(page.locator('[placeholder="captcha"]'))
对话框
Python
# 点击确定按钮
dialog.accept()
# 点击取消按钮
dialog.dismiss()
# 打印弹出框信息
print(dialog.message)