Playwright 自动化操作

news2025/1/22 18:04:25

之前有见同事用过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.url
    if 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()

        #事件监听----start
        page.on('response', on_response)    #响应事件监听
        page.on('request', on_request)      #发起请求事件监听
        page.on('download', on_download)  # 文件下载事件监听
        # 事件监听----end

        #网络拦截---start
        route_url = 'http://127.0.0.1/zentao/testcase-create-1-0-0.html' #可以指定拦截url,或者部分定制url
        #route_url = '**'       #指定全部的url
        #route_url = '**/*.json'    #指定部分url
        page.route(route_url, handle_request)  # 监听添加用例接口
        # 网络拦截---end

        page.goto('https://spa6.scrape.center/') #请求网页地址
        page.wait_for_load_state('networkidle') #等待页面所有请求响应完毕,还有load, domcontentloaded


        element = 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.coloradmin.cn/o/1719114.html

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

相关文章

【UE5.1 角色练习】09-物体抬升、抛出技能 - part1

前言 在上一篇(【UE5.1 角色练习】08-传送技能)的基础上继续实现控制物体抬升、抛出的功能。 效果 步骤 一、准备技能动画 1. 在项目设置中新建一个操作映射,这里命名为“Skill_GravityControl”,用按键4触发 2. 通过IK重定向…

【UE5:CesiumForUnreal】——加载无高度地形数据

目录 1.实现目的 2.数据准备 2.1下载数据 2.2 数据切片 3.加载无地形数据 1.实现目的 在CesiumForUnreal插件中,我们加载地图和地形图层之后,默认都是加载的带有高程信息的地形数据,在实际的项目和开发中,有时候我们需要加载无…

使用QtCreator C++编写串口调试助手

100编程书屋_孔夫子旧书网 1.首先看一下我设计的界面(我这里比较简单,大家可根据自己的需求进行设计) (界面设计的过程中,每一个控件的名称最好进行修改,便于后续控件太多不好区分,给控件命名的…

《中国科技纵横》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《中国科技纵横》期刊是核心吗? 答:不是,是万方维普收录的正规期刊。 问:《中国科技纵横》知网收录吗? 答:知网不收录,万方维普收录。主管单位&#xf…

leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历等的介绍

文章目录 前言一、单值二叉树二、相同的树三、二叉树的前序遍历四、二叉树的中序遍历五、二叉树的后序遍历六、另一棵树的子树七、二叉树的遍历总结 前言 leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历等…

21 厂商考证介绍(华为 华三 锐键 深信服)+AI 解析

一 认识考证体系 二 明确考证的大致方向 锐键 职业资格证书等级介绍 职业资格证书是由国家职业资格鉴定机构或相关行业主管部门颁发的,用于证明一个人在特定职业领域具备一定技能和知识水平的证明文件。职业资格证书的等级分为初级、中级、高级、技师、高级技师、…

一个HL7的模拟工具

这个模拟器是为了过( NIST美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)的电子病历住院部分的认证而写的。 用途说明 inpatient中的lab order信息通过该工具向实验室转发该信息。并将实验室…

算法(二)二分查找

文章目录 二分查找简介实现方式循环方式递归方式 经典例子 二分查找简介 二分查找(binary search)算法,也叫折半算法。二分查找是针对有序的数据集合的查找办法,如果是无序的数据结合就使用遍历。二分查找之所以快速,…

MATLAB的plot3使用技巧|更改视角|例程分享链接

plot3命令 MATLAB的plot3函数是用来绘制3D图形的函数。它可以将三维数据可视化为线段、点、曲线等形式。plot3函数可以用于绘制三维空间中的曲线、曲面、散点图等。 plot3函数的基本用法是: plot3(X,Y,Z):绘制三维线段,其中X、Y、Z分别是包…

使用C#实现VS窗体应用——画图板

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。🍎个人主页:Meteors.的博客💞当前专栏:小项目✨特色专栏: 知识分享&#x1f96d…

FinalShell无法连接Linux

Linux使用Vmware会创建一个网络,让两个子网处于一个网关,这样就能在windows中连接Linux,只有在这种情况下才能FinalShell才能连接Linux

Java过滤特殊空格nbsp;

现象: 用Java处理excel文件中的以下字符串时,想去除此空格,却发现用String.trim()没有直到预期效果: 原因: 在网上找了下,应该是这其实是html中经常使用的一种特殊空格字符  处理&a…

关于PyQt5的TreeWidget的与百度Ai的问答

中肯的讲啊,不带有任何色彩啊,百度Ai在编程这方面确实差了点。确实是在网罗所有资料,但是收集起来不能进行深度的分析,好像没有设置一个自己先把总结出的代码答案运行一下的功能,所以有时候给出的代码答案根本跑不了。…

Java基础语法——字符串(String/StringBuilder/Stringjoiner)

String Java的String类是不可变的,意味着一旦创建,其值就不能被改变。String类提供了丰富的API来操作字符串。 以下是一些常用的方法: 构造方法: 有以下几种常见的: public class stringlearn {public static void…

基于知识图谱分析贸易关系走向

基于知识图谱分析贸易关系走向 前言一、基础数据二、贸易规则三、知识图谱可视化四、完整代码 前言 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点&#…

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

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

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年,江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始,该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念,全力以赴为客户构建专业的工业有机废气治理整体解决方案,进而成为国家高新技术企…

Java基础语法规范

语法规范 public class HelloWorld{ //类名: 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法,该⽅法从{开始到}结束…