appium+python自動化33-解鎖九宮格(TouchAction)

TouchAction

1.源碼能夠在這個路徑找到:Lib\site-packages\appium\webdriver\common\touch_action.pypython

class TouchAction(object):
    def __init__(self, driver=None):
        self._driver = driver
        self._actions = []

    def tap(self, element=None, x=None, y=None, count=1):
        模擬手指觸摸屏

    def press(self, el=None, x=None, y=None):
        短按:模擬手指按住一個元素,或者座標

    def long_press(self, el=None, x=None, y=None, duration=1000):
        長按:模擬按住一個元素,或者座標

    def wait(self, ms=0):
        按住元素後的等待時間

    def move_to(self, el=None, x=None, y=None):
        移動手指到另一個元素,或者座標,注意這裏座標不是絕對座標,是偏移量
        
    def release(self):
        釋放手指

    def perform(self):
        執行前面的動做

2.TouchAction裏面有這幾個動做:android

  • 觸摸 (tap)
  • 短按 (press)
  • 長按 (long_press)
  • 等待 (wait)
  • 移動到 (moveTo)
  • 釋放 (release)
  • 執行 (perform)

九宮格解鎖

1.有些九宮格的每一個點能夠直接定位到,這種相對來講容易一點,有一些九宮格就是一整個元素,好比QQ的九宮格解鎖。web

2.解決問題思路:先獲取元素座標位置,再獲取元素大小,而後切割圖片,分別計算出每一個點的座標app

# 定位九宮格元素
jiu = 'resourceId("com.tencent.mobileqq:id/name").index(6)'
loc = driver.find_element_by_android_uiautomator(jiu).location
print("獲取九宮格座標位置:%s"%loc)

s = driver.find_element_by_android_uiautomator(jiu).size
print("獲取九宮格寬和高:%s"%s)

3.給每一個圓圈編號從左到右1,2,3依次第二行4,5,6第三行7,8,9函數

gongge = {}
gongge[1] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6)
gongge[2] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6)
gongge[3] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6)
gongge[4] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6*3)
gongge[5] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6*3)
gongge[6] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6*3)
gongge[7] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6*5)
gongge[8] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6*5)
gongge[9] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6*5)
print gongge

偏移量

1.這裏有個坑,press裏面的參數是元素的座標位置,可是move_to裏面的是相對於前面一個元素的偏移位置。因此須要單獨寫一個函數,計算偏移量。學習

def pianyi(a=1,b=2):
    '''計算從a點到b點的偏移量'''
    g1 = gongge[a]
    g2 = gongge[b]
    r = (None, g2[1]-g1[1], g2[2]-g1[2])
    return r

2.另外press和move_to裏面都有三個參數,第一個參數默認爲None,因此我返回的參數裏面第一個寫None.ui

移動手指

1.解鎖思路:先press按住第一個點,再wait等待,接着移動帶第二個點,再wait,最後release釋放手指,perform執行code

2.好比我要畫出一個Z形狀,依次通過的點1,2,3,5,7,8,9orm

參考代碼

# coding:utf-8
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from time import sleep
desired_caps = {
                'platformName': 'Android',
                'deviceName': '127.0.0.1:62001',
                'platformVersion': '4.4.2',
                'appPackage': 'com.tencent.mobileqq',
                'appActivity': 'com.tencent.mobileqq.activity.SplashActivity',
                'noReset': "true"
                }
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

sleep(5)

jiu = 'resourceId("com.tencent.mobileqq:id/name").index(6)'
loc = driver.find_element_by_android_uiautomator(jiu).location
print("獲取九宮格座標位置:%s"%loc)
s = driver.find_element_by_android_uiautomator(jiu).size
print("獲取九宮格寬和高:%s"%s)

# 獲取九個點的座標
gongge = {}
gongge[1] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6)
gongge[2] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6)
gongge[3] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6)
gongge[4] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6*3)
gongge[5] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6*3)
gongge[6] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6*3)
gongge[7] = (None, loc["x"]+s["width"]/6, loc["y"]+s["height"]/6*5)
gongge[8] = (None, loc["x"]+s["width"]/6*3, loc["y"]+s["height"]/6*5)
gongge[9] = (None, loc["x"]+s["width"]/6*5, loc["y"]+s["height"]/6*5)
print gongge

def pianyi(a=1,b=2):
    '''計算從a點到b點的偏移量'''
    g1 = gongge[a]
    g2 = gongge[b]
    r = (None, g2[1]-g1[1], g2[2]-g1[2])
    return r

# 執行解鎖
TouchAction(driver).press(*gongge[1]).wait(300).move_to(*pianyi(1,2)).wait(300).move_to(*pianyi(2,3)).wait(
    300).move_to(*pianyi(3,5)).wait(300).move_to(*pianyi(5,7)).wait(300).move_to(*pianyi(7,8)).wait(300).move_to(*pianyi(8,9)).wait(
    300).release().perform()

在學習過程當中有遇到疑問的,能夠appium+python QQ羣交流:330467341blog

相關文章
相關標籤/搜索