Appium+python自动化(二十八)- 滑呀滑,滑到奈何桥喝碗孟婆汤 - 高级滑动(超详解)

简介  

  奈何桥上叹奈何,三生石前憾三生,彼岸花下非彼岸,奈何三生彼岸人。

  相传过了鬼门关便上一条路叫黄泉路,路上盛开着只见花,不见叶的彼岸花。花叶生生两不见,相念相惜永相失,路尽头有一条河叫忘川河,河上有一座桥叫奈何桥。走过奈何桥有一个土台叫望乡台。望乡台边有个亭子叫孟婆亭,有个叫孟婆的女人守候在那里,给每个经过的路人递上一碗孟婆汤。忘川河边有一块石头叫三生石。喝下孟婆汤让人忘了一切。三生石记载着前世今生来世。

  人死先到鬼门关,出了鬼门关,途经黄泉路,来到忘川河边,便是奈何桥。奈何桥上有孟婆,要过奈何桥,就要喝孟婆汤,不喝孟婆汤,就过不得奈何桥,过不得奈何桥,就不得投生转世。凡是喝过孟婆汤的人就会忘却今生今世所有的牵绊,了无牵挂地进入轮回道开始了下一世的轮回。

  孟婆汤又称忘情水或忘忧散,一喝便忘前世今生。阳间的每个人在这里都有自己的一只碗,碗里的孟婆汤,其实就是活着的人一生所流的泪。每个人活着的时候,都会落泪:因喜,因悲,因痛,因恨,因愁,因爱。孟婆将他们一滴一滴的泪收集起来,煎熬成汤,在他们离开人间,走上奈何桥头的时候,让他们喝下去,忘却活着时的爱恨情愁,干干净净,重新进入六道,或为仙,或为人,或为畜。不是每个人都会心甘情愿地喝下孟婆汤。

  因为这一生,总会有爱过的人不想忘却。孟婆会告诉他:你为她一生所流的泪都熬成了这碗汤,喝下它,就是喝下了你对她的爱。来的人眼中最后的一抹记忆便是他今生挚爱的人,喝下汤,眼里的人影慢慢淡去,眸子如初生婴儿般清彻。为了来生再见今生最爱,你可以不喝孟婆汤,那便须跳入忘川河,等上千年才能投胎。千年之中,你或许会看到桥上走过今生最爱的人,但是言语不能相通,你看得见她,她看不见你。

千年之中,你看见她走过一遍又一遍奈何桥,喝过一碗又一碗孟婆汤,你盼她不喝孟婆汤,又怕她受不得忘川河中千年煎熬之苦。千年之后若心念不灭,还能记得前生事,便可重入人间,去寻前生最爱的人。奈何桥边有块青石叫三生石,三生石记载着每个人的前世今生,石身上的字鲜红如血,最上面刻着四个大字“早登彼岸”。

  溜冰是香港目前流行的叫法,而国内则叫旱冰或轮滑,台湾称为溜冰,澳门则叫它做雪屐。不论叫法如何,其目的只是区别水冰地面或非水冰地面 (ICE SKATING)。然而在宏哥这宏哥把手机上的这种滑动称其为溜冰,咱也当一回文艺人。
今天做自动化设置手势密码9宫格,本以为发现swipe不能满足需求,于是用TouchAction去实现手势滑动。但是不是想象中的那么顺利。

  这篇文章写的特别的痛苦,写的死去活来,期间多次想放弃,但是最终坚持下来了,破茧成蝶,写的宏哥好像真的是奈何桥上走了一遭,。细心地小伙伴们或者童鞋们会发现宏哥已经好多天没有更新文章了。那是因为这篇文章中遇到了不少坑,耗费了大量时间,总的来说大约是两个晚上的时间,每晚上大约3到4个小时。下边慢慢的听宏哥给你一一道来。

高级溜冰的滑动

滑动操作一般是两点之间的滑动,这种滑动宏哥在这里称其为低级的溜冰滑动;就是宏哥上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作,连续拖动图片移动等场景。那么这种高级绚丽的溜冰滑动在Appium中该如何模拟这类操作呢?下面听宏哥给你慢慢道来。

