pyppeteer 有提供鼠标滑动的方法,但是单独调用 pyppeteer 滑动方法是无法通过验证的,必须使滑动轨迹更加接近人工的方式才行。

这里我们先了解一下pyppeteer是如何实现滑动的

一、pyppeteer 提供的滑动方法API

iframe.hover(slide_id) # 移动鼠标到滑块上方(聚焦)

page.mouse.down() # 按下鼠标

page.mouse.move() # 移动鼠标

page.mouse.up() # 松开鼠标

根据以上的4个方法组合就可以实现滑动。

二、滑动方法API详解

1.1 iframe.hover(slide_id) , slide_id是滑块的css选择器,例如'span#nc_1_n1z', 这个根据实际情况来指定。

这里需要注意的是iframe,什么意思呢?很多人给的参考都是直接调用page.hover(slide_id) ,但是很多情况在page里直接找调用hover(slide_id)是无法聚焦到滑块上的,这是因为滑块往往会加载在一个子页面 iframe 上,我们需要在找到 iframe ,然后在 iframe 上调用 hover 来聚焦滑块。

如果滑块已经页面page中,则直接调用 page.hover(slide_id), 无需这么复杂

1.2 如何找到 iframe

屏幕快照 2019-08-01 15.01.33.png

首先F12调出元素检查,查看滑块所在的窗口是否有 iframe,(或者直接 ctrl + f 搜索 iframe),

1.找出 iframe 的css选择器 :iframe#sufei-dialog-content (你应该根据实际情况填写)

2.在page中找到此 WebElement元素节点: iframe_element = await page.J('iframe#sufei-dialog-content')

此时还 无法在 iframe_element 上调用hover() 函数,因为iframe_element此时是 ElementHandle Class,而我们需要的是Frame Class

3.将ElementHandle Class强转成Frame Class :iframe =await iframe_element.contentFrame()

完整的方法应该是:

async def iframe_id2frame(iframe_id, page)

iframe_element = await page.J(iframe_id)

if iframe_element:

iframe =await iframe_element.contentFrame()

return iframe

else:

return None

slide_id = '#span……'

iframe_id = 'iframe.sd……'

iframe = await iframe_id2frame(iframe_id)

if iframe:

iframe.hover(slide_id)

2 page.mouse.down() 按下鼠标

这个没什么好说的,直接执行就好

3 page.mouse.move()

源码:async def move(self, x: float, y: float, options: dict = None,

**kwargs: Any) -> None:源码链接

其中x,y 是指移动到绝对横向,纵向坐标,options是一个字典,只有一个键steps,用来控制速度。

例如你想要鼠标向右移动500像素,则 x为当前横坐标 + 500,y为当前纵坐标不变。

当前的横坐标、纵坐标获取有些麻烦,网上也有人这样来滑动:

await page.mouse(10000,0) ,这样是指把鼠标横行移动到10000,纵向移动到零,滑动无法纵向移动,所以只能看到横行的移动效果。没有添加第三个参数,则默认一步完成 {'steps':1}

注意:这里的坐标和像素值是一致的,左上角为起点(0,0)

steps 是指分成几步来完成,steps越大,滑动速度越慢。(在源码中,steps是指移动到指定x,y 分段滑动的次数,但是每次启动滑动都会花费一定时间,可以认为steps是滑动的速度)

4 page.mouse.up() 松开鼠标

到现在,我们已经完成了滑动验证的功能,当然它还不够完善,但基本的功能已经齐全了,在下一节,介绍一下控制滑动轨迹,模拟人工滑动。

async def iframe_id2frame(iframe_id, page)

iframe_element = await page.J(iframe_id)

if iframe_element:

iframe =await iframe_element.contentFrame()

return iframe

else:

return None

# 1 聚焦

slide_id = '#span……'

iframe_id = 'iframe.sd……'

iframe = await iframe_id2frame(iframe_id)

if iframe:

# 如果滑块在页面page中,则直接调用 page.hover(slide_id),无需这么复杂

await iframe.hover(slide_id)

# 2 按下鼠标

await page.mouse.down()

# 3 滑动

await page.mouse.move(10000,0)

# 4 松开鼠标

await page.mouse.up()

注意1:这里pyppeteer涉及到 page 与 iframe,peppeteer的功能是以frame为基础单位来实现的,page 的功能 iframe 都有,page 在执行函数时,会先调用 frame = self.mainFrame,然后在frame上执行功能。mainFrame就是最外面的那个Frame

注意2: mouse对象是page/mainFrame对象所独有的,在子frame中,也就是iframe 中不能调用mouse对象。

