【python自动化】Playwright基础教程(六)事件操作③单击双击计数过滤截图JS注入

news2024/12/23 18:40:27

【python自动化】Playwright基础教程(六)事件操作③单击&双击&计数&过滤&截图&JS注入

本文目录

文章目录

  • 【python自动化】Playwright基础教程(六)事件操作③单击&双击&计数&过滤&截图&JS注入
    • playwright系列回顾
    • 前文代码
    • 点击 - click
      • 官方示列
      • 点击常用实战
    • 双击 - dblclick
      • 双击实战
    • 计数 - count
      • 计数使用实战
    • 过滤 - filter
      • 过滤实战
    • 截图 - screenshot
      • 截图实战
    • 执行js - evaluate
      • JS注入实战
      • JS注入实战

playwright系列回顾

playwright连接已有浏览器操作

selenium&playwright获取网站Authorization鉴权实现伪装requests请求

【python自动化】playwright长截图&切换标签页&JS注入实战

【python自动化】Playwright基础教程(二)快速入门

【python自动化】Playwright基础教程(三)定位操作

【python自动化】Playwright基础教程(四)事件操作①元素高亮&元素匹配器

【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲

前文代码

直接定位指定浏览器

class Demo05:
    def __init__(self):
        """
        使用playwright连接谷歌浏览器
        :return:
        """
        self.playwright = sync_playwright().start()
        # 连接已经打开的浏览器,找好端口
        browser = self.playwright.chromium.connect_over_cdp("http://127.0.0.1:9223")
        self.default_context = browser.contexts[0]
        self.page = self.default_context.pages[0]

启动新的浏览器

class Demo06:
    def __init__(self, url):
        playwright = sync_playwright().start()
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        self.page = context.new_page()
        self.page.goto(url)
       
        
if __name__ == '__main__':
    mwj = Demo05(url="指定的url")
    mwj.Locator_testid()

点击 - click

单击一个元素

使用方法

page.get_by_role("button").click()

参数

参数类型释义
buttonList[“left”, “middle”, “right”]左、中、右可选,默认是左left
click_countint默认值为1,具体看:https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
delayfloat按下按键和松开按键之间时间(单位为毫秒),默认为0毫秒。
forcebool是否绕过可操作性检查。默认值为 false
modifiersList[“Alt”, “Control”, “Meta”, “Shift”]要按下的修饰键,有四个可供选择。
positionDict{x: float, y: float},相对于元素填充框的左上角的点,如果没有指定,则使用元素的某个可见点。
trialbool设置后,此方法仅执行可操作性检查并跳过操作。默认值为 false 。等到元素可以执行操作时再执行。
no_wait_afterbool可以通过设置此标志来选择退出等待,只有在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认值为 false
timeoutfloat最长等待时间,单位毫秒,默认值为30000(30秒)。

官方示列

要求:按住Shift键再右键点击画布的特定位置。

page.locator("canvas").click(
    button="right", modifiers=["Shift"], position={"x": 23, "y": 32}
)

点击常用实战

案列需求

  • 在搜索框输入梦无矶小仔,点击百度一下

代码

def click_demo01(self):
    # 在搜索框中输入 梦无矶小仔
    self.page.locator("//input[@id='kw']").fill("梦无矶小仔")
    # 点击百度一下(id="su")
    self.page.locator("//input[@id='su']").click()

效果展示

image-20230913173807479

双击 - dblclick

双击一个元素

使用方法

locator.dblclick()
locator.dblclick(**kwargs)

参数

参数类型释义
buttonList[“left”, “middle”, “right”]左、中、右可选,默认是左left
delayfloat按下按键和松开按键之间时间(单位为毫秒),默认为0毫秒。
forcebool是否绕过可操作性检查。默认值为 false
modifiersList[“Alt”, “Control”, “Meta”, “Shift”]要按下的修饰键,有四个可供选择。
positionDict{x: float, y: float},相对于元素填充框的左上角的点,如果没有指定,则使用元素的某个可见点。
trialbool设置后,此方法仅执行可操作性检查并跳过操作。默认值为 false 。等到元素可以执行操作时再执行。
no_wait_afterbool可以通过设置此标志来选择退出等待,只有在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认值为 false
timeoutfloat最长等待时间,单位毫秒,默认值为30000(30秒)。

