Playwright的使用
介绍
Playwright 是微软推出的自动化测试工具,能实现 Selenium 的同步模式和 Pyppteer 的异步模式,功能强大.
环境配置
第三方包下载
pip install playwright
初始化
playwright install
该指令会下载一些浏览器并配置驱动.
使用
同步模式和异步模式
同步模式
对于同步模式,需要导入 sync_playwright 方法,该方法返回一个同步的上下文管理器 PlaywrightContextManager,样例代码如下
from playwright.sync_api import sync_playwright
url = ""
with sync_playwright() as p:
for browser_type in [p.chromium,p.firefox,p.webkit]:
browser = browser_type.launch(headless = False) ## 默认为 true,需要修改才能看到页面
page = browser.new_page()
page.goto(url)
print(page.title)
page.screenshot(path = f"screenshot-{browser_type.name}.png")
browser.close()
异步模式
当我们的方法中有了 async 关键字的时候,我们就需要使用异步模式,导入 async_playwright 方法即可.
示例代码:
from playwright.async_api import async_playwright
import asyncio
url = "
async def main():
async with async_playwright as p:
for browser_type in [p.chromium,p.firefox,p.webkit]:
browser = await browser_type.launch(headless = False) ## 默认为 true,需要修改才能看到页面
page = await browser.new_page()
await page.goto(url)
print( await page.title)
await page.screenshot(path = f"screenshot-{browser_type.name}.png")
await browser.close()
代码生成
playwright 最厉害的地方就是代码生成.通过录制我们在浏览器中的操作生成对应的代码.
该功能通过 playwright 命令行调用 codegen 实现
通过
playwright codegen -h ##查看帮助
常用参数
- -o:输出代码文件路径
- -target:使用的语言,默认为 python,是同步模式的 python,也可选择 python-async 表示异步 python,或者其他语言
- -device:模拟手机浏览器
- -b:浏览器类型,默认为 chromium
- -timeout: 设置页面加载的超时时间
- -lang:浏览器使用的语言
移动端浏览器
playwrigh 也支持移动端的模拟器,同归对 PlaywrightContextManager 对象的 devices 属性指定一台移动设备即可,输入参数为移动设备的型号.
实例代码:
from playwright.sync_api import sync_playwright
url = ""
with sync_playwright() as p:
device = p.devices["IPhone 13 Pro Max"]
browser = p.webkit.launch(headless = False)
pass
选择器
文本选择
通过 text= 这样的语法能直接获得文本内容是指定内容的节点
例如
page.click("text= Log in") ##选择文本为 Log in 的节点进行 click
CSS 选择器
CSS 前面的博客已经提到过,.
表示 class,#
表示 id
厉害的是 playwright 的 CSS 选择器能结合其他的方式.
- 结合文本:使用 has-text 和 text 能结合文本值寻找.前者是包含特定文本值,后者是完全匹配
示例:
page.click(".item :has-text('XXX')")
page.click("#nav-bar :text('XXX')")
- 节点关系:还可以结合节点关系来筛选节点, has 指定包含另外一个节点的节点, right-of 指定位于某个节点右侧的节点
示例
page.click(".item :has(#nav-bar)")
page.click(".item :right-of(:text('XXX'))")
XPATH
XPATH 选择器的输入应该为: xpath=
例如:
page.click("xpath=//button")
事件监听
Page 对象提供了一个 on 方法,可用来监听页面发生的各个事件,例如 close,console,load,request,response 等
例如我们监听 response
from playwright.sync_api import sync_playwright
url = ""
def on_response(response):
print(f'Status:{response.status} {response.json()}')
with sync_playwright as p:
browser = p.firefox.launch(headless = False)
page = browser.new_page()
page.on("response",on_response)
page.wait_for_state("networkidle") ## 等待没有 network connection
page.goto(url)
页面点击
page.click 实现页面点击,下面是参数介绍
- selector: 选择器
- click_count: 点击次数
- timeout: 超时时间,默认为 30
- position: 传入一个字典,带有 x 和 y 属性,代表偏移量
- force: 如果无法点击,设置强制点击,默认为 False
页面等待
- wait_for_load_state: 等待进入某一个状态,分别是
load
: 等待加载事件被触发。domcontentloaded
: 等待DOMContentLoaded
被触发networkidle
: 等待所有的 network connection 结束
文本输入
page.fill 方法能输入文本,需要传入选择器和文本内容,另外可通过可选参数决定 timeout
节点获取
获取单个节点
query_selector()
方法返回符合选择器的第一个节点
获取多个节点
query_selector_all()
方法返回符合选择器的所有节点
获取节点属性
get_attribute 方法能获取节点属性,如果是 page 对象调用,则需要传入选择器,节点则不需要
网络劫持
route 方法能实现网络劫持和修改,该方法传入 url 和 回调函数,当检测到指定的 url 之后,会交给 回调函数处理,比如,实现加载本地文件
from playwright.sync_api import sync_playwright
def hack(route,response):
route.fulfill(path = 'xx')
with sync_playwright as p:
browser = p.firefox.launch(headerless = False)
url = ""
page = browser.new_page()
page.route("/",hack)
page.goto(url)
browser.close()