如何在Detox测试中使用adb shell命令及操作UI设置、导入图片?
Detox E2E测试常见问题解决方案
1. 在Detox中使用adb shell命令
你代码里报错"child不存在",是因为没引入child_process模块。另外原生exec是回调式,直接用会导致测试时序混乱,建议转成异步函数使用。
修正后的代码示例:
const { exec } = require('child_process'); const util = require('util'); // 把回调式exec转成Promise异步版本 const execAsync = util.promisify(exec); it('TC-30: WIFI', async () => { // 异步执行adb命令开启飞行模式 await execAsync('adb shell cmd connectivity airplane-mode enable'); // 等待系统设置生效,加短延迟避免后续操作提前执行 await new Promise(resolve => setTimeout(resolve, 2000)); await element(by.label('Violation №1')).tap(); const errorMessage = 'no connection'; // waitFor必须加await和超时时间,确保等待逻辑生效 await waitFor(element(by.label(errorMessage))).toBeVisible().withTimeout(10000); });
关键要点:
- 必须引入
child_process模块的exec方法,或用util.promisify转成异步函数 - 执行adb命令后加适当延迟,等待系统设置完成切换
waitFor要配合await和withTimeout,否则不会等待元素出现
2. 直接在E2E测试中操作UI设置
Detox没有原生操作系统设置UI的API,可通过两种方式实现:
方式一:用adb命令直接修改(推荐,高效)
就是上面第一点的方法,直接通过adb命令修改系统设置,无需操作UI。
方式二:模拟用户手动操作设置UI
如果必须通过UI路径操作,可通过Detox定位系统设置APP的元素:
it('通过UI开启飞行模式', async () => { // 打开系统设置APP(包名一般为com.android.settings) await device.launchApp({ appId: 'com.android.settings', newInstance: true }); // 定位"网络和互联网"选项(文本根据系统语言调整) await element(by.text('网络和互联网')).tap(); // 点击飞行模式开关(元素id需通过uiautomatorviewer确认) await element(by.id('airplane_mode_switch')).tap(); // 返回原测试APP await device.launchApp({ appId: '你的APP包名', newInstance: false }); // 后续测试步骤 });
注意:
- 系统设置的元素文本、id会因Android版本、语言不同变化,需自行用uiautomatorviewer定位
- 用
device.launchApp切换APP时,newInstance: false可回到之前的APP实例
3. 打开相册后导入图片
Detox提供device.uploadFile方法上传本地图片到设备,再通过UI选择:
代码示例:
it('从相册导入图片', async () => { // 把本地测试图片上传到设备的Download目录 await device.uploadFile('./test/assets/test-image.jpg', '/sdcard/Download/test-image.jpg'); // 点击APP内的选择图片按钮 await element(by.id('select-image-btn')).tap(); // 定位到上传的图片(文本为文件名,根据实际UI调整) await element(by.text('test-image.jpg')).tap(); // 确认选择(如果有确认按钮) await element(by.id('confirm-btn')).tap(); // 验证图片是否成功导入 await expect(element(by.id('image-preview'))).toBeVisible(); });
关键要点:
- 测试前需给APP授予存储权限:
adb shell pm grant 你的APP包名 android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE - 文件选择器的元素定位需根据设备系统UI调整,部分设备需先进入对应相册文件夹
- iOS设备路径逻辑类似,上传到沙盒目录后操作相册UI即可
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

