App控件定位和交互(十)
一、元素的常用交互方法(核心操作)
|
|
|
|
|
|
|---|---|---|---|---|
|
|
element.click() |
|
|
is_displayed()+is_enabled()为 True);2. 避免点击坐标偏移(优先用元素点击,而非坐标点击);3. 点击后建议加短暂等待(如time.sleep(1)),避免页面未加载完成 |
|
|
element.send_keys("内容") |
|
|
clear()清除原有内容;2. 输入中文需配置 DC 参数:unicodeKeyboard=True+resetKeyboard=True;3. 部分 iOS 控件需用set_value()替代 |
|
|
element.set_value("appium") |
|
|
send_keys()类似,但底层逻辑不同(set_value直接赋值,send_keys模拟键盘输入);2. 优先用send_keys(),兼容问题时用set_value() |
|
|
element.clear() |
|
|
EditText(Android)/TextField(iOS)等可编辑控件有效 |
|
|
element.is_displayed() |
|
|
|
|
|
element.is_enabled() |
|
|
|
|
|
element.is_selected() |
|
|
is_enabled(),正确方法是is_selected();选中返回 True,未选中返回 False |
|
|
element.get_attribute("属性名") |
|
resource-id/text/content-desc/class等属性 |
appium-uiautomator2-server源码(GetElementScreenshot.java)中attribute相关逻辑,确认支持的属性列表 |
补充:get_attribute() 常用属性名(Android/iOS 差异)
|
|
|
|
|
|---|---|---|---|
|
|
resource-id |
name
accessibilityId |
element.get_attribute("resource-id")
com.tencent.wework:id/e0y |
|
|
text |
label
name |
element.get_attribute("text")
|
|
|
content-desc |
label
accessibilityId |
element.get_attribute("content-desc")
|
|
|
class |
type |
element.get_attribute("class")
android.widget.Button |
二、元素的核心属性(信息获取)
1. 获取元素文本
语法:element.text
作用:读取控件显示的文本内容(等同于get_attribute(“text”))
示例:
# 定位“通讯录”按钮并获取文本el = driver.find_element_by_id("com.tencent.wework:id/e0y")print(el.text) # 输出:通讯录
注意:无文本的控件(如纯图片按钮)返回空字符串。
2. 获取元素坐标
语法:element.location
作用:获取元素左上角的坐标(以屏幕左上角为原点)
返回值:字典格式{‘x’: 横坐标, ‘y’: 纵坐标}
示例:
loc = el.locationprint(loc) # 输出:{'x': 498, 'y': 19}x = loc['x'] # 提取横坐标y = loc['y'] # 提取纵坐标

应用场景:结合滑动操作(如从元素坐标滑动到屏幕底部)。
3. 获取元素尺寸
语法:element.size
作用:获取元素的宽度和高度
返回值:字典格式{‘width’: 宽度, ‘height’: 高度}
示例:
size = el.sizeprint(size) # 输出:{'width': 500, 'height': 22}width = size['width'] # 提取宽度height = size['height'] # 提取高度
应用场景:验证控件大小是否符合预期(如按钮宽度是否为 500px)。
三、实操示例(完整代码)
from appium import webdriverimport time# 配置Desired Capabilitydesired_caps = {"platformName": "Android","deviceName": "127.0.0.1:7555","appPackage": "com.xueqiu.android","appActivity": ".view.WelcomeActivityAlias","noReset": True,"unicodeKeyboard": True, # 支持中文输入"resetKeyboard": True}# 连接Appium Serverdriver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)driver.implicitly_wait(30) # 隐式等待# 1. 定位搜索框并操作search_el = driver.find_element_by_id("com.xueqiu.android:id/tv_search")# 检查搜索框是否可见、可用print("搜索框是否可见:", search_el.is_displayed()) # 输出Trueprint("搜索框是否可用:", search_el.is_enabled()) # 输出True# 点击搜索框search_el.click()# 2. 定位输入框,输入内容input_el = driver.find_element_by_id("com.xueqiu.android:id/search_input_text")input_el.clear() # 清空原有内容input_el.send_keys("Appium") # 输入文本# 验证输入内容(通过get_attribute获取value)print("输入框内容:", input_el.get_attribute("text")) # 输出:Appium# 3. 获取输入框的坐标和尺寸print("输入框坐标:", input_el.location) # 输出如{'x': 100, 'y': 200}print("输入框尺寸:", input_el.size) # 输出如{'width': 600, 'height': 80}# 4. 定位“搜索”按钮,检查是否可点击search_btn = driver.find_element_by_xpath("//*[@text='搜索']")if search_btn.is_enabled():search_btn.click()print("点击搜索按钮成功")time.sleep(3)driver.quit() # 关闭APP
四、常见问题与避坑
send_keys()输入中文乱码:
解决:配置 DC 参数unicodeKeyboard=True+resetKeyboard=True。
is_selected()返回错误:
原因:误调用is_enabled(),需修正为is_selected()。
get_attribute()返回 None:
原因:属性名错误(如 Android 用label、iOS 用text),需匹配对应平台的属性名。
点击元素无响应:
排查:先验证is_displayed()和is_enabled()是否为 True,再检查元素是否被遮挡。
总结
核心交互方法:
点击(click())、输入(send_keys())、清除(clear())是高频操作,需确保元素「可见 + 可用」;
状态检查方法:
is_displayed()/is_enabled()/is_selected()用于验证控件状态,是脚本稳定性的关键;
属性获取:
平台差异:
夜雨聆风