TouchAction

首先看一下官方文档

地址:https://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html

Touch Action包含一些列操作,比如按压、长按、点击、移动、暂停。由着些不同操作可以组成一套动作。使用TochAction需要先导入对应的模块

from appium.webdriver.common.touch_action import TouchAction
按压

方法:press() 开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。 press也可以接收屏幕的坐标(x,y)。

press(self, el=None, x=None, y=None)TouchAction(driver).press(x=0,y=308)
长按

方法:longPress() 开始按压一个元素或坐标点(x,y)。 相比press()方法,longPress()多了一个入参,既然长按,得有按的时间吧。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。

long_press(self, el=None, x=None, y=None, duration=1000)
点击

方法:tap() 对一个元素或控件执行点击操作。用法参考press()。

tap(self, element=None, x=None, y=None, count=1)
移动

方法:move_to() 将指针从上一个点移动到指定的元素或点。

move_to(self, el=None, x=None, y=None)

注意:

移动到目位置有时是算绝对坐标点,有时是基于前面一个坐标点的偏移量,这个要结合具体App来实践。

暂停

方法:Wait()

wait(self, ms=0)

暂停脚本的执行,单位为毫秒。

释放

方法:release() 结束的行动取消屏幕上的指针。

release(self)

执行

方法:perform() 执行的操作发送到服务器的命令操作。

perform(self)

TouchAction实战——九宫格滑动操作

九宫格是一种比较常见的图案加密方式,目前很多App都支持设置图案锁,Android原生系统也支持设九宫格图案锁屏。那么我们该如何使用Appium进行滑动操作呢?

测试场景

安装启动随手记App 启动App后在密码设置选项中开启手机密码并滑动九宫格设置如下“Z”字形的图形密码。

测试环境

1.宏哥的系统环境是Windows 10版本 64位系统

2.宏哥的dk版本:"1.8.0_181"

3.宏哥的appium版本:1.4.16 

4.selenium:3.141.0

安装selenium:

输入指令pip install selenium

验证安装成功:pip show selenium

5.测试设备:Android 5.1.1 (不能低于5.0版本)

6.Python:3.7.2

命令:python -V  ,回车即可。

7.测试App:随手记Android app V9.7.1.5

想法与思路

  • 安装启动随手记APP
  • 代码实现点击“下一步”,向左滑动首页引导页面
  • 点击“开始随手记”进入首页页面
  • 点击“设置”按钮,向上滑动,找到“高级”按钮,点击进入
  • 点击“手势密码”,开始设置手势密码(高级滑动)

代码实现

(1)安装启动随手记

(2)代码实现点击“下一步”,向左滑动首页引导页面

(3)点击“开始随手记”进入首页页面

(4)点击“设置”按钮,向上滑动,找到“高级”按钮,点击进入

(5)点击“手势密码”,开始设置手势密码,进行解锁(高级滑动)

这个地方move_to到了按下的这个坐标点,是因为不这样的话实际结果忽略掉了第一个按下的点。release()释放,perform()执行。

代码运行结果

运行过程appium和夜神模拟器

