Appium模拟手势高级操作

本文详细介绍了如何使用Appium的TouchAction进行高级手势操作,包括轻敲、按压、长按、等待、移动等,提供了丰富的代码实例,帮助读者掌握在自动化测试中模拟真实用户交互的技巧。

Appium模拟手势高级操作

    TouchAction是AppiumDriver的辅助类,主要针对手势操作,比如滑动、长按、拖动等,
    原理是将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行。
  • 1.前置代码

    from appium import webdriver
    # server 启动参数
    desired_caps = {}
    # 设备信息
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '5.1'
    desired_caps['deviceName'] = '192.168.56.101:5555'
    # app的信息
    desired_caps['appPackage'] = 'com.android.settings'
    desired_caps['appActivity'] = '.Settings'

    # 声明我们的driver对象
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
  • ⚠️ 所有手势都要通过执行函数才会运行.

  • 2.手指轻敲操作

      模拟手指轻敲一下屏幕操作
      方法:tap(element=None, x=None, y=None)
      方法:perform() # 发送命令到服务器执行操作
      参数:
          1.element:被定位到的元素
          2.x:相对于元素左上角的坐标,通常会使用元素的X轴坐标
          3.y:通常会使用元素的Y轴坐标
    
      业务场景:
          1.进入设置
          2.点击WLAN选项
    
      代码实现:
          # 通过元素定位方式敲击屏幕
          el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
          TouchAction(driver).tap(el).perform()
    
          # 通过坐标方式敲击屏幕,WLAN坐标:x=155,y=250
          # TouchAction(driver).tap(x=155,y=250).perform()
    
  • 3.手指按操作

      模拟手指按下屏幕,按就要对应着离开.
    
      方法:press(el=None, x=None, y=None)
      方法:release() # 结束动作,手指离开屏幕
      参数:
          1.element:被定位到的元素
          2.x:通常会使用元素的X轴坐标
          3.y:通常会使用元素的Y轴坐标
    
      业务场景:
          1.进入设置
          2.点击WLAN选项
    
      代码实现:
          # 通过元素定位方式按下屏幕
          el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
          TouchAction(driver).press(el).release().perform()
    
          # 通过坐标方式按下屏幕,WLAN坐标:x=155,y=250
          # TouchAction(driver).tap(x=155,y=250).release().perform()
    
  • 4.等待操作

      方法:wait(ms=0)
      参数:
          ms:暂停的毫秒数
    
      业务场景:
          1.进入设置
          2.点击WLAN选项
          3.长按WiredSSID选项5秒
    
  • 5.手指长按操作

      模拟手机按下屏幕一段时间,按就要对应着离开.
    
      方法:long_press(el=None, x=None, y=None, duration=1000)
      参数:
          1.element:被定位到的元素
          2.x:通常会使用元素的X轴坐标
          3.y:通常会使用元素的Y轴坐标
          4.duration:持续时间,默认为1000ms
    
      业务场景:
          1.进入设置
          2.点击WLAN选项
          3.长按WiredSSID选项5秒
    
      代码实现:
          # 点击WLAN
          driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click()
          # 定位到WiredSSID
          el =driver.find_element_by_id("android:id/title")
          # 通过元素定位方式长按元素
          TouchAction(driver).long_press(el,duration=5000).release().perform()
    
          # 通过坐标方式长按元素,WiredSSID坐标:x=770,y=667
          # 添加等待(有长按)/不添加等待(无长按效果)
          # TouchAction(driver).long_press(x=770,y=667).perform()
    
  • 6.手指移动操作
      模拟手机的滑动操作
      方法:move_to(el=None, x=None, y=None)
      参数:
          1.el:定位的元素
          2.x:相对于前一个元素的X轴偏移量
          3.y:相对于前一个元素的Y轴偏移量
    
      业务场景1:
          1.进入设置
          2.向上滑动屏幕
    
    代码实现:
        # 定位到存储
        el = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
        # 定位到更多
        el1 = driver.find_element_by_xpath("//*[contains(@text,'更多')]")
        # 元素方式滑动
        TouchAction(driver).press(el).move_to(el1).release().perform()
        # 坐标的方式向上滑动
        # TouchAction(driver).press(x=240,y=1000).move_to(x=0,y=-400).release().perform() 
        # ⚠️ press().move_to() 实际使用的是TouchAction方法,需要给相对坐标.
        # TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()
        # ⚠️ press().wait().move_to()实际调用的是swip方法,会向下拉,感觉属于bug,可在log中查询swip,不建议这么用.
    业务场景2:
        1.进入设置
        2.向上滑动屏幕到可见"安全"选项
        3.进入到安全
        4.点击屏幕锁定方式
        5.点击图案
        6.绘制图案
    代码实现:
        # 定位到WLAN
        el1 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
        # 定位到存储
        el2 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
        # 存储上滑到WLAN
        driver.drag_and_drop(el2,el1)
        # 定位到用户
        el3 = driver.find_element_by_xpath("//*[contains(@text,'用户')]")
        # 注意 这次使用drag_and_drop方法,传入的"存储定位"仍使用其原始在屏幕上的位置,所以是由存储滑动到用户才可以上滑,否则需要重新"定位存储"
        # 存储上滑倒用户位置
        driver.drag_and_drop(el2,el3)
        # 点击安全按钮
        driver.find_element_by_xpath("//*[contains(@text,'安全')]").click()
        # 点击屏幕锁定方式按钮
        driver.find_element_by_xpath("//*[contains(@text,'屏幕锁定')]").click()
        # 点击图案按钮
        driver.find_element_by_xpath("//*[contains(@text,'图案')]").click()
        # 绘制图案四个坐标 1:(244,967) 2:(723,967) 3:(723,1442) 4:(244,1916)
        TouchAction(driver).press(x=244,y=967).wait(100).move_to(x=479,y=0).wait(100)\
            .move_to(x=0,y=475).wait(100).move_to(x=-479,y=474).release().perform()

 效果:

### 使用Appium模拟鼠标移动并点击 为了实现模拟鼠标移动并点击的操作,在Python中可以利用`TouchAction`类配合`press`和`release`方法完成这一过程。下面是一个具体的例子,该实例展示了如何定义一个位置,使设备上的指针移动至指定坐标处,并执行一次点击操作。 ```python from appium import webdriver from appium.webdriver.common.touch_action import TouchAction desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', # 替换为实际设备名称或序列号 'appPackage': 'com.example.package', # 应用程序包名 'appActivity': '.MainActivity' # 启动活动 } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) touch = TouchAction(driver) # 移动到 (x=100, y=200),然后释放手指以触发点击事件 touch.press(x=100, y=200).release().perform() ``` 上述代码片段创建了一个新的会话连接到了运行中的Appium服务器上[^1]。接着初始化了`TouchAction`对象用于构建触摸手势链表;最后通过调用`press()`函数设置按下的起始点,再调用`release()`表示抬起手指结束此次交互行为,并最终由`perform()`提交整个动作给目标设备处理[^5]。 如果想要增加按下与松开之间的延迟时间,可以在两者间加入等待命令: ```python import time ... touch.press(x=100, y=200).wait(500).release().perform() # 增加半秒钟的延时 ``` 这里使用了`.wait(milliseconds)`来暂停一段时间后再继续后续的动作[^2]。 对于更复杂的场景比如拖拽元素,则可能需要用到更多高级特性如多点触控或多步组合动作等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值