Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了

  • Playwright 相对于selenium优点
    1、自动下载chromnium, 无需担心chrome升级对应版本问题
    2、支持录屏操作,然后直接生成python代码;
    3、支持网路拦截、事件监听,纵使我们是模拟浏览器,但是依旧可以在request请求上作文章,这个就很牛逼;
    4、代码简洁性更高;
    5、支持异步处理;

  • 安装使用

    #下载第三方库
    pip3 install playwright
    #安装好后,进行初始化操作,它会自动安装chromium, Firefox , webkit浏览器并配置一些驱动
    playwright install
    
  • 录屏操作
    1、使用控制台(terminal,cmd, powershell),进入到项目目录下;
    2、查看所有的录屏相关命令:playwright codegen -h
    3、启动示例:

    #-o 非必须,输出代码到指定文件,如果不指定,也可以在界面中复制代码就好
    #-b 非必须,指定浏览器, 默认是chromnium
    #--device #非必须, 指定机器型号
    #www.baidu.com #非必须, 指定访问的url
    playwright codegen -o luping.py -b chromnium --device="iphone 13" www.baidu.com#--save-storage 保存浏览器缓存,可以自定义指定项目名称
    playwright codegen -b cr  --save-storage=saiying www.saleyee.cn
    #--load-storage 获取已有的浏览器缓存,指定好项目名称就好
    playwright codegen -b cr  --load-storage=saiying www.saleyee.cn
    

    4、录屏时,直接人工操作就好了,也可以暂停录屏,至于如何获取元素内容,需要自己探究;
    5、退出录屏,只要在控制台ctrl+C
    在这里插入图片描述
    6、然后把代码改一改,就可以使用了,这个还是很方便的;

    • 使用代码示例
      事件监听:
    • "close":页面关闭事件。
    • "console":页面上发生控制台日志事件。
    • "crash":页面崩溃事件。
    • "dialog":页面弹出对话框事件。
    • "domcontentloaded":DOM 内容加载完成事件。
    • "download":页面上触发下载事件。
    • "filechooser":页面弹出文件选择对话框事件。
    • "frameattached":子框架附加到页面事件。
    • "framedetached":子框架从页面分离事件。
    • "framenavigated":子框架导航事件。
    • "load":页面加载完成事件。
    • "pageerror":页面上发生错误事件。
    • "popup":页面弹出弹出窗口事件。
    • "request":页面发出网络请求事件。
    • "requestfailed":页面上的请求失败事件。
    • "requestfinished":页面上的请求完成事件。
    • "response":页面接收到网络响应事件。
    • "websocket":页面上发生 WebSocket 事件。
    • "worker":页面上发生 Worker 事件。
