app测试 - 手势操作和toast

516 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详

手势操作需要的步骤如下:

  1. 创建TouchAction对象
  2. 调用手势方法
  3. 调用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