weixin_42224705 2025-09-03 00:16 采纳率: 0%
浏览 2

(标签-appium|关键词-app)

环境: 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 行为表现:

    1. 第一种 Appdriver.PageSource 只包含可见元素,不可见元素不会出现在 XML 中。
    2. 第二种 Appdriver.PageSource 包含所有元素(包括不可见),但 element.Displayedelement.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 debug
    

    5.2 使用 Android Profiler 分析 App 性能

    • 打开 Android Studio 的 Profiler 工具,监控 CPU、内存、网络等指标。

    最终目标:解决第二种 App 的性能问题

    | 问题 | 解决方案 | |------|----------| | 自动化操作时间越长,App 响应越慢 | 优化 Appium 会话管理 + 清理模拟器缓存 + 提高模拟器性能 | | 元素显示状态判断不准 | 使用元素高度判断可见性,替代 Displayed 属性 | | PageSource 包含不可见元素 | 配合 XPath/CSS 过滤出真正可见的元素 |


    🚀 付费悬赏建议

    如果你希望快速得到定制化解决方案(如针对特定 App 的元素识别逻辑、性能调优脚本、自动化框架重构等),可以考虑:

    • 开源平台(如 GitHub、GitLab、知乎、掘金)发布悬赏任务;
    • 技术社区(如 SegmentFault、CSDN、Stack Overflow)发帖;
    • 使用 招聘平台(如猪八戒网、程序员客栈)寻找专业开发者。

    如果你有具体的 App 的 PageSource 内容或元素结构,我可以进一步帮你优化识别逻辑。欢迎提供更多细节!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月3日