下面是一个完整的 Appium WebDriver 支持的常用方法汇总,并附上典型用法示例。

 一、元素查找方法/元素操作方法

✅ 使用 find_element() 和 find_elements()

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy# 单个元素查找
el = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")# 多个元素查找
els = driver.find_elements(by=AppiumBy.CLASS_NAME, value="android.widget.EditText")
✅ 支持的定位方式(AppiumBy):
定位方式示例值
AppiumBy.ID"com.example:id/btn_login"
AppiumBy.CLASS_NAME"android.widget.EditText"
AppiumBy.NAME"login_button"(已不推荐)
AppiumBy.XPATH"//android.widget.TextView[@text='Submit']"
AppiumBy.ACCESSIBILITY_ID"button_login"
AppiumBy.ANDROID_UIAUTOMATOR'new UiSelector().resourceId("com.example:id/login")'
AppiumBy.IOS_PREDICATE"label == 'Login'"(iOS 专用)
AppiumBy.IOS_CLASS_CHAIN"XCUIElementTypeButton[1]"(iOS 专用)

举例说明常用的 Appium 定位方式(配合 Appium Inspector 使用)

我们以一个假设的登录页面为例,其中包含以下 UI 元素信息(通过 Appium Inspector 查看):

属性
用户名输入框resource-id="com.example:id/username"
密码输入框class="android.widget.EditText"
登录按钮text="Login" 或 content-desc="login_button"
发送按钮resource-id="com.example:id/send"
提交按钮xpath="//android.widget.Button[@text='Submit']"

✅ 示例 1:通过 ID 定位(推荐)
from appium.webdriver.common.appiumby import AppiumBy# 定位发送按钮
send_button = driver.find_element(by=AppiumBy.ID, value="com.example:id/send")
send_button.click()

✅ 示例 2:通过 XPath 定位(灵活但效率略低)
submit_button = driver.find_element(by=AppiumBy.XPATH,value="//android.widget.Button[@text='Submit']"
)
submit_button.click()

✅ 示例 3:通过 Class Name 定位(适用于多个同类型元素)
edit_text_list = driver.find_elements(by=AppiumBy.CLASS_NAME,value="android.widget.EditText"
)# 输入用户名到第一个 EditText
edit_text_list[0].send_keys("testuser")

✅ 示例 4:通过 Accessibility ID(content-desc)定位
login_button = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID,value="login_button"
)
login_button.click()

✅ 示例 5:通过 Text 定位(注意大小写和空格)
login_button = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().text("Login")'
)
login_button.click()

✅ 示例 6:模糊匹配文本(contains)
button = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textContains("Sub")'
)
button.click()

✅ 示例 7:通过 resource-id + text 组合定位(更稳定)
element = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/send").text("Send Message")'
)
element.click()

 ✅ 使用new UiSelector()语法定位元素

在 Appium 自动化测试中,特别是在 Android 平台上,new UiSelector() 是一种非常强大且灵活的定位元素方式。它属于 Android UI Automator 提供的 API,允许你通过多种属性组合来精确定位页面上的控件。


1.什么是 new UiSelector()
  • UiSelector 是 Android UI Automator 提供的一个类。
  • 在 Appium 中可以通过 AppiumBy.ANDROID_UIAUTOMATOR 来使用它。
  • 它可以结合多个属性(如 textresourceIdclassNameindexdescription 等)进行查找,适合处理复杂的 UI 结构。
2.基本语法结构
from appium.webdriver.common.appiumby import AppiumByelement = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().<method>(<value>)'
)

⚠️ 注意:传入的是一个字符串表达式,语法要严格符合 Java 的写法。

3.常用方法详解与示例
✅ 1. text(String text)

根据文本内容定位控件。

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().text("Login")'
)

适用于按钮、TextView 等显示文字的控件。


✅ 2. textContains(String substr)

模糊匹配文本内容(包含子串)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textContains("Log")'
)

✅ 3. textStartsWith(String prefix)

以某个前缀开头的文本

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textStartsWith("Wel")'
)