# -*- coding: utf-8 -*-
import asyncio
import time
from urllib import parse
from playwright.async_api import async_playwright
from playwright.sync_api import sync_playwright#!!!!!!!!!!!!!!响应事件response监听, 数据采集的逻辑可以在这里做
def on_response(response):if 'api/movie/' in response.url and response.status == 200:# print(f'Statue {response.status}: {response.url}')print(response.json())#请求事件request监听,只能获取相关的请求参数,用处不大,
def on_request(request):print(request.url)#!!!下载事件监听,比如店铺后台的表格下载就可以在此处理
def on_download(download):print(f"Download started: {download.url}")#!!!!!!!!!!!!!网络劫持
#可以实现网络劫持和修改操作,比如非加密,通过相应参数修改,获取自定义返回的内容,从而采集
#它就相当于一个网络钩子,可以修改请求信息, 还可以设置保持浏览器上url不变的情况下,跳转其他站点页面
def handle_request(route, request):url = request.urlif url == "http://example.com":if route.request.method == "GET":print(f"GET请求url为:{route.request.url}")bits = list(parse.urlparse(url))qs = parse.parse_qs(bits[4])qs["key1"] = ["GET"]  # 此处替换key1的值bits[4] = parse.urlencode(qs, True)url = parse.urlunparse(bits)print(f"改变后的url为: {url}\n")route.continue_(url=url)elif route.request.method == "POST":print(f"POST请求入参为:{route.request.post_data}")text_list = route.request.post_data.split("&")for i in range(len(text_list)):text_item = text_list[i]if "key1=" in text_item:text_list[i] = "key1=POST"  # 此处替换key1的值print(f"改变后的数据为: {'&'.join(text_list)}\n")route.continue_(post_data="&".join(text_list))# 同步
# 使用with打开服务可以避免中间代码执行报错导致无法正常关闭浏览器进程
with sync_playwright() as p:# browser_type_list = [p.chromium, p.firefox, p.webkit]for browser_type in [p.chromium]:browser = browser_type.launch(headless=False)#=======!!!可以指定项目名称,例(saiying),这样可以继承上一次浏览器缓存,这样可以规避下重复登录的问题, 但是不清楚没有该项目名称情况下会有什么问题# 也可以不指定创建一个新的context = browser.new_context()# 如果使用该种方式,记得流程结束后,要再保留下当前缓存context.storage_state(path="saiying"), 在下面有示例# context = browser.new_context(storage_state="saiying")# page = context.new_page()#直接生成新浏览器执行对象page = browser.new_page()#事件监听----startpage.on('response', on_response)    #响应事件监听page.on('request', on_request)      #发起请求事件监听page.on('download', on_download)  # 文件下载事件监听# 事件监听----end#网络拦截---startroute_url = 'http://127.0.0.1/zentao/testcase-create-1-0-0.html' #可以指定拦截url,或者部分定制url#route_url = '**'       #指定全部的url#route_url = '**/*.json'    #指定部分urlpage.route(route_url, handle_request)  # 监听添加用例接口# 网络拦截---endpage.goto('https://spa6.scrape.center/') #请求网页地址page.wait_for_load_state('networkidle') #等待页面所有请求响应完毕,还有load, domcontentloadedelement = page.query_selector('xpath=//a')  #单节点定位elements = page.query_selector_all('xpath=//a')  # 多节点定位for element in elements:print(element.inner_html())         #打印该节点下所有标签内容print(element.get_attribute('href'))element.query_selector('xpath=.//img')print(page.title())#=======!!! 在登录完毕,或者操做完毕后,保留当前缓存,供下次调用# context.storage_state(path="saiying")# context.close()page.close()browser.close()         #关闭浏览器# #异步, 感觉用处不大
# async def main():
#     async with async_playwright() as p:
#         # browser_type_list = [p.chromium, p.firefox, p.webkit]
#         for browser_type in [p.chromium]:
#             browser = await browser_type.launch(headless=False)
#             page = await browser.new_page()
#             await page.goto('https://www.baidu.com')
#             print(await page.title())
#             await browser.close()
#
# asyncio.run(main())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干Java的有4年的工作经验;想转行做labview能行吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!bVIEW和Java都是软件工具&a…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代,信息安全问题日益突出,文档加密软件成为了保护数据安全的重要手段。但是,市面上的文档加密软件种类繁多,功能各异,如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

【第十三节】C++控制台版本坦克大战小游戏

目录 一、游戏简介 1.1 游戏概述 1.2 知识点应用 1.3 实现功能 1.4 开发环境 二、项目设计 2.1 类的设计 2.2 各类功能 三、程序运行截图 3.1 游戏主菜单 3.2 游戏进行中 3.3 双人作战 3.4 编辑地图 一、游戏简介 1.1 游戏概述 本项目是一款基于C语言开发的控制台…

5. MySQL运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

Linux基本命令的使用(cp mv)

一、cp命令-1 1、CP命令作用&#xff1a;复制一个源文件到目标文件&#xff08;夹&#xff09; 2、 语法&#xff1a;cp [选项] 源文件 目标文件&#xff08;夹&#xff09; ① 复制到文件夹下&#xff0c;则文件名保持不变 ② 复制到文件中&#xff0c;则文件名变更 二、cp命…

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件&#xff08;站在…

