from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.common.multi_action import MultiAction
from time import sleep
"""
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):
執行前面的動作
MultiAction是針對多點觸控操作的,是TouchAction的一個補充模塊
多點觸摸對象是觸摸動作的集合。
多點觸控手勢只有兩種方法,即添加和執行。
add用於添加另一個觸摸操作到多點觸摸。
當perform執行被調用時,添加到多點觸摸的所有觸摸動作都被發送到AppII,並執行,就像它們同時發生一樣。appium首先執行所有觸摸動作的第一個事件,然后執行第二個,等等。
"""
# el是定位元素的對象
# action0 = TouchAction().tap(el)
# action1 = TouchAction().tap(el)
# MultiAction().add(action0).add(action1).perform()
desired_caps = {
"platformName":"Android",
"platformVersion":"5.1.1",
"deviceName":"127.0.0.1:62001",
"appPackage":"com.android.settings",
"appActivity":"com.android.settings/.Settings",
"noReset":"true",
"unicodeKeyboard":"true",
'resetKeyboard': 'true'
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
#點擊搜索
driver.find_element_by_id("com.android.settings:id/search").click()
driver.find_element_by_id("android:id/search_src_text").send_keys("安全\n")
driver.find_elements_by_id("android:id/search_src_text")[0].click()
#屏幕安全保護
driver.find_element_by_id("android.widget.RelativeLayout").click()
driver.find_element_by_xpath("//*[@text = '圖案']").click()
sleep(5)
#解決問題思路:先獲取元素坐標位置,再獲取元素大小,然后切割圖片,分別計算出每個點的坐標
#定位九宮格元素
jiu = 'resourceId("com.android.settings:id/lockPattern").index(2)'
local = driver.find_element_by_android_uiautomator(jiu).location
print("獲取九宮格坐標位置:%s"%local)
s = driver.find_element_by_android_uiautomator(jiu).size
print("獲取九宮格寬和高:%s"%s)
#獲取九個點的坐標
google = {}
google[1] = (None,local["x"]+s["width"]/6,local["y"]+s["height"]/6)
google[2] = (None,local["x"]+s["width"]/6*3,local["y"]+s["height"]/6)
google[3] = (None,local["x"]+s["width"]/6*5,local["y"]+s["height"]/6)
google[4] = (None,local["x"]+s["width"]/6,local["y"]+s["height"]/6*3)
google[5] = (None,local["x"]+s["width"]/6*3,local["y"]+s["height"]/6*3)
google[6] = (None,local["x"]+s["width"]/6*5,local["y"]+s["height"]/6*3)
google[7] = (None,local["x"]+s["width"]/6,local["y"]+s["height"]/6*5)
google[8] = (None,local["x"]+s["width"]/6*3,local["y"]+s["height"]/6*5)
google[9] = (None,local["x"]+s["width"]/6*5,local["y"]+s["height"]/6*5)
print(google)
def pianyi(a=1,b=2):
'''計算從a點到b點的偏移量'''
g1 = google[a]
g2 = google[b]
r = (None, g2[1]-g1[1], g2[2]-g1[2])
return r
#解鎖思路:先press按住第一個點,再wait等待,接着移動帶第二個點,再wait,最后release釋放手指,perform執行
# 執行解鎖
TouchAction(driver).press(*google[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()