Playwriht系列文章(一)
Playwright
一、Playwright是什么?
Playwright是类似于selenium、Pyppeteer等的一种自动化测试工具,于2020年初微软进行开源,虽然诞生较晚,但发展得非常火热。
二、使用步骤
1.基本使用
Playwright提供了两种编写模式,一种是和Selenium相同的同步模式,另一种是和Pyppeteer相同的异步模式。
同步模式(示例):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch() #启动chromium浏览器
page = browser.new_page() #新建page实例
page.goto("http://playwright.dev") #请求网站
print(page.title())
browser.close()
异步模式(示例):
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("http://playwright.dev")
print(await page.title())
await browser.close()
asyncio.run(main())
2.Browser
BrowserType
playwright.chromium方法创建BrowserType对象,这个对象通常用于启动一个chromium浏览器(也可以启动其他浏览器,如webkit、firefox)
示例:
from playwright.sync_api import sync_playwright
def run(playwright):
BrowserType = playwright.webkit #返回BrowserType
iphone = playwright.devices["iPhone 6"] #devices配置设备信息
browser = BrowserType.launch()
context = browser.new_context(**iphone)
page = context.new_page()
page.goto("http://example.com")
# other actions...
browser.close()
with sync_playwright() as playwright:
run(playwright)
BrowserType.launch(**kwargs)方法
使用这个方法创建Browser实例
browser = playwright.webkit.launch()
通过BrowserType.launch方法设置浏览器的启动和减速等参数:
headless=False:浏览器启动模式;
slow_mo参数:降低浏览器运行速度。
playwright.chromium.launch(headless=False, slow_mo=50)
BrowserType.launch_persistent_context(**kwargs)
该方法可以读取浏览器本地配置和cookie等信息
user_data_dir: 浏览器的本地数据文件地址,通过chrome://version链接可以看到谷歌浏览器的数据文件位置
browser = await playwright.chromium.launch_persistent_context(user_data_dir, **kwargs)
BrowserContexts
BrowserContexts提供了一种操作多个独立浏览器会话的方法。
新建BrowserContexts(上下文管理器)示例:
browser = playwright.chromium.launch()
context = browser.new_context() #新建Browsercontext
通过Browserontexts设置模拟移动设备、权限、区域设置和颜色方案的多页面场景:
context = browser.new_context(
**iphone_11, #设备
locale='de-DE',
geolocation={ 'longitude': 12.492507, 'latitude': 41.889938 },#定位地理位置
permissions=['geolocation'] #权限
)
获取cookie信息
playwriht提供了多种读取和保存cookie信息的方法
通过模拟登录或上述中BrowserType.launch_persistent_context方法读取本地数据文件后,可以使用BrowserContexts.cookies方法获取对应url的cookies.
context.cookies(**kwargs)
交互模式
终端中绕过contexts上下文管理器,这在REPL应用程序中很有用:
>>> from playwright.sync_api import sync_playwright
>>> playwright = sync_playwright().start()
>>> browser = playwright.chromium.launch()
>>> page = browser.new_page()
>>> page.goto("http://whatsmyuseragent.org/")
>>> page.screenshot(path="example.png")
>>> browser.close()
>>> playwright.stop()
3.Page
创建Page实例
Page实例提供了与浏览器中的扩展页面。一个Browser实例可能有多个Page实例。
使用BrowserContext.new_page创建page实例。
创建了一个新的页面,请求一个URL,然后保存一个截图:(示例):
def run(playwright):
webkit = playwright.webkit
browser = webkit.launch()
context = browser.new_context()
page = context.new_page() #new_page新建浏览器页面
page.goto("https://example.com") #goto方法请求网页
page.screenshot(path="screenshot.png")#screenshot截图
browser.close()
with sync_playwright() as playwright:
run(playwright)
常用方法
Page实例提供了页面的断言、节点定位、点击、填充文本和键盘按钮等多种方法。
获取页面源代码方法:
page.content()
页面点击:
page.click(selector, **kwargs) #selector代表选择器,**kwargs参数有点击次数、超时时间等。
page.full(selector,value,**kwargs) #value输入值
示例:
page = context.new_page() #打开新页面
# Navigate explicitly, similar to entering a URL in the browser.
page.goto('http://example.com')#访问url
# Fill an input.
page.fill('#search','query') #填充文本
# Navigate implicitly by clicking a link.
page.click('#submit') #点击按钮提交
# Expect a new url.
print(page.url) #打印页面url
print(page.content()) #打印页面源代码
事件监听
使用Page实例提供的on方法,可以监听网页中各类请求和响应的信息(如果需要拦截修改请求和响应的话需要使用 page.route 网络劫持)。
当页面发送对网络资源的请求时,页面会发出以下事件序列:
page.on(‘request’) 对网站进行请求时触发
page.on(‘respones’) 接受到网站响应时触发
page.on(‘requestfinished’) 完成网站请求时触发
监听Request请求
通过监听Request请求,可以输出对应的请求url、请求模式、post请求数据和headers等信息。
request请求对象的各类方法:
request.all_headers()
request.failure
request.frame
request.header_value(name)
request.headers
request.headers_array()
request.is_navigation_request()
request.method
request.post_data
request.post_data_buffer
request.post_data_json
request.redirected_from
request.redirected_to
request.resource_type
request.response()
request.sizes()
request.timing
request.url
示例:
输出监听到请求url和headers信息
page.on("request", lambda request: print(request.url ,request.headers))
监听close事件(页面关闭时触发):
page.on('close')
监听Response事件
response响应对象的各类方法:
response.all_headers()
response.body()
response.finished()
response.frame
response.header_value(name)
response.header_values(name)
response.headers
response.headers_array()
response.json()
response.ok
response.request
response.security_details()
response.server_addr()
response.status
response.status_text
response.text()
response.url
示例:
获取响应码和响应url
from playwright.sync_api import sync_playwright
def on_response(response):
print(f'Statue {response.statues}:{response.url}
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = broser.new_page()
page.on('response',on_response)
page.goto('http://https://spa6.csrape.center/')
page.wait_for_load_state('networkidle')
browser.close()
输出结果对应浏览器Network面板中的所有请求和响应。
网络劫持
page.route()方法可以实现网络劫持;
通过回调函数里编写route对象的各种方法实现请求和响应修改操作
劫持图片请求,取消图片加载(示例):
def cancel_request(route, request):
route.abort() #回调函数中route.abort取消请求
page.route(re.compile(r"(\.png)|(\.jpg)", cancel_request) #route劫持请求,回调函数
拦截响应,修改响应结果,指定响应html代码(示例):
route.full(path="./xxx.html") #回调函数中使用route.full指定响应html文件路径
节点定位
参数1:选择器(css或xpath);参数2:属性名称; 参数3:可以设置timeout等
page.get_attribute(selector, name, **kwargs)
page.query_selector_all(selector) #返回列表,包含多个节点对象(ElementHandle)
获取单个节点
单个节点对象是ElementHandle对象
page.query_selector(selector)
获取节点内容
ElementHandle对象可以直接使用get_attribute获取节点属性值
也可以直接使用text_content方法获取节点文本:
通过page实例定位节点,提取内容
page.text_content(selector, **kwargs) #获取选择器定位的节点内容
playwright还提供了多种选择器,包括css、xpath和css+文本等,还为其扩展了一些方便的方法。
三、playwright录制功能
playwright还提供了一个强大的功能,使用playwright录制功能可以自动生成在浏览器中操作的代码,快速进行开发,具体请看讲解系列二:
https://philosophy.blog.csdn.net/article/details/125068742?spm=1001.2014.3001.5502
总结
以上就是今天要讲的内容,本文简单介绍了playwright的常用方法,而playwright提供了大量能使我们快速便捷的方法,具体请参照playwright文档https://playwright.dev/python/docs/api/class-playwright
。