1. 程式人生 > >Appium-實現手勢密碼登陸

Appium-實現手勢密碼登陸

xcod 服務器 from RF 屏幕 str CI web oca

前言:

前幾天有人問我,手勢登陸如何做?於是我找了一個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個點,即可模擬手勢來執行登陸操作。技術分享圖片


代碼如下:

# -*- 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 技術分享圖片
其他坐標均可按照此計算方式,詳情見具體例子。

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

以上,對你有幫助的話,請點贊吧??~~

Appium-實現手勢密碼登陸