两数之和 II - 输入有序数组,三数之和

题目一&#xff1a; 代码如下&#xff1a; vector<int> twoSum(vector<int>& numbers, int target) {int left 0;int right numbers.size() - 1;vector<int> ret;while (left < right){int tmp numbers[left] numbers[right];if (tmp target){r…

vue3学习使用笔记

1.学习参考资料 vue3菜鸟教程&#xff1a;https://www.runoob.com/vue3/vue3-tutorial.html 官方网站&#xff1a;https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程&#xff1a;https://www.runoob.com/w3cnote/webpack-tutor…

Proteus 安装报错There is a problem with this Windows lnstaller package

Proteus 安装常见问题 1.安装秘钥(许可证)的时候报错 报错信息如下所示&#xff1a; There is a problem with this Windows lnstaller package. A program required for this instalt to compiete coutd notbe run,contact your support personnet or packagevendor. 这个是…

在Ubuntu乌班图上安装Docker

最近在学习乌班图相关的内容&#xff0c;找了一些文档安装的都是报错的&#xff0c;于是记录一下学习过程&#xff0c;希望也能帮助有缘人&#xff0c;首先查看乌班图的系统版本&#xff0c;我的是如下的&#xff1a; cat /proc/version以下是在Ubuntu 20.04版本上安装Docker。…

Apache Druid 代码执行(CVE-2021-25646)漏洞复现

Druid简介与漏洞成因 Apache Druid是一个高性能的实时分析型数据库&#xff0c;旨在对大型数据集进行快速查询分析。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景&#xff0c;同时&#xff0c;Druid也通常被用来助力分析型应用的图形化界面&am…

3---C++之list(逻辑梳理、简单使用演示、部分源码实现)

一、先决知识点1——认识list&#xff1a; list底层实现是双向链表&#xff0c;但是不是循环链表。list是否使用哨兵节点&#xff0c;是细节问题&#xff0c;C标准并未规定。list是链表&#xff0c;他的优势在于对节点的操作会十分灵活&#xff0c;因此它在需要频繁插入和删除元…

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 减少需要处…

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…

BioVendor—sHLA-G ELISA试剂盒

人类白细胞抗原-G (HLA-G)与其他MHC类基因的不同之处在于它的低多态性和产生七种HLA-G蛋白的选择性剪接&#xff0c;这些蛋白的组织分布局限于正常的胎儿和成人组织&#xff0c;这些组织对先天和后天免疫细胞都具有耐受性。可溶性HLA-G是一种免疫抑制分子&#xff0c;诱导活化的…

详细解析Barlow Twins:自监督学习中的创新方法

首先先简单了解一下机器学习中&#xff0c;主要有三种学习范式&#xff1a;监督学习、无监督学习和自监督学习&#xff1a; 监督学习&#xff1a;依赖带标签的数据&#xff0c;通过输入输出映射关系进行训练。无监督学习&#xff1a;不依赖标签&#xff0c;关注数据的内在结构…

pikachu靶场(unsafe upfileupload(文件上传)通关教程)

目录 client check 1.在桌面新建一个文本文档 2.保存为.png格式 3.打开网站 4.按照图中操作 5.点击forward 6.访问 MIME type 1.新建一个php文件&#xff0c;里面写上 2.上传文件&#xff0c;就是我们保存的文件 3.打开抓包工具&#xff0c;点击开始上传 4.修改Conen…

ADC数模转换器

一、ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 1、ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 2、12位逐次逼近型ADC&#xff0c;1us转换时间 3、输入电压范围&#xff1a;0~3.3V&a…

【K8s】专题四(2):Kubernetes 控制器之 Deployment

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、工作原理 三、相关特性 四、资源清单&#xff08;示例&#xff09; 五…

【Linux】多线程——线程概念|进程VS线程|线程控制

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解【Linux】多线程——线程概念|进程VS线程|线程控制 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! &…