# appium定位,以text包含部分文字定位示例
# 方法1: 使用XPath的contains函数进行text部分匹配
from appium.webdriver.common.appiumby import AppiumBy
def locate_element_by_partial_text(driver, partial_text):
"""通过text包含部分文字定位元素的多种方法"""
# 方法1: XPath - contains函数匹配text属性
# 最常用的方法,适用于大多数情况
element1 = driver.find_element(
AppiumBy.XPATH,
f"//*[contains(@text, '{partial_text}')]"
)
print(f"方法1 - XPath contains: 找到元素 {element1.text}")
# 方法2: XPath - contains函数匹配content-desc属性
# 有时text内容可能在content-desc中
try:
element2 = driver.find_element(
AppiumBy.XPATH,
f"//*[contains(@content-desc, '{partial_text}')]"
)
print(f"方法2 - XPath contains (content-desc): 找到元素")
except Exception as e:
print(f"方法2 - 未找到匹配元素: {str(e)}")
# 方法3: 使用UiAutomator2的textContains方法
# 更高效,Android专用
try:
element3 = driver.find_element(
AppiumBy.ANDROID_UIAUTOMATOR,
f'new UiSelector().textContains("{partial_text}")'
)
print(f"方法3 - UiAutomator textContains: 找到元素 {element3.text}")
except Exception as e:
print(f"方法3 - 未找到匹配元素: {str(e)}")
# 方法4: 先获取所有可能的元素,再过滤
# 适用于复杂场景
try:
all_elements = driver.find_elements(AppiumBy.CLASS_NAME, 'android.widget.TextView')
filtered_elements = [e for e in all_elements if partial_text in e.text]
if filtered_elements:
print(f"方法4 - 过滤匹配: 找到 {len(filtered_elements)} 个匹配元素")
for i, elem in enumerate(filtered_elements):
print(f" 第{i+1}个元素: {elem.text}")
except Exception as e:
print(f"方法4 - 过滤出错: {str(e)}")
# 方法5: 匹配多个属性
# 更精确的定位
try:
element5 = driver.find_element(
AppiumBy.XPATH,
f"//android.widget.TextView[contains(@text, '{partial_text}') and @clickable='true']"
)
print(f"方法5 - 多属性匹配: 找到可点击元素 {element5.text}")
except Exception as e:
print(f"方法5 - 未找到匹配元素: {str(e)}")
# 返回第一个找到的元素
return element1
# 使用示例(需要在实际driver环境中运行)
"""
# 假设driver已经初始化
# driver = webdriver.Remote(...)
#
# # 查找text中包含"登录"的元素
# login_element = locate_element_by_partial_text(driver, "登录")
# login_element.click()
#
# # 查找text中包含"确认"的按钮
# confirm_button = locate_element_by_partial_text(driver, "确认")
# confirm_button.click()
"""
# 注意事项:
# 1. 当partial_text包含引号时,需要特殊处理以避免XPath语法错误
# 2. 方法3在Android上性能更好,特别是页面元素较多时
# 3. 优先使用方法1和方法3,它们是最常用且稳定的方式
# 4. 如果元素在屏幕外,可能需要先滚动页面再查找
# 5. 对于iOS,可以使用predicate string: '-ios predicate string', 'label CONTAINS[c] "部分文字"'