如何使用CodeceptJS Appium测试安卓iOS拍照录像或模拟预存媒体
CodeceptJS+Appium 拍照/录像功能测试方案
一、拍照后确认/取消按钮无法操作问题解决
- 核心原因:触发拍照后当前界面切换为系统相机应用的原生界面,需要针对系统相机的UI元素做定位操作,不同厂商/系统版本的相机元素定位符存在差异,需要提前用Appium Inspector抓取对应元素的resource-id/xpath。
- 操作步骤:
- 触发拍照后先加显性等待,确保相机界面完全加载
- 直接通过底层driver定位相机的确认/取消按钮即可,以小米MIUI系统为例示例代码:
const driver = await appium.getDriver() // 触发拍照 await driver.sendDeviceKeyEvent(27) // 等待相机确认按钮加载,最长等待5秒 await driver.waitForElementByAndroidUIAutomator('new UiSelector().resourceId("com.android.camera:id/done_button")', 5000) // 点击确认按钮 await driver.elementByAndroidUIAutomator('new UiSelector().resourceId("com.android.camera:id/done_button")').click() // 如果要点击取消就替换resourceId为com.android.camera:id/cancel_button
- 注意事项:如果是iOS设备,系统相机的确认按钮accessibility id一般为
Use Photo,直接定位该元素即可。
二、模拟调用预存照片/视频测试方案
该方案不需要操作相机实时拍摄,稳定性更高,适合自动化测试场景:
- 操作步骤:
- 提前准备好测试用的照片/视频文件,存放在测试执行机器的本地目录
- 测试开始前通过adb命令将媒体文件推送到设备的相册目录,同时触发系统相册刷新,示例代码:
// 执行adb推送文件到设备DCIM目录,替换本地文件路径和设备路径即可 await appium.executeShell('adb push /本地测试文件路径/test.jpg /sdcard/DCIM/test.jpg') // 发送广播刷新相册,让系统识别到新推送的媒体文件 await appium.executeShell('adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/test.jpg')
- 后续触发App的选图/选视频操作时,直接定位对应预存的测试文件选择即可。
- 注意事项:需要在启动Appium服务时添加
--allow-insecure=adb_shell参数,才有权限执行adb shell命令。
内容的提问来源于stack exchange,提问作者Kyryl Zotov
相关产品推荐
相关产品推荐

