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

Appium 的 enableMultiWindows 参数

引言

在移动应用自动化测试中,​​混合应用(Hybrid App)​​ 和多窗口场景(如分屏、弹窗、多
WebView)的处理一直是技术难点。Appium 的 enableMultiWindows
参数为这类场景提供了关键支持,但在实际使用中常因配置不当引发问题。

遇到的问题

起初在测试一个期货交易类APP时,订单发送后会有成交回报,在app的上方显示。这个提示弹出框无法被appium获取,获取page souce XML结构时无法找到这个元素。其实这就是因为在Appium初始化driver时,没有把这个参数设置成True,导致,这部分的元素XML结构不可见,所以无法定位,进行成交回报验证和下一步操作。

解决方案

  1. 可以在Appium初始化时设置 把参数"enableMultiWindows": True 设置成True
caps = {"platformName": "Android","deviceName": "emulator-5554","app": "/path/to/app.apk","automationName": "UiAutomator2",  # 必须使用 UiAutomator2"enableMultiWindows": True         # 启用多窗口支持
}
  1. 但是我们使用的时测试平台,没有底层的初始话driver的操作,就不能在初始的时候去操作这个参数,所以就研究怎么在运行时去修改Appium的参数。其实Appium的代码对外暴露的有修改设置的接口driver.setSetting(Setting.WAIT_FOR_IDLE_TIMEOUT,60);,但是这个Setting的类型时一个Enum类型,在它的源码中能看到有以下几种
    IGNORE_UNIMPORTANT_VIEWS("ignoreUnimportantViews"),WAIT_FOR_IDLE_TIMEOUT("waitForIdleTimeout"),WAIT_FOR_SELECTOR_TIMEOUT("waitForSelectorTimeout"),WAIT_SCROLL_ACKNOWLEDGMENT_TIMEOUT("scrollAcknowledgmentTimeout"),WAIT_ACTION_ACKNOWLEDGMENT_TIMEOUT("actionAcknowledgmentTimeout"),KEY_INJECTION_DELAY("keyInjectionDelay"),NATIVE_WEB_TAP("nativeWebTap"),IMAGE_MATCH_THRESHOLD("imageMatchThreshold"),FIX_IMAGE_FIND_SCREENSHOT_DIMENSIONS("fixImageFindScreenshotDims"),FIX_IMAGE_TEMPLATE_SIZE("fixImageTemplateSize"),CHECK_IMAGE_ELEMENT_STALENESS("checkForImageElementStaleness"),UPDATE_IMAGE_ELEMENT_POSITION("autoUpdateImageElementPosition"),NORMALIZE_TAG_NAMES("normalizeTagNames"),IMAGE_ELEMENT_TAP_STRATEGY("imageElementTapStrategy");

其实是没有我们想要的enableMultiWindows这个参数。所以我们接着看setSetting 的底层方法

public interface HasSettings extends ExecutesMethod {default void setSetting(Setting setting, Object value) {CommandExecutionHelper.execute(this, MobileCommand.setSettingsCommand(setting, value));}default Map<String, Object> getSettings() {Map.Entry<String, Map<String, ?>> keyValuePair = MobileCommand.getSettingsCommand();Response response = this.execute((String)keyValuePair.getKey(), (Map)keyValuePair.getValue());return ImmutableMap.builder().putAll((Map)Map.class.cast(response.getValue())).build();}
}

传进来的setting是在这里使用的MobileCommand.setSettingsCommand(setting, value)
所接着看源码,看看能否自己构造一个,看下setSettingsCommand

    public static Map.Entry<String, Map<String, ?>> setSettingsCommand(Setting setting, Object value) {return new AbstractMap.SimpleEntry(SET_SETTINGS, prepareArguments((String)"settings", (Object)prepareArguments(setting.toString(), value)));}

可以看到(Object)prepareArguments(setting.toString(), value)其实就是把enum的setting给转成了string,所以我们完全可以自己传进去一个enableMultiWindows,并且把value也设置成true, 这样手动生成一个AbstractMap.SimpleEntry就行了。
所以修改完成的代码就是

CommandExecutionHelper.execute(driver,new AbstractMap.SimpleEntry<>("setSettings", prepareArguments((String)"settings", (Object)prepareArguments("enableMultiWindows", true))));

在测试代码中执行这一行,就能解决没有得到弹窗XML元素的问题。

http://www.xdnf.cn/news/580681.html

相关文章:

  • React+Taro 微信小程序做一个页面,背景图需贴手机屏幕最上边覆盖展示
  • 基于 WebRTC 的一对一屏幕共享项目(一)——项目简介
  • 深入解析Spring Boot与Redis集成:高效缓存与性能优化
  • ETL 代表什么?ETL 开发主要做什么?
  • web第六次课后作业--使用ApiFox实现请求响应操作
  • 【烧脑算法】单序列双指针:从暴力枚举到高效优化的思维跃迁
  • AJAX get请求如何提交数据呢?
  • 【NLP 77、Python环境管理工具之conda】
  • 【稳定检索|权威出版】2025年综合艺术与社会发展国际会议(ICIASD 2025)
  • 二十、面向对象底层逻辑-ServiceRegistry接口设计集成注册中心
  • 打卡第二十五天:元组和OS模块
  • flutter dart 函数语法
  • OceanBase数据库全面指南(数据操作篇DML)
  • 【Java多态】:灵活编程的核心
  • com.alibaba.fastjson2 和com.alibaba.fastjson 区别
  • Spark Streaming原理与应用
  • SpringCloud Alibaba微服务-- Sentinel的使用(笔记)
  • Spark SQL、Hive SQL运行流程解析及对比
  • macOS专业用户远程操作全场景优化指南:开发运维协同、安全合规与性能提升实战
  • GitLab 备份所有仓库(自动克隆)
  • OceanBase数据库全面指南(查询进阶篇DQL)
  • XXE(外部实体注入)
  • 创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k
  • 【Linux学习笔记】ext2文件系统的深度剖析
  • 微软CTO:AI已经“能力过剩”,行业需要努力缩小模型能力与实际产品交付之间的差距
  • rt-linux下的底层锁依赖因cgroup cpu功能导致不相干进程的高时延问题
  • 边缘计算是什么?逻辑视域下的边缘计算:分布式计算范式的理论基础与逻辑结构分析
  • SQL的RAND用法和指定生成随机数的范围
  • MySQL中InnoDB引擎逻辑存储结构、B+树索引结构、B+树高度及存储数据量
  • 从零基础到最佳实践:Vue.js 系列(8/10):《性能优化与最佳实践》