双击实战

实战测试网址:https://cps-check.com/cn/double-click-test

代码

def dblclick(self):
    for i in range(5):
        self.page.locator("#clicker").dblclick()

这里我们循环点击五次双击。

效果展示

image-20230913182745681

网页显示说点了九次双击,大于我们设定的5次,这是因为我们的playwright太快啦!

如果只运行一次双击,那这里显示的双击就是一次。

计数 - count

返回与定位方式匹配的元素个数。(在之前的highlight中我们展示梦无矶元素的时候就能看到后面的计数。)

使用方法

count = page.get_by_role("listitem").count()

返回值

返回一个int类型的数值。

计数使用实战

  • 统计搜索页面上有多少个梦无矶

image-20230913185811162

代码展示

def count_operate(self):
    self.page.get_by_text("梦无矶").highlight()
    mwj_count = self.page.get_by_text("梦无矶").count()
    print(mwj_count)

输出结果

11

过滤 - filter

根据选项缩小现有定位方式的定位范围(如文本过滤),并且可以多级过滤。

使用方法

row_locator = page.locator("tr")
# ...
row_locator.filter(has_text="text in column 1").filter(
    has=page.get_by_role("button", name="column 2 button")
).screenshot()

参数

参数类型释义
hasLocator匹配包含与内部定位器匹配的元素的元素。根据外部定位器查询内部定位器。例如, articletext=Playwright 匹配 <article><div>Playwright</div></article> 项。
has_notLocator和上面的相反,匹配不存在某个元素。
has_not_textstr匹配不包含指定文本的元素,这些元素可能包含子元素或后代元素。传递 [string] 时,匹配不区分大小写并搜索子字符串。
has_textstr匹配包含指定文本的元素,这些元素可能包含子元素或后代元素。传递 [string] 时,匹配不区分大小写并搜索子字符串。例如,“Playwright” 匹配 <article><div>Playwright</div></article> .

返回值

返回一个定位器,Locator

实用场景

  • 有时候我们遇到的元素不好一步到位定位,我们就可以使用过滤一步步进行定位。
  • 有多个相同定位的元素,但是某个属性不同,我们可以通过过滤进行定位需要的元素。
  • 在翻页操作中,最后一页的>箭头一般是置灰不可操作,有is-disabled类似的属性,可以通过过滤该元素是否有次属性,从而判断我们现在是否翻页到了最后一页。

过滤实战

案列需求:悬浮到产品,显示后定位悬浮框中计算云服务器ECS。(我强行写的案列,实际操作可以一步到位。)

image-20230914145532450

元素定位

产品的网页源码

<a class="global-menu-item" href="https://www.aliyun.com/product/list" target="_self" data-spm-anchor-id="5176.28055625.J_4VYgf18xNlTAyFFbOuOQe.2"><span>产品</span><i class="navIconfont icon-topnavput_away"></i></a>
  • 这里我们看到class="global-menu-item",但是和产品同一行的这些文字,都有相同的class属性(有九个),通过高亮显示得知,这个是第一个,所以我们使用如下定位。

  • image-20230914175559524

  • self.page.locator('[class="global-menu-item"]').nth(0)
    

计算源码

image-20230914163150156

  • 同理,计算这一列所有元素都有class="menu-type-title",我们可以进行过滤计算这个文本进行定位。(这里是为了演示filter,如果用xpath会更简单,抬杠的自己从30楼倒立走到1楼,我都会给你秀一遍)

  • 以下定位方式,都可以定位到计算

  • self.page.locator('[class="menu-type-title"]').filter(has_text="计算").first.highlight()
    
    # Xpath 删除 计算 前后的空白字符进行匹配
    self.page.locator('//a[normalize-space()="计算"]').highlight()
    # Xpath文本匹配
    self.page.locator('//a[text()="计算"]').highlight()
    # Xpath 多级匹配
    self.page.locator('//div[@class="menu-left-content"]//a[text()="计算"]').highlight()
    
  • image-20230914181810893

