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命…

微服务保护-雪崩问题

雪崩&#xff1a; 微服务调用链路中的某个微服务故障&#xff0c;引起整个链路微服务都不可用&#xff0c;这就是雪崩。&#xff08;在微服务中&#xff0c;某个微服务故障&#xff0c;导致整个微服务都不可用&#xff09; 雪崩产生的原因&#xff1a; 微服务相互调用&#xf…

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

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

Linux shell 实现版本号自增,文件自动保存

Linux shell脚本实现x.x.x格式递增版本号&#xff0c;每次运行脚本自动将最后一位版本号1&#xff0c;每次更新后将最新的版本号保存到当前txt文件内容&#xff0c;以保持连续递增版本号。 脚本文件目录 rootubuntu01:/scripts/version# tree . ├── increment_version.sh └…

两数之和 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…

2024全国青少年电子信息智能创新大赛(决赛)python·模拟二卷解析

2024全国青少年电子信息智能创新大赛(决赛)python模拟二卷解析 一、程序题第一题: 描述 随机生成的 10 个在[1,100)范围内整数存入列表;输入一个待查找的整数 k,运用二分法在列表中查找 k,根据查找状态输出对应的结果。 输入: [13, 25, 27, 41, 52, 66, 67, 69, 72, 75] 7…

数据分析------统计学知识点(一)

1.在统计学中&#xff0c;均值分类有哪些&#xff1f; 算术均值&#xff1a;平均值&#xff0c;所有数值加总后除以数值的个数 几何均值&#xff1a;所有数值相乘后&#xff0c;再取其n次方根&#xff0c;n是数值的个数 调和均值&#xff1a;是数值倒数的算术均值的倒数 加…

细说ARM MCU中的MX_GPIO_Init()函数的实现过程

目录 1、建立.ioc工程 2、 MX_GPIO_Init()函数 &#xff08;1&#xff09;MX_GPIO_Init()函数的类型 &#xff08;2&#xff09;MX_GPIO_Init()函数中用到的结构体变量 &#xff08;3&#xff09;MX_GPIO_Init()函数使能时钟 &#xff08;4&#xff09;MX_GPIO_Init()函数…

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 ————…

Chatglm3-6b报错处理

目录 AttributeError: ChatGLMTokenizer object has no attribute sp_tokenizer AttributeError: ChatGLMConfig object has no attribute max_sequence_length AttributeError: ChatGLMConfig object has no attribute position_encoding_2d AttributeError: ChatGLMConfi…