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

2023-11-15

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • C语言之自定义函数的实现

    自定义函数的作用 方便管理代码 编写程序时思路清晰 代码复用 同一段代码可以在不同位置多次执行 函数声明 使用 返回值类型 函数名 类型 变量名 类型 变量名 例如 int sum int num1 int num2 实际上 在函数声明时
  • 【Leetcode】154. 寻找旋转排序数组中的最小值 II

    题目描述 已知一个长度为 n 的数组 预先按照升序排列 经由 1 到 n 次 旋转 后 得到输入数组 例如 原数组 nums 0 1 4 4 5 6 7 在变化后可能得到 若旋转 4 次 则可以得到 4 5 6 7 0 1 4 若旋转 7
  • php脚本中利用mail函数发送邮件及问题归纳

    最近在学php脚本语言 书中有一个实例 服务器端将浏览器发送的信息通过php脚本 利用mail函数发送到一个邮箱 自己讲书中实例代码上传至服务器 在浏览器上填写表单 并提交后 邮箱迟迟收不到邮件 1 php中mail函数发送邮件失败问题 邮
  • 2021-10-19,Oracle VM VirtualBox中安装增强功能失败

    问题 Oracle VM VirtualBox中安装增强功能失败 根据给出的信息提示进行解决 This system is currently not set up to build kernel modules Please instal
  • 静态博客提升访问速度:内嵌CSS,异步加载js,压缩HTML

    在谷歌搜索的功能速度 实验性 中推荐使用工具PageSpeed Insights查看我的网页访问速度情况 PageSpeed Insights 分数很低 只有33分 优化建议的第一条是移除阻塞渲染的资源 里面列出了非异步加载的css和js文
  • 公告

    作为一个稳定 高效 安全的区块链底层平台 FISCO BCOS一方面致力于保障系统稳定性 兼容性 鲁棒性 易用性 另一方面专注于提升区块链底层平台的性能 可扩展性 自FISCO BCOS v3 0开始 社区更是秉着开源 开放 联合共建的原则
  • 最长公共子序列算法_解决最长公共子序列问题的算法和过程

    最长公共子序列算法 最长的公共子序列 Longest common Subsequence Let X and Y be two subsequences and by LCS algorithm we can find a maximum
  • 机器学习笔记——概率生成模型

    假设有两类数据 每一类都有若干个样本 概率生成模型认为每一类数据都服从某一种分布 如高斯分布 从两类训练数据中得到两个高斯分布的密度函数 具体的是获得均值和方差两个参数 测试样本输入到其中一个高斯分布函数 得到的概率值若大于0 5 则说明该
  • nestjs:判断字符串是否是邮箱格式

    问题 如标题 参考 js判断邮箱格式是否正确 掘金 解决 function checkIsMail mail string const regex a zA Z0 9 a zA Z0 9 a zA Z0 9 2 4 return regex
  • c++之全局变量

    全局变量需要我们在头文件声明 在cpp文件定义 请记住尽量这么做 保持操作的规范性 全局变量的使用 一般为两种 一种是不包含头文件 一种是包含了头文件 1 不包含头文件 例如我在test02 h中声明了全局变量 接下来在cpp中定义 如果想
  • 九十六、kettle版本8.2连接数据库的中文乱码问题

    在学习使用kettle 从Excel导数据到MySQL数据库的过程中踩了不少坑 总结一下以做前车之鉴 希望能给大家提供一点帮助 关于中文乱码目前找到了两种也可以叫三种方法 因为版本不同而方法可能不同 目前我使用第一种防范解决了中文乱码问题
  • React:状态提升案例-烧开水

    1 定义Boilingverdict组件 function Boilingverdict props if props celsius gt 100 return h1 水烧开了 h1 else return h1 水凉凉 h1 expor
  • ffmpeg基础一:解封装

    参考 零声学院 1 解封装流程 2 打开文件或媒体 获取文件或媒体的媒体信息AVFormatContext AVFormatContext是描述一个媒体文件或媒体流的构成和基本信息的结构体 AVFormatContext ifmt ctx
  • python绘制动态变化的图_用Jupyter Noteb中的matplotlib绘制动态变化图形

    我一直在寻找一个很好的解决方案 其中一个线程正在泵送数据 我们希望Jupyter笔记本不断更新图形 而不阻止任何事情 在查阅了十几个相关答案后 以下是一些发现 小心 如果你想要一个实时的图表 不要使用下面的魔术 如果笔记本使用以下内容 则图
  • 一个在PDO数据绑定上踩的坑

    不经常用PDO 一直不知道数据绑定的时候的一个细节 不可使用同一个变量名为不同的符号进行数据绑定 因为这样的话会导致在执行execute 时 不同符号都绑定了同一个值 最后一个赋予这个变量名的值 比如 letters array a b c
  • mysql商品实现多退少补_(转)mysql处理高并发,防止库存超卖

    原文链接 http blog csdn net caomiao2006 article details 38568825 今天王总又给我们上了一课 其实mysql处理高并发 防止库存超卖的问题 在去年的时候 王总已经提过 但是很可惜 即使当
  • JS逆向教程第一发

    JS逆向教程第一发 项目简介 本文适合爬虫新手初步接触js逆向时进行阅读 初步接触JS逆向 并不是很熟悉逆向操作的 可以以本文为参考 初步入门 如果有大佬 也欢迎批评指正 本文以企名科技这个网站为例 初步介绍JS逆向的基本操作 环境准备 此
  • Ubuntu20.04.4LTS安装CUDA11.6,cuDNN,TensorRT,PyCUDA,PyTorch

    从0到1的cuda安装 前言 这个CUDA是否选择最新版本和你是否用pytorch有关 你先去Pytorch查一下它最高支持的cuda版本是啥 不是一般都不是最新版 0 cuda卸载 1 cuda最新版本安装 1 检查所需版本 2 具体操作
  • JS-cookie和正则表达式

    一 cookie 1 什么是cookie 会话跟踪技术 2 作用 验证身份 存储信息 3 特点 大小限制 最多存4k 每个域下只能存50个cookie 有时间限制 只能存放字符串 只能访问同一个域内的cookie 4 读取和设置cookie
  • 【网络爬虫&自动化测试】Playwriht系列文章一

    Playwriht系列文章 一 Playwright Playwriht系列文章 一 一 Playwright是什么 二 使用步骤 1 基本使用 2 Browser BrowserType BrowserType launch kwargs