Appium Appium-实现手势密码登陆

王小喜 · 2018年07月01日 · 最后由 Shandong Lanxiang 回复于 2018年08月05日 · 3305 次阅读
本帖已被设为精华帖!

前言
前几天有人问我,手势登陆如何做?于是我找了一个 APP 试了试,所以本文来总结使用 Python+Appium 来实现手势密码登陆 APP。


环境
MacOS:10.13.4
Appium-desktop:1.6.1
Xcode:9.3.1
APP:众安保险-iOS 版


一、Appium API -- TouchAction
Appium 的辅助类,主要针对手势操作,比如滑动、长按、拖动等。

1、按压控件
方法:press()
开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。
举例:

TouchAction(driver).press(x=0,y=308).release().perform()

release() 结束的行动取消屏幕上的指针。
Perform() 执行的操作发送到服务器的命令操作。

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

TouchAction(driver).longPress(x=1 ,y=302,duration=1000).perform().release();

3、移动
方法:moveTo()
将指针(光标)从过去指向指定的元素或点。
举例:

TouchAction(driver).moveTo(x=0,y=308).perform().release();

4、暂停
方法:wait()
暂停脚本的执行,单位为毫秒。
举例:

TouchAction(driver).wait(1000);

二、通过触摸多点坐标进行解锁
根据上面 API 解释,我们可以得出按压和移动来实现手势解释,大概思路如下:

TouchAction.press(beginX,beginY).moveTo(xStep,yStep).moveTo(xStep,yStep).release().perform();

打开 Appium-Inspector 来查看手势对应的各个点的坐标。
选择 [Swipe By Coordinates],可查看任意点的坐标。可选择手势触摸点的中心位置。如下图所示:作者分别选择左上角的 4 个点,即可模拟手势来执行登陆操作。Appium-Inspector.png
代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2018/5/22 下午10:33
# @Author  : WangJuan
# @File    : appium-ios.py
from time import sleep

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

cap = {
  "platformName": "iOS",
  "platformVersion": "11.4",
  "bundleId": "com.zhongan.insurance",
  "automationName": "XCUITest",
  "udid": "3e8325a7c0d*******************a7e",
  "deviceName": "****Iphone"
}

host = "http://0.0.0.0:4728/wd/hub"
driver = webdriver.Remote(host, cap)
sleep(3)
action = TouchAction(driver)
action.press(x=98, y=321).wait(100).move_to(x=208, y=321).wait(100).move_to(x=206, y=432).wait(100).move_to(x=98, y=432).perform().release()

三、兼容不同分辨率
直接用坐标点找会有一些问题,比如手机屏幕大小不同,找点的位置可能会有偏差,如何解决呢?
由下图可见,先获取第一个触摸点的坐标 location 及 size。分别定义为start_height、start_width、start_x、start_y(其中start_x、start_y为触摸点左上角的坐标);
即可计算出第一个触摸点的中心点坐标分别为:
start_x + start_width/2, start_y + start_height/2
然后在计算出第二个触摸点的中心点大致坐标为:
start_x+start_width*2, y=start_y+start_height*2 Appium-Inspector-2.png
其他坐标均可按照此计算方式,详情见具体例子。

# -*- coding: utf-8 -*-
# @Time    : 2018/5/22 下午10:33
# @Author  : WangJuan
# @File    : appium-ios.py
from time import sleep

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

cap = {
  "platformName": "iOS",
  "platformVersion": "11.4",
  "bundleId": "com.zhongan.insurance",
  "automationName": "XCUITest",
  "udid": "3e8325a7c0***************62bd4a7e",
  "deviceName": "My@Iphone"
}

host = "http://0.0.0.0:4728/wd/hub"
driver = webdriver.Remote(host, cap)
sleep(3)
action = TouchAction(driver)
start = driver.find_element_by_xpath('//XCUIElementTypeApplication[@name="众安保险"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther\
                    /XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]')
start_height = start.size['height']
start_width = start.size['width']
start_x = start.location['x']
start_y = start.location['y']
begin_x = start_x + start_width/2
begin_y = start_y + start_height/2

action.press(x=start_x, y=start_y).wait(100).move_to(x=start_x+start_width*2, y=begin_y).wait(100).move_to\
                  (x=start_x+start_width*2, y=start_y+start_height*2).wait(100).move_to(x=begin_x,y=start_y+start_height*2).perform().release()

以上,对你有帮助的话,请点赞吧❤️~~

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 12 条回复 时间 点赞

学习了

妹子是专门做 iOS 自动化的吗?

WDA 的手势什么版本支持了?不是一直不好使嘛?

Android 也弄

water 回复

我用的最新版本,挺好用的

思寒_seveniruby 将本帖设为了精华贴 07月02日 19:00

之前也有人提出类似的解决方法,你是第一个写的这么详细的人。对小白有参考价值。

第一个点的坐标怎么找到的?

妹子是众安保险的 iOS 自动化测试?

11楼 已删除

楼主竟然注销账号了,哎

java 会失败 不支持 3 点 不清楚是不是 bug Python 可能客户端单独处理了

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册