参考代码

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-8-077 @author: 北京-宏哥   QQ交流群:7076992178 Project:学习和使用appium自动化测试-高级滑动9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from appium.webdriver.common.touch_action import TouchAction
13 from selenium.webdriver.support.ui import WebDriverWait
14 from selenium.common.exceptions import NoSuchElementException
15 from time import sleep
16 
17 desired_caps={}
18 desired_caps['platformName']='Android'
19 desired_caps['deviceName']='127.0.0.1:62001'
20 desired_caps['platforVersion']='5.1.1'
21 
22 desired_caps['app']=r'C:\Users\DELL\Downloads\mymoney.apk'
23 desired_caps['appPackage']='com.mymoney'
24 desired_caps['appActivity']='com.mymoney.biz.splash.SplashScreenActivity'
25 
26 driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
27 driver.implicitly_wait(5)
28 
29 
30 def get_size():
31     x=driver.get_window_size()['width']
32     y=driver.get_window_size()['height']
33     return x,y
34 
35 def swipeLeft():
36     l=get_size()
37     x1=int(l[0]*0.9)
38     y1=int(l[1]*0.5)
39     x2=int(l[0]*0.1)
40     driver.swipe(x1,y1,x2,y1,1000)
41 
42 def swipeUp():
43     l = get_size()
44     x1 = int(l[0] * 0.5)
45     y1 = int(l[1] * 0.95)
46     y2 = int(l[1] * 0.35)
47     driver.swipe(x1, y1, x1, y2, 1000)
48 
49 #等待启动页面元素,然后向左滑动两次,跳过引导页面
50 WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('com.mymoney:id/next_btn'))
51 for i in range(2):
52     swipeLeft()
53     sleep(0.5)
54 #点击“开始随手记”按钮
55 driver.find_element_by_id('com.mymoney:id/begin_btn').click()
56 #检测是否有活动页面弹窗,如果有就点击关闭
57 try:
58     closeBtn=driver.find_element_by_id('com.mymoney:id/close_iv')
59 except NoSuchElementException:
60     pass
61 else:
62     closeBtn.click()
63 
64 #点击设置
65 driver.find_element_by_id('com.mymoney:id/nav_btn_forth').click()
66 #等待界面菜单加载出来,然后向上滑动
67 WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('android:id/content'))
68 swipeUp()
69 #点击高级菜单
70 driver.find_element_by_android_uiautomator('new UiSelector().text("高级")').click()
71 #点击密码与手势密码菜单
72 driver.find_element_by_id('com.mymoney:id/password_protect').click()
73 #点击手势密码保护
74 driver.find_element_by_id('com.mymoney:id/ll_gesture_psd').click()
75 #连续滑动两次设置图案密码
76 for i in range(2):
77     TouchAction(driver).press(x=212, y=296).wait(100)\
78             .move_to(x=148, y=0).wait(100)\
79             .move_to(x=148,y=0).wait(100)\
80             .move_to(x=-148,y=148).wait(100)\
81             .move_to(x=-148,y=148).wait(100)\
82             .move_to(x=148,y=0).wait(100)\
83             .move_to(x=148,y=0).wait(100) \
84             .release().wait(200).perform()

连续滑动设置手势密码坐标计算

首先使用工具获取到元素坐标位置,可以看到起始位置是【138,218】,终点位置是【581,661】

分析:

该图形可以横竖划分六等分

那么第一个圆中心点的坐标:

x=138+(581-138)/6

y=218+(661-218)/6

依次类推,想要画一个z形状,则需要计算第1、2,3,5,7,8,9这几个圆的中心点坐标

然后用TouchAction 的press和moveto方法将几个步骤链接起来。代码如下

 1 #引入包 2 from appium.webdriver.common.touch_action import TouchAction   3 4 def settingPassword(self):5 6         #[138,218][581,661]夜神上的元素坐标  7 8         xxx = (581-138) / 69         one_x = 138 + xxx 
10         one_y = 218 + xxx
11         two_x = 138 + xxx * 3
12         two_y = 218 + xxx #与第二个纵坐标相等
13         three_x=138 + xxx*5
14         three_y=218 + xxx #与第二个纵坐标相等
15         five_x=138 + xxx * 3
16         five_y=218+xxx*3
17         seven_x=138 + xxx
18         seven_y=218+xxx*5
19         eight_x=138 + xxx * 3
20         eight_y=218+xxx*5
21         nine_x=138 + xxx*5
22         nine_y=218+xxx*5
23 
24         TouchAction(self.driver).press(x=one_x, y=one_y).wait(300).move_to(x=two_x, y=two_y).wait(300).move_to(x=three_x,y=three_y).wait(300).move_to(x=five_x,y=five_y).wait(300).move_to(x=seven_x,y=seven_y).wait(300).move_to(x=eight_x,y=eight_y).wait(300).move_to(x=nine_x,y=nine_y).release().perform()

小结

