【网络爬虫&自动化测试】Playwriht系列文章一

Playwriht系列文章(一)



一、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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄昏中起飞的猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值