携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详
手势操作需要的步骤如下:
- 创建
TouchAction对象
- 调用手势方法
- 调用
touchaction.perform()
执行操作
轻敲操作
相当于单击操作,但是任意位置都可以轻敲。
from appium.webdriver.common.touch_action import TouchAction
# 创建手势对象
action = TouchAction(driver)
# tap方法参数可以是元素对象或者是坐标点。
# action.tap(element: Optional['WebElement'] = None, x: Optional[int] = None, y: Optional[int] = None, count: int = 1,)
ele = driver.find_element(By.XPATH, '//*[@text="qqq"]')
action.tap(ele)
action.perform()
使用一行代码实现上述操作:
# 链式调用,说明每一步返回的都是self即TouchAction的对象
TouchAction(driver).tap(ele).perform()
按下和抬起操作
场景:
- 按下:比如说按下一个元素或者坐标,不执行任何操作,只有按下没有任何操作
- 抬起:一个按下+抬起=单击操作
# 按下操作
action.press(
el: Optional['WebElement'] = None, # 元素对象
x: Optional[int] = None, # 坐标点
y: Optional[int] = None,
pressure: Optional[float] = None, # iOS Only
)
# 按下操作,只有按下
TouchAction(driver).press(ele).perform()
# 抬起操作
action.release()
等待操作
模拟手指等待,即按下之后等待多久松开,可以结合按下和抬起操作实现长按操作
# action.wait(毫秒)
# 等价于按下5秒后抬起
TouchAction(driver).press(ele).wait(5000).release().perform()
长按操作
# 长按操作
action.long_press(
el: Optional['WebElement'] = None,
x: Optional[int] = None,
y: Optional[int] = None,
duration: int = 1000,
)
# 案例:实现对元素长按5s的操作
TouchAction(driver).log_press(ele, duration=5000).perform()
移动操作
场景:模拟手指在手机屏幕上移动的过程。比如说解锁图案,就需要进行手势移动
移动操作不是直接使用的,需要结合按下press
和抬起release
的操作一起使用
# 移动操作
action.move_to(el: Optional['WebElement'] = None, x: Optional[int] = None, y: Optional[int] = None)
# 案例:模拟绘制手势密码
# 按下开始点(使用wait可以实现长按) -> 移动到一下个点 -> 继续移动至最后一个点 -> 抬起 -> 执行
TouchAction(driver).press(x=100, y=200).wait(1000).move_to(x=100+100, y=200).move_to(x,y)....release().perform()
toast消息介绍
toast消息:点击某些元素时,短暂的出现的提示信息。
通过使用元素查找无法定位到toast消息,如果想要通过元素定位获取到toast消息的话,需要在初始化配置中增加一个配置项。通过xpath中//*[contains(@属性名,'属性值的一部分')]
通过属性值的一部分进行查找。
des_cap = {
"platformName": "android", # 操作系统
"platformVersion": "5.1.1", # 操作系统版本
"deviceName": "****", # 如果只连接一个设备,可以使用****代替,如果有多个设备需要写设备ID
"appPackage": "com.netease.newsreader.activity", # app的包名
"appActivity": "com.netease.nr.phone.main.MainActivity", # 表示app的界面名,使用aapt获取界面名
# 解决不能输入中文的问题
"resetKeyBoard": True,
"unicodeKeyBoard": True,
"noReset": True,
# 定位toast信息
"automationName": "Uiautomator2", # 使用的是uiautomator2的版本
}
获取toast消息方法:
def get_toast(driver, message, timeout=3):
xpath = f"//*[contains(@text, {message})]"
try:
element = WebDriverWait(driver, timeout, 1).unitil(lambda x: x.find_element(By,XPATH, xpath))
return element.text
except Exception:
return Flase