playwright使用教程总结

安装

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) 
相关推荐
scheduleTTe2 小时前
Nginx
服务器·前端·nginx
techdashen2 小时前
不开端口,不配 DNS,用树莓派在家搭一个公网可访问的 Web 服务
前端·网络·智能路由器
早起傻一天~G2 小时前
vue2+element-UI表单封装
前端·vue.js·ui
pixcarp2 小时前
Nginx实战部署与踩坑总结 附带详细配置教程
服务器·前端·后端·nginx·golang
Live&&learn3 小时前
Vue项目打包后内联字符串不显示的原因
前端·javascript·vue.js
爱上好庆祝3 小时前
学习js的第三天
前端·css·人工智能·学习·计算机外设·js
aq55356003 小时前
Chrome如何重塑Web标准的未来格局
前端·chrome
宁雨桥3 小时前
深入剖析Vue2与Vue3响应式原理:从Object.defineProperty到Proxy的演进
前端·vue.js
wytraining3 小时前
SDD规范驱动开发
前端