Appium相关:uiautomatorviewer捕获类Instagram故事页截图报错如何解决
报错信息:Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
可行解决方案
无需启动Appium的操作步骤(优先尝试)
- 先暂停动态页面刷新:Instagram故事、WhatsApp状态类页面默认会自动轮播、定时跳转,长按页面即可触发暂停,停止UI自动更新后再执行uiautomatorviewer捕获操作,可解决绝大多数动态页面捕获失败问题
- 延长uiautomatorviewer捕获延迟:找到uiautomatorviewer启动脚本(Windows为
uiautomatorviewer.bat,Mac/Linux为同级目录下的uiautomatorviewer可执行脚本),编辑脚本中的Java启动参数,在末尾追加-Dcom.android.uiautomatorviewer.captureDelay=3000,单位为毫秒,设置3秒足够你切换到目标App页面等待捕获完成 - 修复adb连接异常:先执行
adb devices确认测试设备处于在线状态,若连接异常执行adb kill-server && adb start-server重启adb服务后再次尝试 - 手动导出布局和截图:uiautomatorviewer捕获失败的情况下,可直接用adb命令导出所需内容:
- 执行
adb shell screencap -p /sdcard/current_page.png截取当前页面截图 - 执行
adb shell uiautomator dump /sdcard/ui_layout.xml导出当前UI层级文件 - 分别执行
adb pull /sdcard/current_page.png ./和adb pull /sdcard/ui_layout.xml ./将文件导出到本地,手动导入uiautomatorviewer即可查看
- 执行
- 绕过防截图限制:如果App开启了FLAG_SECURE防截屏配置,可使用测试包(debug版本)或者root过的测试设备,关闭安全限制后再执行捕获
启动Appium后的捕获方案
如果已经搭建好Appium环境,启动服务后按以下配置操作即可稳定捕获:
- 初始化driver时在desiredCapabilities中添加如下配置:
关闭动画、延长超时时间,避免动态页面加载超时"automationName": "UiAutomator2", "uiautomator2ServerLaunchTimeout": 10000, "disableWindowAnimation": true - 需要捕获故事/状态页时,先调用
driver.pause(3000)暂停脚本执行,手动切换到目标页面,之后执行driver.getPageSource()即可获取完整UI层级,执行driver.getScreenshotAs(OutputType.FILE)即可获取对应截图
异常排查
调整参数后还是捕获失败?
确认目标页面是否为WebView、Flutter等跨平台框架渲染:WebView需要开启webview调试模式才能被uiautomator识别,Flutter页面需要使用Appium Flutter驱动才能获取到完整布局,原生uiautomatorviewer无法直接识别跨平台框架渲染的自定义控件。
内容的提问来源于stack exchange,提问作者rakeshsahu59
相关产品推荐
相关产品推荐

