环境: appium项目, vs2022+WPF+net8.0+c#+Appium2.xx版 + 2个逍遥模拟器, 手机app自动化测试时, 即使在同1个模拟器上, 不同的app有2种不同的情况, 例如: 屏幕上有1个1个页面无法完全显示的长列表, 获取页面的全部文本时, 第1种app是只能获取到可见的元素的文本,driver.PageSource 只会包含可见元素的 XML 节点, 第2种是可以获取到包含不可见的元素的文本, 并且判断不可见元素是否存在时, 结果是存在的,居然还无法用这种办法判断是否可见, element.Displayed也无法分辨是否可见, 我发现一个规律可以判断是否真实可见, 就是元素不可见时,高度很小, 一般小于4, 当可见时会高度突然变大超过30以上, 第2种app容易出现1个缺点: 自动化测试时间长些之后, 感觉手机的反应会越来越慢, 但是第1种不会, 如何解决第2种app随自动化控制操作时间变长而变慢的问题
4条回答 默认 最新
檀越@新空间 2025-09-03 00:17关注上午好☀️☀️☀️️
本答案参考通义千问在你描述的 Appium + WPF + C# + .NET 8.0 + 2个逍遥模拟器 的自动化测试环境中,遇到了两种不同的 App 行为表现:
- 第一种 App:
driver.PageSource只包含可见元素,不可见元素不会出现在 XML 中。 - 第二种 App:
driver.PageSource包含所有元素(包括不可见),但element.Displayed和element.Enabled等属性无法准确判断是否可见。
问题总结
- 第二种 App 的核心问题:
- 自动化测试时间越长,手机反应越慢。
- 元素“看似存在”但实际上不可见,导致 UI 操作失败或效率下降。
✅ 解决方案
一、优化 Appium 会话与模拟器资源管理
1.1 合理控制 Appium 会话生命周期
- 避免频繁重启会话:每次启动新的 App 时尽量复用同一个会话(如果可能)。
- 关闭不必要的 App:在测试过程中,确保只运行当前需要测试的 App,避免后台进程占用资源。
// 示例:关闭其他 App(需 Root 权限) public void KillOtherApps(string packageName) { var command = $"adb shell am force-stop {packageName}"; Process.Start("cmd.exe", "/c " + command); }1.2 清理模拟器缓存
- 定期清理模拟器的
/data/data/目录和cache文件夹,防止内存泄漏。
# 在模拟器中执行以下命令(通过 adb shell) rm -rf /data/data/com.yourapp.package/cache/*
二、优化页面元素定位逻辑
2.1 根据元素高度判断可见性
你已经发现一个规律:当元素高度小于4时,说明不可见;大于30时才可见。
重点:通过元素的高度来判断其是否真实可见,而不是依赖 Displayed 属性。
修改代码示例:
public bool IsElementVisibleByHeight(IWebElement element) { try { var size = element.Size; return size.Height > 30; // 根据你的测试调整阈值 } catch (Exception ex) { Console.WriteLine($"Error checking element visibility: {ex.Message}"); return false; } }2.2 结合 XPath 或 CSS 选择器进行过滤
你可以使用 XPath 或 CSS 选择器来筛选出“真正可见”的元素,例如:
//android.widget.TextView[@resource-id='your.id' and @bounds!='[0,0][0,0]']或者:
android.widget.TextView[height > 30]注意:CSS 选择器在 Appium 中不支持,建议使用 XPath。
三、提升 Appium 性能
3.1 启用 Appium 的性能优化选项
- 在 Appium 启动参数中添加以下配置:
{ "platformName": "Android", "deviceName": "emulator-5554", "appPackage": "com.your.app.package", "appActivity": ".MainActivity", "autoGrantPermissions": true, "noReset": true, "fullReset": false, "uiautomator2ServerInstallTimeout": 60000, "uiautomator2ServerLaunchTimeout": 60000 }3.2 禁用不必要的 Appium 插件
- 如果你使用了第三方插件(如
appium-uiautomator2-server),可以尝试禁用它们以减少性能损耗。
四、模拟器优化建议
4.1 使用高性能模拟器配置
- 使用 ARM 架构的模拟器(如 x86 不太适合长时间运行)。
- 增加模拟器内存和 CPU 资源,确保模拟器不会因资源不足而变慢。
4.2 定期重启模拟器
- 自动化测试持续一段时间后,手动重启模拟器可有效释放资源。
# 重启指定模拟器 adb -s emulator-5554 emu kill adb -s emulator-5554 emulator -avd your_avd_name -no-snapshot
五、使用日志分析性能瓶颈
5.1 开启 Appium 日志输出
- 在 Appium Server 启动时添加
-g参数,输出详细日志。
appium --log-level debug5.2 使用 Android Profiler 分析 App 性能
- 打开 Android Studio 的 Profiler 工具,监控 CPU、内存、网络等指标。
✅ 最终目标:解决第二种 App 的性能问题
| 问题 | 解决方案 | |------|----------| | 自动化操作时间越长,App 响应越慢 | 优化 Appium 会话管理 + 清理模拟器缓存 + 提高模拟器性能 | | 元素显示状态判断不准 | 使用元素高度判断可见性,替代
Displayed属性 | | PageSource 包含不可见元素 | 配合 XPath/CSS 过滤出真正可见的元素 |
🚀 付费悬赏建议
如果你希望快速得到定制化解决方案(如针对特定 App 的元素识别逻辑、性能调优脚本、自动化框架重构等),可以考虑:
- 在 开源平台(如 GitHub、GitLab、知乎、掘金)发布悬赏任务;
- 在 技术社区(如 SegmentFault、CSDN、Stack Overflow)发帖;
- 使用 招聘平台(如猪八戒网、程序员客栈)寻找专业开发者。
如果你有具体的 App 的 PageSource 内容或元素结构,我可以进一步帮你优化识别逻辑。欢迎提供更多细节!
解决 无用评论 打赏 举报- 第一种 App: