Appium常用操作之元素定位、swipe滑屏的操作方法是什么

发布时间:2021-10-25 17:14:26 作者:iii
来源:亿速云 阅读:243
# Appium常用操作之元素定位、swipe滑屏的操作方法是什么

## 目录
1. [Appium元素定位基础](#1-appium元素定位基础)
   - 1.1 [元素定位的重要性](#11-元素定位的重要性)
   - 1.2 [Appium支持的定位策略](#12-appium支持的定位策略)
2. [八大元素定位方法详解](#2-八大元素定位方法详解)
   - 2.1 [ID定位](#21-id定位)
   - 2.2 [ClassName定位](#22-classname定位)
   - 2.3 [XPath定位](#23-xpath定位)
   - 2.4 [Accessibility ID定位](#24-accessibility-id定位)
   - 2.5 [Android UiAutomator定位](#25-android-uiautomator定位)
   - 2.6 [iOS Predicate定位](#26-ios-predicate定位)
   - 2.7 [iOS Class Chain定位](#27-ios-class-chain定位)
   - 2.8 [Image定位](#28-image定位)
3. [元素定位最佳实践](#3-元素定位最佳实践)
   - 3.1 [定位策略选择优先级](#31-定位策略选择优先级)
   - 3.2 [复合定位技巧](#32-复合定位技巧)
   - 3.3 [显式等待与隐式等待](#33-显式等待与隐式等待)
4. [Swipe滑屏操作全解析](#4-swipe滑屏操作全解析)
   - 4.1 [swipe基本参数说明](#41-swipe基本参数说明)
   - 4.2 [四种滑动方向实现](#42-四种滑动方向实现)
   - 4.3 [精准滑动控制技巧](#43-精准滑动控制技巧)
5. [实战案例演示](#5-实战案例演示)
   - 5.1 [电商APP商品滑动浏览](#51-电商app商品滑动浏览)
   - 5.2 [新闻APP页面切换](#52-新闻app页面切换)
6. [常见问题解决方案](#6-常见问题解决方案)
   - 6.1 [元素定位失败排查](#61-元素定位失败排查)
   - 6.2 [滑动操作不生效处理](#62-滑动操作不生效处理)

---

## 1. Appium元素定位基础

### 1.1 元素定位的重要性
元素定位是移动自动化测试的基石,约70%的自动化脚本问题源于元素定位失败。精准的元素定位能确保:
- 准确的用户操作模拟
- 稳定的测试用例执行
- 高效的异常排查

### 1.2 Appium支持的定位策略
Appium基于WebDriver协议扩展,支持多种定位方式:

| 定位方式            | Android支持 | iOS支持 | 执行效率 |
|---------------------|-------------|---------|----------|
| ID                  | ✓           | ✓       | ★★★★★    |
| ClassName           | ✓           | ✓       | ★★★★☆    |
| XPath               | ✓           | ✓       | ★★☆☆☆    |
| Accessibility ID    | ✓           | ✓       | ★★★★☆    |
| Android UiAutomator | ✓           | ✗       | ★★★☆☆    |
| iOS Predicate       | ✗           | ✓       | ★★★★☆    |
| iOS Class Chain     | ✗           | ✓       | ★★★☆☆    |
| Image               | ✓           | ✓       | ★★☆☆☆    |

---

## 2. 八大元素定位方法详解

### 2.1 ID定位
通过resource-id(Android)或name(iOS)定位:

```java
// Java示例
WebElement element = driver.findElement(By.id("com.example:id/login_button"));

// Python示例
element = driver.find_element_by_id('com.example:id/login_button')

最佳实践: - 优先使用开发者定义的唯一ID - 避免使用动态生成的ID(含时间戳等)

2.2 ClassName定位

通过控件类名定位:

# 获取第一个匹配的TextView
text_view = driver.find_element_by_class_name("android.widget.TextView")

# 获取所有EditText
edit_texts = driver.find_elements_by_class_name("android.widget.EditText")

2.3 XPath定位

适用于复杂层级结构:

// 绝对路径定位(不推荐)
WebElement element = driver.findElement(By.xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.Button"));

// 属性组合定位(推荐)
WebElement element = driver.findElement(By.xpath("//android.widget.Button[@text='登录' and @resource-id='com.example:id/btn_login']"));

2.4 Accessibility ID定位

通过content-desc属性定位:

search_bar = driver.find_element_by_accessibility_id("搜索栏")

2.5 Android UiAutomator定位

Android专属定位方式:

// 文本包含匹配
WebElement element = driver.findElement(By.AndroidUIAutomator("new UiSelector().textContains(\"确认\")"));

// 滚动查找元素
WebElement element = driver.findElement(By.AndroidUIAutomator(
    "new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text(\"2023年账单\"))"));

2.6 iOS Predicate定位

iOS精准定位方案:

# 多属性组合
element = driver.find_element_by_ios_predicate('label == "提交" AND visible == 1')

# 字符串匹配
element = driver.find_element_by_ios_predicate('name BEGINSWITH "user"')

2.7 iOS Class Chain定位

改良版XPath:

# 直接子节点查找
element = driver.find_element_by_ios_class_chain('**/XCUIElementTypeWindow[1]/XCUIElementTypeButton[2]')

# 条件筛选
element = driver.find_element_by_ios_class_chain('**/XCUIElementTypeButton[`label == "确定"`]')

2.8 Image定位

基于图像识别:

// 需要提前保存模板图片
File templateImage = new File("path/to/template.png");
WebElement element = driver.findElementByImage(templateImage);

3. 元素定位最佳实践

3.1 定位策略选择优先级

推荐选择顺序: 1. Accessibility ID 2. Resource ID 3. Android UiAutomator/iOS Predicate 4. ClassName 5. XPath/Class Chain 6. Image

3.2 复合定位技巧

# 组合使用等待和定位
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "com.example:id/dynamic_element"))
)

3.3 显式等待与隐式等待

// 显式等待(推荐)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit_btn")));

// 隐式等待(全局设置)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

4. Swipe滑屏操作全解析

4.1 swipe基本参数说明

def swipe(driver, start_x, start_y, end_x, end_y, duration=None):
    """
    :param start_x: 起始点x坐标
    :param start_y: 起始点y坐标
    :param end_x: 结束点x坐标
    :param end_y: 结束点y坐标
    :param duration: 滑动持续时间(ms)
    """

4.2 四种滑动方向实现

// 向上滑动(Y轴减小)
Dimension size = driver.manage().window().getSize();
int startY = (int)(size.height * 0.8);
int endY = (int)(size.height * 0.2);
driver.swipe(size.width/2, startY, size.width/2, endY, 1000);

// 向右滑动(X轴增加)
int startX = (int)(size.width * 0.1);
int endX = (int)(size.width * 0.9);
driver.swipe(startX, size.height/2, endX, size.height/2, 800);

4.3 精准滑动控制技巧

# 控制滑动速度(duration与像素距离成正比)
def calculate_duration(start, end):
    distance = abs(end - start)
    return min(max(int(distance * 1.5), 200), 5000)  # 限制200-5000ms

# 元素中心点滑动
def swipe_element_to_element(driver, from_element, to_element):
    from_center = get_element_center(from_element)
    to_center = get_element_center(to_element)
    duration = calculate_duration(from_center['y'], to_center['y'])
    driver.swipe(from_center['x'], from_center['y'], 
                to_center['x'], to_center['y'], duration)

5. 实战案例演示

5.1 电商APP商品滑动浏览

def swipe_until_product_found(driver, product_name, max_swipes=10):
    for _ in range(max_swipes):
        try:
            element = driver.find_element_by_xpath(f"//*[contains(@text, '{product_name}')]")
            return element
        except NoSuchElementException:
            size = driver.get_window_size()
            driver.swipe(size['width']/2, size['height']*0.7, 
                        size['width']/2, size['height']*0.3, 1000)
    raise Exception(f"未找到商品: {product_name}")

5.2 新闻APP页面切换

public void switchNewsCategory(AndroidDriver driver, String category) {
    // 横向滑动查找分类标签
    while(true) {
        try {
            WebElement tab = driver.findElement(By.xpath("//*[@text='" + category + "']"));
            tab.click();
            break;
        } catch (NoSuchElementException e) {
            Dimension size = driver.manage().window().getSize();
            driver.swipe((int)(size.width * 0.8), size.height / 2, 
                        (int)(size.width * 0.2), size.height / 2, 800);
        }
    }
}

6. 常见问题解决方案

6.1 元素定位失败排查

  1. 检查上下文

    • 确认当前是NATIVE_APP还是WEBVIEW上下文
    print(driver.contexts)
    driver.switch_to.context('NATIVE_APP')
    
  2. 检查DOM结构

    • 使用uiautomatorviewer(Android)或Xcode(iOS)验证元素属性
  3. 动态元素处理

    // 处理动态ID
    WebElement element = driver.findElement(By.xpath("//*[starts-with(@resource-id, 'com.example:id/dynamic_')]"));
    

6.2 滑动操作不生效处理

  1. 坐标计算问题

    • 确保坐标点在屏幕可见范围内
    • 考虑状态栏/导航栏高度
  2. 滑动速度优化

    • 增加duration参数值(500-1500ms为宜)
  3. 替代方案: “`python

    使用TouchAction实现更复杂手势

    from appium.webdriver.common.touch_action import TouchAction

action = TouchAction(driver) action.press(x=100, y=500).wait(800).move_to(x=100, y=100).release().perform()


---

> 本文共计约4700字,详细介绍了Appium元素定位和滑屏操作的完整知识体系。实际应用中建议根据具体场景选择合适的定位策略,并配合合理的等待机制和异常处理,才能构建出稳定的移动自动化测试脚本。
推荐阅读:
  1. Appium for Android元素定位方法
  2. Python Appium 元素定位方法简单介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

swipe appium

上一篇:Python爬虫工具都有哪些

下一篇:如何弄清Python的时间和日期问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》