1.实现的时候总是报错:
The coordinates provided to an interactions operation are invalid.

解决方案:在release后边加上wait,即可。这可是宏哥查了好多资料,才找到的解决办法,具体原因宏哥也有点蒙圈,等找到原因了,后期补上,或者有知道的大佬可以分享一下心得体会 。
期间宏哥想不用for循环了,直接写了两个一样的TouchAction还是报错,然后宏哥实在是搞不定了,第二天晚上宏哥决定既然可以画一个Z字形,要不把设置密码的文章改成解锁密码文章 ,前者需要画两个Z字形,后者需要画一个Z字形。而且刚好解锁,需要一个就可以,内心的小鬼在打架,最终还是理性打败了取巧和任性,硬着头皮解决遇到的各种问题,才有了这篇文章的产生。这也侧面的反应学习和工作是不能偷奸取巧的。                                                                                                    

1 for i in range(2):
2     TouchAction(driver).press(x=212, y=296).wait(100)\
3             .move_to(x=148, y=0).wait(100)\
4             .move_to(x=148,y=0).wait(100)\
5             .move_to(x=-148,y=148).wait(100)\
6             .move_to(x=-148,y=148).wait(100)\
7             .move_to(x=148,y=0).wait(100)\
8             .move_to(x=148,y=0).wait(100) \
9             .release().wait(100).perform()                                                                                                                                                                                           

2.这段代码里面有俩个坑,呃,关键点:
(1)press方法中的坐标为绝对坐标,move_to方法中的坐标都是相对坐标,具体来说第一个move_to中的坐标相对于press方法中的坐标,第二个move_to方法中的坐标相对于第一个move_to方法中的坐标。以此类推下去,以前好像不是这个样子的。直接计算完就可以用了。宏哥期间犯的错误:

  a.就是直接算完就用结果报错;然后查资料说是相对坐标;

  b.然后把后边move_to 的坐标都相对第一个绝对坐标了,结果可想而知,还是报错。

继续查资料,才找到以上的解决办法了。

(2)wait是必须的:这里ms表示为毫秒,ms=100就是等待100毫秒。不用的话太快会出错

3.分成六等份,小伙伴们有点蒙圈,给小伙伴们看一幅比较直观的图

4. 好了,奈何桥走了一遭,终于搞定了,获得了新生。不过遗憾的事是:实在太忙了,写文章,解决问题和各种坑,没来得及喝一碗孟婆汤,不知道它的味道是酸甜苦辣。。。。,还是其他什么味道,然后把这个痛苦的过程忘记掉。友情提示:小伙伴们和童鞋们如果滑到奈何桥,可以喝一碗尝一尝鲜。

   每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

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

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

相关文章

【JavaScript】流程控制和函数

目录 一、分支语句 1、if语句: 2、switch语句: 二、循环语句 1、while循环语句 2、for循环语句 三、函数声明 1、function 函数名(形参列表){ 函数体 } 2、var 函数名function(形参列表){函数体} 一、分支语句 1、if语句: if(表达式){ }else …

Vue-cli搭建项目----基础版

什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、南…

西门子智能电气阀门定位器在冶金生产控制的应用

西门子智能电气阀门定位器在冶金生产控制的应用 1 前 言 在自动化程度越来越高的冶金行业中 ,调节阀起着至关重要的作用,一旦其发生故障, 轻则出现生产事故,停机,停炉影响各级生产指标,生产任务,影响装置的安全运行。重则可能出现人身安全事故,将直接影响家庭的幸福和企…

Android SurfaceFlinger——动画进程销毁(十七)

在动画播放完成后,对动画相关资源释放的同时还需要销毁动画进程。这里我们就来分析一下动画进程的销毁流程。 一、动画进程销毁 动画进程的销毁一般是在桌面进程准备显示的时候,而桌面准备显示是在桌面 Activity 的 Resume 生命周期,我们来看…

美团校招机试 - 小美的平衡矩阵(20240309-T1)

题目来源 美团校招笔试真题_小美的平衡矩阵 题目描述 小美拿到了一个 n * n 的矩阵,其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在,小美希望你回答有多少个 i * i 的完美…

