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