云服务器ECS的网页源码

image-20230914162355554

这里和计算的定位方式一样,这里就不赘述了。

完整代码

def filter_operate(self):
    # 本案例url= 'https://www.aliyun.com/'
    # 鼠标悬浮到 产品
    self.page.locator('[class="global-menu-item"]').nth(0).hover()
    self.page.wait_for_timeout(500)
    # 再悬浮到 计算
    self.page.locator('[class="menu-type-title"]').filter(has_text="计算").first.hover()
    # Xpath 删除 计算 前后的空白字符进行匹配
    # self.page.locator('//a[normalize-space()="计算"]').highlight()
    # Xpath文本匹配
    # self.page.locator('//a[text()="计算"]').highlight()
    # Xpath 多级匹配
    # self.page.locator('//div[@class="menu-left-content"]//a[text()="计算"]').highlight()

    # 再高亮云服务器ECS
    self.page.locator('//a[@class="menu-item-title"]').filter(has_text="云服务器 ECS").nth(0).highlight()

效果展示

image-20230914190217330

截图 - screenshot

截取与定位器匹配的元素的屏幕截图

使用方法

page.get_by_role("link").screenshot()

参数

参数类型含义
timeoutUnion[float, None]最大等待时间,以毫秒为单位。默认为30000(30秒)。传入0以禁用超时。browser_context.set_default_timeout()page.set_default_timeout()方法更改默认值。
typeUnion[“jpeg”, “png”, None]指定截图的类型,默认为png。
pathUnion[pathlib.Path, str, None]图像保存的文件路径。截图类型将根据文件扩展名进行推断。如果path是相对路径,则相对于当前工作目录解析。如果不提供路径,则图像将不会保存到磁盘。
qualityUnion[int, None]图像的质量,介于0到100之间。不适用于png图像。
omit_backgroundUnion[bool, None]隐藏默认的白色背景,允许使用透明度进行截图。不适用于jpeg图像。默认为false
animationsUnion[“allow”, “disabled”, None]设置为"disabled"时,停止CSS动画、CSS过渡和Web动画。动画的处理方式取决于其持续时间:有限动画将快进到完成状态,因此它们会触发transitionend事件。 无限动画将取消到初始状态,然后在截图后重新播放。默认为"allow",即保持动画不变。
caretUnion[“hide”, “initial”, None]设置为"hide"时,截图将隐藏文本插入符。设置为"initial"时,文本插入符的行为不会改变。默认为"hide"
scaleUnion[“css”, “device”, None]设置为"css"时,截图上每个CSS像素将具有一个实际像素。对于高DPI设备,这将使截图保持较小的大小。使用"device"选项将使每个设备像素有一个实际像素,因此高DPI设备的截图将是两倍或更大。默认为"device"
maskUnion[List[Locator], None]指定在截图时应隐藏的定位符。被隐藏的元素将被叠加一个粉色框#FF00FF(由maskColor自定义),完全覆盖其边界框。
mask_colorUnion[str, None]指定被隐藏元素的覆盖框的颜色,以CSS颜色格式表示。默认颜色为粉色#FF00FF

截图实战

参考之前的文章【截图】部分:【python自动化】playwright长截图&切换标签页&JS注入实战

执行js - evaluate

在页面中执行 JavaScript 代码,将匹配元素作为参数。

使用方法

tweets = page.locator(".tweet .retweets")
assert tweets.evaluate("node => node.innerText") == "10 retweets"

参数

参数类型释义
expressionstr在浏览器上下文中运行的 JavaScript 表达式。如果表达式的计算结果为函数,则会自动调用该函数。
argEvaluation Argument参数参考JS:https://playwright.dev/python/docs/next/evaluating#evaluation-argument
timeoutfloat最长等待时间,单位毫秒,默认值为30000(30秒)。