redis哨兵模式(Redis Sentinel)

哨兵模式的背景 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式。 为了解决单点故障和提高系统的可用性,需要一种自动化的监…

暑假本科生、研究生怎么学?来看详细的AI夏令营规划

Datawhale夏令营 发布:2024 AI 夏令营 学习规划 「学习内容详览」 01机器学习方向:2024/7/1~7/7 「Datawhale」邀请想入门人工智能领域并实践机器学习算法的学习者和我们一起来学习~ 详细学习规划如下: 02大模型技术方向:2024/7…

基于springboot、vue汽车租赁系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringbootMybatisvue工具:IDEA、Maven、Navicat 主要功能: 用户进入系统可以查看首页、个人中心、车辆信息管理、租赁订单列表管理、还车记录管理等操作 管理…

串级PID控制算原理及法详解

文章目录 1. PID 2. 串级PID 3. 串级PID的物理量 4. C语言实现单极PID 5. C语言实现串极PID 6. 模拟仿真 1. PID PID是应用最广泛的闭环控制方法之一,是一种常用的反馈控制方法,对于每个PID控制器由三个部分组成:比例控制(…

自然语言处理——英文文本预处理

高质量数据的重要性 数据的质量直接影响模型的性能和准确性。高质量的数据可以显著提升模型的学习效果,帮助模型更准确地识别模式、进行预测和决策。具体原因包括以下几点: 噪音减少:高质量的数据经过清理,减少了无关或错误信息…

Wp-scan一键扫描wordpress网页(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

《梦醒蝶飞:释放Excel函数与公式的力量》6.1 DATE函数

6.1 DATE函数 第一节:DATE函数 1)DATE函数概述 DATE函数是Excel中的一个内置函数,用于根据指定的年、月、日返回对应的日期序列号。这个函数非常有用,尤其是在处理日期数据时,它可以帮助你构建特定的日期&#xff0…

pycharm工具回退键调出

pycharm工具调出回退键。 View->Appearance->Toolbar,即可调出 调不出的可以使用快捷键:ctrlalt向左箭头 但是这个快捷键容易和电脑屏幕旋转冲突。可将电脑的快捷键关掉,即可。 ctrlalt向上箭头:将屏幕旋转到正常(横向&am…

【面试干货】final、finalize 和 finally 的区别

【面试干货】final、finalize 和 finally 的区别 1、final1.1 修饰类1.2 修饰方法1.3 修饰变量 2、finally3、finalize4、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,final、finalize和finally都是关键…

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车,累计行驶里程约为28.4万km,车主反映车辆无法加速。 故障诊断 接车后路试,行驶约1 km,踩下加速踏板,无法加速,车速为20 km/h左右,同时组合仪表上的电机及控制…

设备驱动框架之LED

文章目录 前言一、什么是驱动框架二、使用步骤1.注册LED设备2.卸载LED设备3.内核中申请内存4.container_of5.platform_get_drvdata 和 platform_set_drvdata6.module_platform_driver 三、驱动示例总结 前言 为了尽量降低驱动开发者难度以及接口标准化,就出现了设备…

面试-Java线程池

1.利用Excutors创建不同的线程池满足不同场景的需求 分析: 如果并发的请求的数量非常多,但每个线程执行的时间非常短,这样就会频繁的创建和销毁线程。如此一来,会大大降低系统的效率。 可能出现,服务器在为每个线程创建…

利用powershell开展网络钓鱼

要确保人们打开我们的恶意文件并执行它们,我们只需让微软努力工作多年来赢得人们的信任,然后将一些危险的宏插入到幻灯片中。 本博文将介绍如何通过屏幕顶部的一个友好的警告提示,在用户启用宏后立即运行您的宏。 首先,我们需要打…

浏览器扩展V3开发系列之 chrome.commands 快捷键的用法和案例

【作者主页】:小鱼神1024 【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.commands API 允许开发者使用快捷键来执行特定的命令。 在使用 chrome.commands API 之前必须…