✅ 4. textMatches(Pattern regex)

正则匹配文本内容

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textMatches("^User\\d+$")'  # 匹配 "User123"
)

✅ 5. resourceId(String id)

通过资源 ID 定位控件(推荐用 AppiumBy.ID 更简洁)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/username")'
)

✅ 6. className(String className)

通过类名定位控件(如 EditText, Button

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.Button")'
)

✅ 7. description(String contentDescription)

通过 content-desc 属性定位(Accessibility ID)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().description("menu_icon")'
)

✅ 8. index(int index)

通过索引定位(慎用,容易变化)

# 找第一个 TextView
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.TextView").index(0)'
)

✅ 9. instance(int instance)

获取某一类控件中的第几个实例(类似 XPath 中的 [n])

# 获取第二个 EditText
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.EditText").instance(1)'
)

✅ 10. 组合使用多个条件

你可以组合多个条件来更精确地定位元素:

# 同时匹配 resourceId 和 text
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/login").text("Login")'
)

✅ 11.注意事项
项目说明
性能比 ID 和 XPath 略慢,但比 XPath 更稳定
推荐用途复杂控件、动态内容、没有唯一 ID 的场景
调试建议使用 Appium Inspector 查看控件属性
只能在 Android 上使用不支持 iOS,iOS 需要用 IosUIAutomation 或 Predicate String

✅ 12.常见问题解答

❓ Q1:为什么找不到元素?

  • 控件还没加载出来,加 time.sleep() 或显式等待;
  • 文本大小写不一致,注意区分;
  • 控件是动态生成的,尝试换用其他属性;
  • 使用 driver.page_source 查看当前页面结构。
✅ 13.常用定位方式对比
定位方式示例值特点
AppiumBy.ID"com.example:id/send"推荐使用,速度快,唯一性强
AppiumBy.XPATH"//android.widget.Button[@text='Submit']"灵活但慢,适合结构化定位
AppiumBy.CLASS_NAME"android.widget.EditText"多个元素时需结合索引
AppiumBy.ACCESSIBILITY_ID"login_button"依赖无障碍描述,iOS 和 Android 都支持
AppiumBy.ANDROID_UIAUTOMATOR'new UiSelector().text("Login")'Android 专属,强大但语法复杂

✅ element支持的方法

在使用 Appium 定位到元素之后,除了 click() 动作之外,还有许多其他动作可以对这些元素执行。以下是几种常见的操作方法:

1. 输入文本
  • send_keys():向输入框中输入文本。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    element.send_keys("testuser")
2. 清除文本
  • clear():清除输入框中的现有文本。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    element.clear()
3. 获取文本
  • text 属性:获取元素显示的文本内容。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/message")
    print(element.text)
4. 检查元素是否可见或启用
  • is_displayed():判断元素是否对用户可见。
  • is_enabled():检查元素是否可用(例如按钮是否可点击)。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/loginButton")
    if element.is_displayed() and element.is_enabled():element.click()
5. 获取属性值
  • get_attribute(name):获取元素的特定属性值。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    attribute_value = element.get_attribute("name")  # 或者 "content-desc", "resource-id" 等
6. 提交表单
  • submit():对于某些支持提交的元素(如表单),可以调用此方法来提交。
    form_element = driver.find_element(by=AppiumBy.ID, value="com.example:id/loginForm")
    form_element.submit()
7. 触摸手势

虽然不是直接作用于元素的方法,但你可以通过 TouchAction 类对特定元素执行触摸手势:

  • 长按轻扫等。
    from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
    action.long_press(el=element).wait(1000).release().perform()
8. 元素等待

有时候你可能需要等待某个元素变为可见或者存在:

  • 显式等待
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
    element = wait.until(EC.visibility_of_element_located((AppiumBy.ID, "com.example:id/username")))
9. 获取元素大小和位置
  • size 属性 和 location 属性:分别用于获取元素的尺寸和屏幕上的位置。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    print("Size:", element.size)
    print("Location:", element.location)
10. 截图

