Python Appium自动化测试 高级滑动

Time will tell.

滑动在实际使用过程中,用户可能要进行一些多点连续滑动操作。如九宫格滑动操作,连续拖动图片移动等场景。那么这种高级绚丽的溜冰滑动在 Appium 中该如何模拟这类操作呢?下面一一道来。

1、TouchAction

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)

2、TouchAction 实战

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

测试场景

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

image

测试环境

1.Windows 10版本 64位系统

2.jdk版本:“1.8.0_181”

3.appium版本:1.4.16

4.selenium:3.141.0

  • 安装selenium:

  • 输入指令pip install selenium

  • 验证安装成功:pip show selenium

    image

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

image

6.Python:3.7.2 ,命令:python -V ,回车即可。

image

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

image

想法与思路:

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

代码实现:

(1)安装启动随手记

image

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

image.png

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

image.png

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

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

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

代码运行结果:

参考代码:

# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块

from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from time import sleep

desired_caps={}
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platforVersion']='5.1.1'

desired_caps['app']=r'C:\Users\DELL\Downloads\mymoney.apk'
desired_caps['appPackage']='com.mymoney'
desired_caps['appActivity']='com.mymoney.biz.splash.SplashScreenActivity'

driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)

def get_size():
    x=driver.get_window_size()['width']
    y=driver.get_window_size()['height']
    return x,y

def swipeLeft():
    l=get_size()
    x1=int(l[0]*0.9)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.1)
    driver.swipe(x1,y1,x2,y1,1000)

def swipeUp():
    l = get_size()
    x1 = int(l[0] * 0.5)
    y1 = int(l[1] * 0.95)
    y2 = int(l[1] * 0.35)
    driver.swipe(x1, y1, x1, y2, 1000)

#等待启动页面元素,然后向左滑动两次,跳过引导页面
WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('com.mymoney:id/next_btn'))
for i in range(2):
    swipeLeft()
    sleep(0.5)
#点击“开始随手记”按钮
driver.find_element_by_id('com.mymoney:id/begin_btn').click()
#检测是否有活动页面弹窗,如果有就点击关闭
try:
    closeBtn=driver.find_element_by_id('com.mymoney:id/close_iv')
except NoSuchElementException:
    pass
else:
    closeBtn.click()

#点击设置
driver.find_element_by_id('com.mymoney:id/nav_btn_forth').click()
#等待界面菜单加载出来,然后向上滑动
WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('android:id/content'))
swipeUp()
#点击高级菜单
driver.find_element_by_android_uiautomator('new UiSelector().text("高级")').click()
#点击密码与手势密码菜单
driver.find_element_by_id('com.mymoney:id/password_protect').click()
#点击手势密码保护
driver.find_element_by_id('com.mymoney:id/ll_gesture_psd').click()
#连续滑动两次设置图案密码
for i in range(2):
    TouchAction(driver).press(x=212, y=296).wait(100)\
            .move_to(x=148, y=0).wait(100)\
            .move_to(x=148,y=0).wait(100)\
            .move_to(x=-148,y=148).wait(100)\
            .move_to(x=-148,y=148).wait(100)\
            .move_to(x=148,y=0).wait(100)\
            .move_to(x=148,y=0).wait(100) \
            .release().wait(200).perform()

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

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

分析:

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


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

x=138+(581-138)/6

y=218+(661-218)/6

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

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

from appium.webdriver.common.touch_action import TouchAction   

def settingPassword(self):

        #[138,218][581,661]夜神上的元素坐标  
        xxx = (581-138) / 6
        one_x = 138 + xxx 
        one_y = 218 + xxx
        two_x = 138 + xxx * 3
        two_y = 218 + xxx #与第二个纵坐标相等
        three_x=138 + xxx*5
        three_y=218 + xxx #与第二个纵坐标相等
        five_x=138 + xxx * 3
        five_y=218+xxx*3
        seven_x=138 + xxx
        seven_y=218+xxx*5
        eight_x=138 + xxx * 3
        eight_y=218+xxx*5
        nine_x=138 + xxx*5
        nine_y=218+xxx*5

        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()

4、最后

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

release后边加上wait,即可。这是我查了好多资料才找到的解决办法,如有知道的大佬也可以分享一下心得体会 。

期间直接写了两个一样的TouchAction还是报错,然后实在是搞不定,第二天晚上决定画一个 Z 字形,要不把设置密码的文章改成解锁密码文章 ,前者需要画两个 Z 字形,后者需要画一个 Z 字形。而且刚好解锁,需要一个就可以,最终还是硬着头皮解决遇到的各种问题,也才有了这篇文章的产生,也侧面反应了学习和工作是不能偷奸取巧的。

for i in range(2):
    TouchAction(driver).press(x=212, y=296).wait(100)\
            .move_to(x=148, y=0).wait(100)\
            .move_to(x=148,y=0).wait(100)\
            .move_to(x=-148,y=148).wait(100)\
            .move_to(x=-148,y=148).wait(100)\
            .move_to(x=148,y=0).wait(100)\
            .move_to(x=148,y=0).wait(100) \
            .release().wait(100).perform()     

2.这段代码里面有两个坑,关键点:

(1)press方法中的坐标为绝对坐标,move_to方法中的坐标都是相对坐标,具体来说第一个move_to中的坐标相对于press方法中的坐标,第二个move_to方法中的坐标相对于第一个move_to方法中的坐标。以此类推,直接计算完就可以用了。

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

3.分成六等份,有点蒙圈的在这里直接看一幅较直观的图:


内容就到这里,如果你对Python自动化软件测试感兴趣可以加入我们扣裙一起学习175317069。有各项测试学习资源,也有行业深潜多年的技术人分析讲解。

欢迎【点赞】、【评论】、【关注】~

Time will tell.(时间会证明一切)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容