另外一个执行js的方法是evaluate_handle

page.evaluate() 和 page.evaluate_handle() 之间的唯一区别是 page.evaluate_handle() 返回 JSHandle。

JS注入实战

参考之前的文章【JS注入】部分:【python自动化】playwright长截图&切换标签页&JS注入实战

和 page.evaluate_handle() 之间的唯一区别是 page.evaluate_handle() 返回 JSHandle。

JS注入实战

参考之前的文章【JS注入】部分:【python自动化】playwright长截图&切换标签页&JS注入实战

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

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

相关文章

Git忽略文件.gitignore的使用

1.为什么使用? 当你使用git add .的时候有没有遇到把你不想提交的文件也添加到了缓存中去&#xff1f;比如项目的本地配置信息&#xff0c;如果你上传到Git中去其他人pull下来的时候就会和他本地的配置有冲突&#xff0c;所以这样的个性化配置文件我们一般不把它推送到git服务…

arcgis--消除坐标系信息的两种方法

方法一&#xff1a;在【目录】中右击待修改数据&#xff0c;选择【属性】&#xff0c;选择【XY坐标】选项卡&#xff0c;点击清楚按钮。 方法二&#xff1a;在【数据管理工具】-【投影与变换】-【定义投影】中清楚坐标系信息。如下&#xff1a;

每日一题:逆波兰表达式求值(后缀表达式)

这个题比较难理解的就是逆波兰表达式是什么东西&#xff0c;上面我贴了定义&#xff0c;这个题本身不难&#xff0c;只需要运用迭代器逐个访问&#xff0c;当为数字是存入栈中&#xff0c;是算符时就要取数出来进行运算&#xff0c;先取出的是右操作数&#xff0c;取出来以后用…

【done】剑指offer46_new:解密数字

题目&#xff1a;力扣165&#xff0c;https://leetcode.cn/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/description/ 现有一串神秘的密文 ciphertext&#xff0c;经调查&#xff0c;密文的特点和规则如下&#xff1a; 密文由非负整数组成 数字 0-25 分别对应字母 a-z 请…

Arthas(阿尔萨斯)--(二)

目录 一、Arthas学习 1、JVM相关命令一 1、dashboard 2、thread 3、jvm 4、sysprop 一、Arthas学习 Arthas(阿尔萨斯)--(一) Arthas代码开源地址 1、JVM相关命令一 1、dashboard dashboard:显示当前系统的实时数据面板&#xff0c;按q或ctrlc退出 ID: Java 级别的线…

自定义Graph Component:1.2-其它Tokenizer具体实现

本文主要介绍了Rasa中相关Tokenizer的具体实现&#xff0c;包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer&#xff0c;后者包括BertTokenizer和AnotherWhitespaceTokenizer。 一.JiebaTokenizer   Ji…

IDEA 2022创建Spring Boot项目

首先点击New Project 接下来&#xff1a; (1). 我们点击Spring Initializr来创建。 (2). 填写项目名称 (3). 选择路径 (4). 选择JDK------这里笔者选用jdk17。 (5). java选择对应版本即可。 (6). 其余选项如无特殊需求保持默认即可。 然后点击Next。 稍等一会&#xff0c…

RK3568平台开发系列讲解(Linux系统篇)Linux内核定时器详解

🚀返回专栏总目录 文章目录 一、系统节拍率二、内核定时器简介三、内核定时器API四、延时函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定…

敏感数据是什么?包含哪些?如何保障安全?

最近看到不少小伙伴在问&#xff0c;敏感数据是什么&#xff1f;包含哪些&#xff1f;如何保障安全&#xff1f;这里我们小编就给大家一一解答一下&#xff0c;仅供参考哦&#xff01; 敏感数据是什么&#xff1f; 敏感数据&#xff0c;是指泄漏后可能会给社会或个人带来严重危…

2023亚太杯数学建模ABC题思路汇总分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

新能源汽车三电系统上的VDA接口在操作空间有限时如何快速密封与连接

