当前位置: 首页 > news >正文

appium之Toast元素识别

Appium之Toast元素识别教程与实例
一、Toast简介
Toast是Android系统中的轻量级消息提示框,以浮动形式短暂显示(通常2-3秒),无法被点击且不会获取焦点。常见于登录失败、操作提示等场景,如“密码错误”或“网络异常”。传统定位工具无法直接捕获,需借助Appium的特定配置实现。

二、环境准备

Node.js安装

官网下载并安装Node.js,验证安装成功:npm -v。
切换npm镜像源

使用淘宝镜像加速依赖下载:

npm config set registry https://registry.npm.taobao.org

安装cnpm替代npm:

npm install -g cnpm --registry=https://registry.npm.taobao.org
```[2](@ref)[3](@ref)

安装uiautomator2驱动

执行命令:

cnpm install appium-uiautomator2-driver

安装后检查node_modules目录是否存在相关文件。
安装Selenium

通过pip安装:

pip install selenium

验证版本:

pip show selenium

三、关键配置
在Capability中必须添加以下参数以启用UiAutomator2引擎:

desired_caps['automationName'] = 'uiautomator2'

⚠️ 注意:此配置可能导致Appium运行速度变慢,非必要场景建议使用默认引擎。

四、定位Toast元素的方法

1.XPath定位

通过文本内容:error_message = “登录密码错误”

xpath = '//*[@text="{}"]'.format(error_message)
toast_element = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath(xpath))
```[2](@ref)[5](@ref)

通过class属性(通用方法):

toast_element = driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']")
```[6](@ref)[7](@ref)

2.显式等待与动态函数
使用WebDriverWait确保捕获短暂出现的Toast:

from selenium.webdriver.support.ui import WebDriverWait
toast = WebDriverWait(driver, timeout=5, poll_frequency=0.5).until(
    lambda x: x.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']")
)
```[5](@ref)[6](@ref)

五、实战案例:登录失败捕获Toast
场景:输入错误密码后获取提示“账号或密码错误”。
代码示例:

# coding=utf-8  # 必须添加,避免中文编码问题[3](@ref)[5](@ref)
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

# 配置Capability
desired_caps = {
    "platformName": "Android",
    "automationName": "uiautomator2",
    "appPackage": "com.example.app",
    "appActivity": ".MainActivity"
}
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)

# 执行登录操作
driver.find_element_by_id("username_input").send_keys("test")
driver.find_element_by_id("password_input").send_keys("wrong_password")
driver.find_element_by_id("login_btn").click()

# 捕获Toast
try:
    toast_text = WebDriverWait(driver, 5).until(
        lambda x: x.find_element(AppiumBy.XPATH, "//*[contains(@text, '密码错误')]")
    ).text
    print("捕获到的Toast内容:", toast_text)
except TimeoutException:
    print("未找到Toast提示")

输出结果:

捕获到的Toast内容:账号或密码错误

六、常见问题与解决

1.Toast无法定位
检查automationName是否为uiautomator2。确保Appium版本≥1.6.3,建议使用1.20+。

2.中文乱码
在Python脚本开头添加# coding=utf-8。

3.Toast显示时间过短
缩短poll_frequency(如0.1秒),增加检测频率。

七、扩展:封装Toast判断函数

def get_toast_text(driver, timeout=5):
    try:
        toast_loc = (AppiumBy.XPATH, "//*[@class='android.widget.Toast']")
        toast_element = WebDriverWait(driver, timeout).until(EC.presence_of_element_located(toast_loc))
        return toast_element.text
    except:
        return None

调用示例:

toast = get_toast_text(driver)
if toast == "登录成功":
    print("测试通过")
```[6](@ref)[7](@ref)

相关文章:

  • Matlab 雷达导引头伺服系统的建模与仿真研究
  • python-leetcode 55.子集
  • Flutter 按钮组件 ElevatedButton 详解
  • spring AOP学习
  • Matlab 汽车ABS实现模糊pid和pid控制
  • SQL语言的编译原理
  • SQLMesh宏操作符深度解析:掌握@star与@GENERATE_SURROGATE_KEY实战技巧
  • 重生之我在学Vue--第13天 Vue 3 单元测试实战指南
  • 【漫话机器学习系列】144.辛普森悖论(Simpson‘s Paradox)
  • 数学建模:MATLAB循环神经网络
  • 嵌入式八股RTOS与Linux---前言篇
  • YOLOv1到YOLOv12发展概述2025.3.17
  • 网络安全运维应急响应与溯源分析实战案例
  • MyBatis 如何创建 SqlSession 对象的?
  • Oracle静默安装方法
  • 再学:abi编码 地址类型与底层调用
  • 烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明
  • C++和标准库速成(五)——C风格的数组、std::array、std::vector、std::pair和std::optional
  • Ruby 命令行选项
  • S32K144入门笔记(十三):LPIT的API函数解读
  • 中国银行副行长刘进任该行党委副书记
  • 央行召开落实金融“五篇大文章”总体统计制度动员部署会议
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议
  • 今年3月全国查处违反中央八项规定精神问题16994起
  • 商务部:将积极会同相关部门加快推进离境退税政策落实落地
  • 云南鲁甸县一河滩突然涨水致4死,有人在救人过程中遇难