python模拟人工滑动_pyppeteer 模拟人工滑动验证(一)相关推荐

  1. 「docker实战篇」python的docker-抖音appium模拟滑动操作(22)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「docker实战篇」python的docker-抖音appium模拟滑动操作(22) 上次代码写到了可以通过接口获取粉丝的数 ...

  2. 使用第三方打码平台图鉴识别滑动验证码模拟登录

    文章目录 一.图鉴的账户注册 识别流程 二.欧模网案例滑动验证码模拟登录 页面分析 三.代码分析 四.欧模网案例展示 总结 一.图鉴的账户注册 图鉴网页地址: http://www.ttshitu.c ...

  3. 移动端模拟导航可点击自动滑动

    移动端模拟导航可点击自动滑动 0.1.4. 导航可左右滑动,可点击边缘的一个,自动滚动下一个到可视范围[依赖于iscroll.js]. 废话不多说直接上代码: /** 移动端模拟导航可点击自动滑动 0 ...

  4. 算法小模板|滑动窗口(模拟)

    滑动窗口(模拟) double findMaxAverage(int* nums, int numsSize, int k) {int sum = 0;for(int i=0;i<k;i++){ ...

  5. lvgl如何用单向直线触摸滑动条模拟编码器的滚动操作,请注意,单向触摸滑动条是一个输入外设,是一个硬件,而并非lvgl内置的滑条控件...

    LVGL可以通过监听单向触摸滑动条的输入事件,并在触摸滑动条的值变化时进行相应的操作,从而模拟编码器的滚动操作.具体的实现方法如下: 初始化单向触摸滑动条:在初始化时,要确保单向触摸滑动条处于正常工作 ...

  6. linux中c语言对滑屏进行判断,自动化测试程序之二模拟触摸屏点击事件跟滑动事件(C语言)...

    一.测试程序编写说明 终端设备上运行的是LINUX+QT应用程序,使用触摸屏进行人机交互.经过测试人员长时间的人机交互测试,来确认系统的功能是否满足需求后.现在需要编写一个自动化的测试程序模拟触摸屏点 ...

  7. python 滑动验证码_python:TX滑动验证码识别方案一

    一.介绍: 本内容只做技术交流使用,请勿做商业用途.本方法验证采用本地自建服务器的形式来对所介绍的算法做验证 滑动验证码如下图所示: 复制代码 二.本地测试环境构建 本地测试环境的构建CSDN已有文章 ...

  8. python运维之轻松模拟开发FTP软件05

       以往众多运维者,大多都是在应用国外已经开发好的软件,如今的国内运维职位已经要求我们具备较强的创新能力,一些日常小工具小软件应该能做到手到拈来,这样我们才能在激烈的竞争中占据有利位置.请看: py ...

  9. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  10. python网球比赛模拟_Python-体育竞技模拟

    体育竞技分析的IPO模式: 输入I(input):两个球员的能力值,模拟比赛的次数(其中,运动员的能力值,可以通过发球方赢得本回合的概率来表示,一个能力值为0.8的球员,在他发球时,有80%的可能性赢 ...

最新文章

  1. java jint,JNI:将unsigned int转换为jint
  2. 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层
  3. c语言编写动画屏保源码,发个C代码(简单动画演示)
  4. 大学学习论坛 需求分析报告.菜鸟版.多喷.看看问题所在
  5. Guava之RangeMap
  6. 引入 Gateway 网关,这些坑一定要学会避开!!!
  7. putty的窗口关闭相关的可能需要注意的细节
  8. 11_05.【Java】线程安全与线程同步
  9. linux中排序程序,linux排序命令
  10. hdfs 元数据维护机制
  11. 云渲染哪个平台好?哪个网渲平台比较便宜?
  12. 从零点亮一个led灯
  13. 使用ffmpeg对mp3格式的音频文件类型转换、截取及合并
  14. BOSE在上海发布6款音频新品;轩尼诗全球首家概念酒吧在上海开幕 | 美通企业日报...
  15. 老弟,来了?VUE+Nuxt.js+Koa+Vuex入门教程(一)仿写一个cnode网站
  16. Discuz!教程之从码云下载的Discuz!代码安装后个人资料页面乱码问题修复
  17. ElasticSearch 7 权威指南(一)什么是Elasticsearch ?
  18. 达芬奇pro的FPGA学习笔记1--创建vivado工程
  19. 【JAVA程序设计】(C00072)基于Springboot的网上点餐管理系统
  20. 買下地球系列--美股ETF國際代碼整理(前進海外必備)

热门文章

  1. 程序设计基础(C语言)(已完结)
  2. pano2vr输出的HTML手机可以看吗,Pano2VR怎么导出手机可看_ Pano2VR导出手机查看教程...
  3. matlab中matconvnet,MATLAB2017a编译MatConvNet过程中出现的各种问题
  4. 体验汉印T260标签打印机,让分类管理更简单
  5. 校园一卡通管理信息系统的设计与实现(asp.net)
  6. 俄罗斯航空发动机AL-31F(solidworks模型)
  7. 数据分析-常用分析方法-(1)描述性分析-用Excel实现
  8. java分布式事务框架_Java分布式事务,及解决方案
  9. Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
  10. 三菱PLC MC协议