Appium 如何进行手势操作?
Appium 手势操作依赖 TouchAction(1.x)和 W3C Actions API(2.x 推荐)实现,核心是通过 press、moveTo、release 组合链模拟触摸行为,所有手势必须调用 perform() 才会执行。
核心手势怎么写?
点击:element.click() 最为直接;坐标点击用 driver.touchActions([{action:"tap", x:100, y:200}])。
长按:W3C Actions 写法——driver.actions({async:true}).move({origin:el}).press().pause(2000).release().perform(),pause 控制按压时长。
滑动:本质上就是 press → moveTo → release 的坐标链。上滑把 startY 设大、endY 设小即可,横向同理。
拖拽:driver.actions({async:true}).dragAndDrop(src, target).perform(),底层与滑动一致,只是起止都是元素。
多点触控怎么处理?
缩放(pinch/spread)需要两根手指同时操作。Appium 1.x 用 MultiTouchAction 分别添加两个 TouchAction 再 perform;2.x 推荐用 W3C PointerInput 创建多个 pointer,各自执行 press/move/release 后一起 perform。
关键点:两指必须真正"同时",不是串行执行。用 MultiTouchAction 时两个 action 是并行发送的。
坐标怎么算才稳定?
绝对坐标在不同设备上必定偏移。正确做法是通过 element.getRect() 取元素位置后算中心点,或用屏幕尺寸算百分比坐标(如 size.width * 0.8)。这样换设备不会崩。
手势操作最常踩什么坑?
- 元素不可见就操作——必须先 wait 直到 elementIsClickable
- 动画没结束就操作——适当 sleep 或等动画元素消失
- Appium 2.x 还在用 TouchAction——已废弃,切换到 W3C Actions API
- iOS 和 Android 手势 API 有差异——iOS 支持 mobile: 系列扩展命令(如 mobile: swipe),Android 部分手势需要 UiAutomator2 配合
追问:Appium 1.x 的 TouchAction 和 2.x 的 W3C Actions 有什么区别?
TouchAction 是 Appium 自定义 API,链式调用 press/wait/release,2.x 起已废弃。W3C Actions 是 WebDriver 标准协议,通过 PointerInput + Sequence 描述动作序列,跨浏览器/跨平台兼容性更好。迁移时核心变化是把 TouchAction 链替换为 actions().move().press().pause().release() 调用链。