尽管不是直接针对元素的方法,但你可以截取整个屏幕的截图,然后根据需要裁剪出特定元素的部分:

  • driver.save_screenshot('screenshot.png'):保存当前屏幕截图。


📱 二、移动端专属方法(来自 MobileCommand

这些方法只能在 Appium 中使用,Selenium 不支持。

✅ 1. 滑动屏幕(Swipe)

driver.swipe(start_x=100, start_y=800, end_x=100, end_y=200, duration=800)

✅ 2. 拖拽(Drag and Drop)

driver.drag_and_drop(origin_el, destination_el)

✅ 3. 按下和释放(Touch Action)

from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
action.press(x=100, y=500).wait(1000).release().perform()

更推荐使用新版的 W3CActions 方式。

✅ 4. 启动应用 / 关闭应用

driver.activate_app('com.example.app')        # 启动应用
driver.background_app(5)                      # 将应用置于后台运行5秒
driver.terminate_app('com.example.app')       # 强制停止应用

✅ 5. 获取当前应用信息

print("Current Package:", driver.current_package)
print("Current Activity:", driver.current_activity)

✅ 6. 安装 / 卸载应用

driver.install_app('/path/to/app.apk')
driver.remove_app('com.example.app')

✅ 7. 判断是否已安装应用

if driver.is_app_installed('com.example.app'):print("App is installed.")

✅ 8. 切换上下文(WebView / Native)

contexts = driver.contexts
print("Available contexts:", contexts)driver.switch_to.context(contexts[-1])  # 切换到 WebView

✅ 9. 获取系统时间

print("Device time:", driver.device_time)

✅ 10. 发送键事件(如返回、菜单)

driver.press_keycode(4)  # 返回键 KEYCODE_BACK

✅ 11. 截图

driver.save_screenshot('screen.png')

三、浏览器相关方法(Hybrid App 或 Webview)

如果你是在 WebView 中进行操作,可以使用类似 Selenium 的方式:

driver.get("https://example.com")
print("Current URL:", driver.current_url)
driver.back()
driver.forward()

四、键盘与输入操作

el.send_keys("Hello World")
el.clear()

如果遇到中文输入问题,可设置以下 Desired Capabilities:

'dict': {'resetKeyboard': True,'unicodeKeyboard': True
}

五、截图与文件操作

driver.save_screenshot('test.png')  # 保存截图
driver.get_screenshot_as_base64()   # 获取 base64 编码图片

六、网络与设备状态

driver.is_locked()            # 是否锁屏
driver.unlock()               # 解锁
driver.lock(5)                # 锁屏5秒后自动解锁
driver.set_network_connection(6)  # 设置网络连接类型

七、执行脚本(JavaScript、Driver Command)

result = driver.execute_script("mobile: scroll", {"direction": "down"})

你也可以直接调用底层命令:

driver.execute("mobile: longClickGesture", {"x": 100,"y": 100,"duration": 1000
})

八、会话控制

driver.quit()         # 结束当前会话
driver.close_app()    # 关闭当前应用但不结束会话

九、获取日志(Logcat 等)

logs = driver.get_log('logcat')
for log in logs:print(log)

支持的日志类型包括:

  • logcat
  • bugreport
  • server
  • driver
  • client

十、完整方法列表(部分)

你可以通过以下方式查看所有可用的方法:

dir(driver)

或者访问官方文档:

🔗 Appium-Python-Client 文档


✅ 总结:常用方法速查表

功能方法
查找元素find_elementfind_elements
触摸操作swipedrag_and_droppress_keycode
应用控制activate_appterminate_appbackground_app
安装卸载install_appremove_appis_app_installed
上下文切换switch_to.context()
输入文本send_keysclear
截图save_screenshotget_screenshot_as_base64
执行脚本execute_scriptexecute
日志获取get_log('logcat')
锁屏操作is_lockedunlocklock

如果你有具体需求或想了解某个功能的详细用法,欢迎告诉我,我可以为你提供代码示例!

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/news/910505.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/news/910505.shtml
    英文地址,请注明出处:http://en.pswp.cn/news/910505.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    FreeRTOS 介绍、使用方法及应用场景

    一、FreeRTOS 概述 FreeRTOS 是一款广泛应用于嵌入式系统的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有开源、可移植、可裁剪、轻量级等显著特点。它最初由 Richard Barry 开发&#xff0c;如今已成为全球开发者在物联网、工业控制、消费电子等领域的热门选择&a…

    深度解析 Caffeine:高性能 Java 缓存库

    1. Caffeine 简介 Caffeine 是一个基于 Java 8 的高性能本地缓存库&#xff0c;由 Ben Manes 开发&#xff0c;旨在替代 Google Guava Cache&#xff0c;提供更优的缓存策略、更高的吞吐量和更灵活的配置。 核心优势 ✅ 卓越的性能&#xff1a;采用优化的数据结构&#xff0…

    创客匠人赋能创始人 IP 打造:健康行业知识变现案例深度解析

    在知识服务行业蓬勃发展的当下&#xff0c;创始人 IP 打造已成为知识变现的核心驱动力。创客匠人近期披露的陪跑案例显示&#xff0c;通过系统化的线上线下联动运营&#xff0c;传统行业从业者可高效实现 IP 价值转化。以亓黄中医科技创始人吴丰言老师为例&#xff0c;其在创客…

    64、最小路径和

    题目&#xff1a; 解答&#xff1a; 简单dp。 定义&#xff1a;dp[i][j]为到达(i,j)所需要的最短路程 初始化&#xff1a;dp[0][0]grid[0][0]&#xff0c;同时对第一行和第一列的&#xff0c;第i个就是前i个之和加上自身 递归&#xff1a;dp[i][j]min(dp[i-1][j],dp[i][j-1…

    获取连接通义千问大语言模型配置信息的步骤:api_key、api_url

    一、注册并开通通义千问API服务 1. 注册阿里云账号 访问 阿里云官网点击右上角"免费注册"&#xff0c;按指引完成账号注册和实名认证 2. 开通通义千问API服务 进入 通义千问API产品页点击"立即开通"&#xff0c;按提示完成服务开通&#xff08;部分服务…

    汽车加气站操作工考试题库含答案【最新】

    1.天然气的主要成分是&#xff08;&#xff09;。 A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案&#xff1a;C 2.CNG 加气站中&#xff0c;加气机的加气软管应&#xff08;&#xff09;进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 3.储气罐的安全阀应&#xf…

    显示任何结构的数组对象数据【向上自动滚动】

    显示任何结构的数组对象数据 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>地图编辑软件 - 数…

    GPIO模式详解

    一、GPIO的八种模式 GPIO支持4种输入模式&#xff08;浮空输入、上拉输入、下拉输入、模拟输入&#xff09;和4种输出模式&#xff08;开漏输出、开漏复用输出、推挽输出、推挽复用输出&#xff09;。 GPIO_Mode_AIN模拟输入GPIO_Mode_IN_FLOATING浮空输入GPIO_Mode_IPD下拉输…

    django rest_framework 自定义403 Forbidden错误页面

    django本来有是可以很方便自定义HTTP错误页面的&#xff0c;网上资料一大把。核心是在项目的urls代码中增加handler403的定义&#xff0c;比如&#xff1a; handler403 "app.views.your_custom_view" 404&#xff0c;500都是一样的&#xff0c;重新定义handler404…

    Kafka Streams架构深度解析:从并行处理到容错机制的全链路实践

    在流处理技术领域&#xff0c;Kafka Streams以其轻量级架构与Kafka生态的深度整合能力脱颖而出。作为构建在Kafka生产者/消费者库之上的流处理框架&#xff0c;它通过利用Kafka原生的分区、副本与协调机制&#xff0c;实现了数据并行处理、分布式协调与容错能力的无缝集成。本文…

    【嵌入式硬件实例】-555定时器控制舵机/伺服电机

    555定时器控制舵机/伺服电机 文章目录 555定时器控制舵机/伺服电机1、555定时器介绍2、舵机/伺服电机介绍3、硬件准备与接线使用 555 定时器 IC 的伺服电机控制器和测试仪电路是一个简单的电路,可用于生成操作伺服电机所需的控制信号。该电路允许我们通过按下按钮手动驱动/控制…

    国产麒麟 安装可视化数据库软件DBeaver(图解)

    目录 ​​​​​​​​编辑DBeaver介绍 官网 通过强制使用 Ubuntu 模板来修复 add-apt-repository 重新添加 PPA 撤销更改&#xff08;可选&#xff09; 官网直接下载 DBeaver CE 下载好后安装软件 启动方式一 启动方式二 启动成功 在左侧右击新建连接 安装驱动 测…

    线程池 JMM 内存模型

    线程池 & JMM 内存模型 文章目录 线程池 & JMM 内存模型线程池线程池的创建ThreadPoolExecutor 七大参数饱和策略ExecutorService 提交线程任务对象执行的方法&#xff1a;ExecutorService 关闭线程池的方法&#xff1a;线程池最大线程数如何确定&#xff1f; volatile…

    [论文阅读] 软件工程 + 教学 | 软件工程项目管理课程改革:从传统教学到以学生为中心的混合式学习实践

    软件工程项目管理课程改革&#xff1a;从传统教学到以学生为中心的混合式学习实践 论文信息 arXiv:2506.14369 Agile and Student-Centred Teaching of Agile/Scrum Concepts Maria Spichkova Comments: Preprint. Accepted to the 29th International Conference on Knowledg…

    Windows系统提示“mfc140u.dll丢失”?详细修复指南,一键恢复程序运行!

    当你兴致勃勃地打开某个游戏或专业软件时&#xff0c;突然弹出一条错误提示——“MFC140u.dll丢失”&#xff0c;程序直接闪退&#xff0c;让人无比沮丧。别担心&#xff01;这个问题并不复杂&#xff0c;通常只需重新安装运行库或修复系统文件即可解决。本文将为你提供详细的修…

    云XR(AR/VR)算力底座关键特征与技术路径

    云XR&#xff08;AR/VR&#xff09;算力底座是支撑扩展现实技术规模化落地的核心基础设施&#xff0c;当前发展呈现以下关键特征与技术路径&#xff1a; 一、算力架构&#xff1a;云边端协同异构融合 分布式部署模式‌ 云端‌&#xff1a;承担高复杂度渲染与大数据处理&#x…

    Android开发常用adb合集

    Android开发常用adb合集 Android开发常用adb合集crash日志导出 Android开发常用adb合集 crash日志导出 bugreport: adb bugreportdropbox: adb shell dumpsys dropbox --print > desktop/full_dropbox_logs.txt

    LTspice仿真4——exp指数函数波形

    参数设置 Vinitial&#xff1a;初始电压值 Vpulsed&#xff1a;脉冲达到值 Rise Delay&#xff1a;上升延迟时间 Rise Tau&#xff1a;上升指数系数tau Fall Delay&#xff1a;下降延迟时间 Fall Tau&#xff1a;下降指数系数tau tau决定指数波形下降或者上升快慢&#x…

    [Java 基础]集合框架

    在 Java 中&#xff0c;我们经常需要存储和操作一组数据&#xff0c;而集合框架就是为此而生。它提供了一套统一的接口和类&#xff0c;帮助我们高效地管理各种数据集合。 常用的集合框架中的类只有 ArrayList、LinkedList、HashSet、HashMap 这 4 个&#xff0c;这些类的继承…

    SQL关键字三分钟入门:WITH —— 公用表表达式让复杂查询更清晰

    在实际的数据库开发和分析中&#xff0c;我们常常会遇到复杂的多层嵌套查询&#xff0c;这样的 SQL 语句不仅难以阅读&#xff0c;也容易出错。 这时候就需要使用一个非常实用又优雅的关键字 —— WITH&#xff01; 它可以帮助我们将复杂的子查询提取出来并命名&#xff0c;从…