针对新能源汽车三电系统上的VDA接口的快速密封与连接&#xff0c;格雷希尔GripSeal快速接头有其对应的G90系列&#xff0c;但随着现在有些新能源汽车体型越来越小&#xff0c;其三电系统的体积也越来越小&#xff0c;相对应的它们各个接口之间的距离也就越来越近&#xff0c;其…

Find My冲浪板|苹果Find My技术与冲浪板结合,智能防丢,全球定位

冲浪板就是冲浪运动中必不可少的器材之一。冲浪板是一块能够承受波浪抛掷的器材&#xff0c;通常由泡沫材质制成&#xff0c;也有一些采用其他材质制成的高档板。冲浪板不仅能够帮助人们在波浪中快速滑行&#xff0c;还能提供重心支撑和掌控波浪的稳定性。电动冲浪板是一种新型…

Linux---(六)自动化构建工具 make/Makefile

文章目录 一、make/Makefile二、快速查看&#xff08;1&#xff09;建立Makefile文件&#xff08;2&#xff09;编辑Makefile文件&#xff08;3&#xff09;解释&#xff08;4&#xff09;效果展示 三、背后的基本知识、原理&#xff08;1&#xff09;如何清理对应的临时文件呢…

SpringbootSecurity登陆验证(前后端分离)

一、什么是jwt JWT全称是JSON Web Token&#xff0c;如果从字面上理解感觉是基于JSON格式用于网络传输的令牌。实际上&#xff0c;JWT是一种紧凑的Claims声明格式&#xff0c;旨在用于空间受限的环境进行传输&#xff0c;常见的场景如HTTP授权请求头参数和URI查询参数。JWT会把…

基于若依的ruoyi-nbcio流程管理系统增加流程设计器支持自定义表单的选择与处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 因为之前不支持在流程设计器进行自定义业务表单的关联选择&#xff0c;所以这部分实现这个。 1、前端 对…

使用jedis连接虚拟机redis报错 Failed to connect to any host resolved for DNS name

问题描述&#xff1a; 导致该问题发生的原因可能是虚拟机没有开放6379端口。 解决方案&#xff1a; 首先检查redis.conf的bing配置是否被注释了&#xff0c;如果没有将其注释 第二步&#xff0c;将保护模式设置为no 第三步&#xff0c;接下来可以使用命令查看6379端口是否…

聚观早报 |京东11.11公布成绩单;2023数字科技生态大会

【聚观365】11月13日消息 京东11.11公布成绩单 2023数字科技生态大会 TikTok深受英国中小企业青睐 周鸿祎称大模型2年内可“进”智能汽车 双11全国快递业务量达 6.39 亿件 京东11.11公布成绩单 京东11.11公布成绩单&#xff1a;截至11月11日晚23:59&#xff0c;2023年京东…

ASD光谱仪使用

ASD光谱仪使用 光谱仪机器和电脑用来实时查看光谱曲线&#xff0c;以及控制光谱仪采集的时间、条数等各项参数。 在采集时&#xff0c;需要面向太阳&#xff0c;将待测的对象完全暴露于阳光下&#xff08;下图站位是错误的挡住光线了&#xff09;。探头放置于对象正上方50cm处…

Linux进程之通过系统调用创建进程[fork()函数]

文章目录 0.PID是什么?1.通过代码创建子进程--fork1.1fork()初识1.2通过系统调用创建进程1.3perror()函数的了解 2.fork()的进一步了解2.1通过代码了解2.2查看进程的指令 0.PID是什么? 进程PID&#xff08;Process ID&#xff09;是操作系统为每个正在运行的进程分配的唯一标…

jquery的$

jQuery是什么 jQuery是一个快速、简洁的JavaScript框架&#xff0c;jQuery设计的宗旨是“write Less&#xff0c;Do More”。 jQuery的$ 使用过jQuery的应该都知道jQuery的$&#xff0c;看到源码中的这一段就能知道相当于jquery的简写&#xff0c; jquery有两种用法&#x…