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 # 启用多窗口支持
    }

  2. 但是我们使用的时测试平台,没有底层的初始话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元素的问题。

相关推荐
热爱编程的小白白2 小时前
【Playwright自动化】录制生成脚本
运维·自动化
陈奕昆2 小时前
n8n实战营Day3:电商订单全流程自动化·需求分析与流程拆解
大数据·开发语言·人工智能·自动化·需求分析·n8n
Hacker_Fuchen3 小时前
Postman最被低估的功能,自动化接口测试效率简直无敌
自动化测试·软件测试·自动化·lua·postman
G***E3163 小时前
前端自动化测试工具:8个主流方案对比
前端·测试工具·自动化
掌心向暖RPA自动化3 小时前
红薯图文批量OCR转文字?我实测了3种影刀RPA方案,最后一种快到飞起
经验分享·自动化·新媒体运营·影刀rpa
芝麻开门-新起点6 小时前
数据脱敏与自动化技术融合:大规模GIS数据安全高效处理方案
运维·自动化
行走正道6 小时前
【探索实战】跨云应用分发自动化实战:基于Kurator的统一交付体系深度解析
运维·自动化·wpf·kurator·跨云分发
g***727012 小时前
(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)
自动化·jenkins·maven
聚梦小课堂12 小时前
在n8n中清理单个飞书文档所有内容的方法
自动化·飞书·n8n
科普瑞传感仪器14 小时前
从轴孔装配到屏幕贴合:六维力感知的机器人柔性对位应用详解
前端·javascript·数据库·人工智能·机器人·自动化·无人机