乐闻世界logo
搜索文章和话题

Appium 如何进行手势操作?

2月21日 16:19

Appium 的手势操作是模拟用户交互的重要功能,支持各种触摸和手势操作。以下是 Appium 手势操作的详细说明:

基本手势操作

1. 点击(Tap)

javascript
// 单击 await element.click(); // 点击坐标 await driver.touchActions([ { action: 'tap', x: 100, y: 200 } ]); // 多次点击 await element.click(); await element.click(); await element.click();

2. 长按(Long Press)

javascript
// 长按元素 const actions = driver.actions({ async: true }); await actions.move({ origin: element }).press().pause(2000).release().perform(); // 长按坐标 await driver.touchActions([ { action: 'press', x: 100, y: 200 }, { action: 'wait', ms: 2000 }, { action: 'release' } ]);

3. 双击(Double Tap)

javascript
// 双击元素 const actions = driver.actions({ async: true }); await actions.move({ origin: element }).doubleClick().perform(); // 使用 TouchAction const touchAction = new TouchAction(driver); touchAction.tap({ x: 100, y: 200 }).tap({ x: 100, y: 200 }); await touchAction.perform();

4. 滑动(Swipe)

javascript
// 滑动元素 await driver.touchActions([ { action: 'press', x: 100, y: 500 }, { action: 'moveTo', x: 100, y: 100 }, { action: 'release' } ]); // 使用 TouchAction const touchAction = new TouchAction(driver); touchAction.press({ x: 100, y: 500 }).moveTo({ x: 100, y: 100 }).release(); await touchAction.perform();

高级手势操作

1. 滚动(Scroll)

javascript
// 滚动到元素 await element.sendKeys('Hello'); // 滚动页面 const size = await driver.manage().window().getRect(); const startX = size.width / 2; const startY = size.height * 0.8; const endY = size.height * 0.2; await driver.touchActions([ { action: 'press', x: startX, y: startY }, { action: 'moveTo', x: startX, y: endY }, { action: 'release' } ]);

2. 拖拽(Drag and Drop)

javascript
// 拖拽元素 const actions = driver.actions({ async: true }); await actions.dragAndDrop(sourceElement, targetElement).perform(); // 使用 TouchAction const touchAction = new TouchAction(driver); touchAction.press({ el: sourceElement }) .moveTo({ el: targetElement }) .release(); await touchAction.perform();

3. 缩放(Pinch)

javascript
// 缩放操作 const actions = driver.actions({ async: true }); await actions .move({ origin: element }) .press() .move({ origin: element, x: 50, y: 0 }) .release() .perform();

4. 旋转(Rotate)

javascript
// 旋转操作 const actions = driver.actions({ async: true }); await actions .move({ origin: element }) .press() .move({ origin: element, x: 0, y: 50 }) .release() .perform();

多点触控

1. 多点触控(Multi-touch)

javascript
// 多点触控操作 const actions = driver.actions({ async: true }); const finger1 = actions.move({ origin: element1 }); const finger2 = actions.move({ origin: element2 }); await actions .clear() .move({ origin: finger1 }).press() .move({ origin: finger2 }).press() .pause(100) .move({ origin: finger1 }).release() .move({ origin: finger2 }).release() .perform();

2. 捏合(Pinch and Spread)

javascript
// 捏合操作 const actions = driver.actions({ async: true }); const center = { x: 200, y: 200 }; await actions .move({ origin: center, x: -50, y: 0 }).press() .move({ origin: center, x: 50, y: 0 }).press() .pause(500) .move({ origin: center, x: -25, y: 0 }).release() .move({ origin: center, x: 25, y: 0 }).release() .perform();

手势操作最佳实践

1. 使用显式等待

javascript
// 等待元素可交互 await driver.wait( until.elementIsClickable(element), 5000 ); // 执行手势操作 await element.click();

2. 处理动画

javascript
// 等待动画完成 await driver.sleep(500); // 执行手势操作 await element.click();

3. 验证操作结果

javascript
// 执行手势操作 await element.click(); // 验证结果 const result = await driver.findElement(By.id('result_message')); const text = await result.getText(); assert.strictEqual(text, 'Success');

手势操作优化

1. 减少手势操作

javascript
// ❌ 不推荐:多次点击 await element.click(); await element.click(); await element.click(); // ✅ 推荐:使用双击 const actions = driver.actions({ async: true }); await actions.move({ origin: element }).doubleClick().perform();

2. 使用相对坐标

javascript
// 使用元素相对坐标 const rect = await element.getRect(); const centerX = rect.x + rect.width / 2; const centerY = rect.y + rect.height / 2; await driver.touchActions([ { action: 'press', x: centerX, y: centerY }, { action: 'release' } ]);

3. 处理不同屏幕尺寸

javascript
// 获取屏幕尺寸 const size = await driver.manage().window().getRect(); // 计算相对坐标 const x = size.width * 0.5; const y = size.height * 0.5; await driver.touchActions([ { action: 'press', x: x, y: y }, { action: 'release' } ]);

手势操作常见问题

1. 手势操作失败

原因

  • 元素不可见或不可点击
  • 手势操作被其他元素阻挡
  • 动画未完成

解决方案

javascript
// 等待元素可点击 await driver.wait( until.elementIsClickable(element), 5000 ); // 滚动到元素 await driver.executeScript('arguments[0].scrollIntoView(true);', element); // 执行手势操作 await element.click();

2. 手势操作不准确

原因

  • 坐标计算错误
  • 屏幕尺寸变化
  • 元素位置变化

解决方案

javascript
// 使用元素定位而非坐标 await element.click(); // 动态计算坐标 const rect = await element.getRect(); const x = rect.x + rect.width / 2; const y = rect.y + rect.height / 2;

3. 多点触控不支持

原因

  • 设备不支持多点触控
  • Appium 版本不支持

解决方案

javascript
// 检查多点触控支持 const capabilities = await driver.getCapabilities(); const supportsMultiTouch = capabilities.supportsMultiTouch; if (!supportsMultiTouch) { console.warn('Multi-touch not supported'); }

手势操作工具

1. Appium Inspector

Appium Inspector 提供手势操作录制功能:

  • 录制手势操作
  • 生成代码
  • 测试手势操作

2. 自定义手势库

javascript
// 创建自定义手势库 class GestureHelper { constructor(driver) { this.driver = driver; } async swipe(startX, startY, endX, endY, duration = 1000) { await this.driver.touchActions([ { action: 'press', x: startX, y: startY }, { action: 'wait', ms: duration }, { action: 'moveTo', x: endX, y: endY }, { action: 'release' } ]); } async longPress(element, duration = 2000) { const actions = this.driver.actions({ async: true }); await actions.move({ origin: element }).press().pause(duration).release().perform(); } } // 使用自定义手势库 const gestures = new GestureHelper(driver); await gestures.swipe(100, 500, 100, 100); await gestures.longPress(element, 2000);

最佳实践

  1. 优先使用元素操作

    • 使用 element.click() 而非坐标点击
    • 更稳定和可维护
    • 适应屏幕尺寸变化
  2. 合理使用等待

    • 等待元素可交互
    • 处理动画和加载
    • 避免硬编码等待
  3. 验证操作结果

    • 检查操作后的状态
    • 验证预期结果
    • 提供清晰的错误信息
  4. 处理异常情况

    • 捕获手势操作异常
    • 实现重试机制
    • 记录失败原因

Appium 的手势操作为测试人员提供了强大的用户交互模拟能力,通过合理使用各种手势操作,可以构建真实、可靠的自动化测试。

标签:Appium