React Native E2E测试:如何通过WebDriverIO+Appium自动启动Android模拟器?
实现Android模拟器自动启动的方案
背景
我正在使用Appium + WebDriverIO为React Native应用运行E2E测试。iOS平台运行测试时系统会自动启动指定模拟器,但Android平台必须手动启动模拟器后才能执行测试。
执行命令:
npx wdio run wdio.conf.js
当前wdio.conf.js配置:
export const config = { capabilities: [ // Android { platformName: "Android", app: "./path/to/apk/app-debug.apk", deviceName: "Pixel_4_API_30", platformVersion: "11.0", }, // iOS { platformName: "iOS", automationName: "XCUITest", deviceName: "iPhone 11", platformVersion: "13.5", app: "./path/to/app/My App Name.app", }, ], // ... };
其中Android的deviceName(Pixel_4_API_30)来自emulator -list-avds输出,运行环境为MacOS。
解决方案
方法一:通过Appium配置自动启动AVD
在Android的capabilities中添加以下配置项,让Appium自动启动指定模拟器:
// Android capabilities 新增配置 { platformName: "Android", app: "./path/to/apk/app-debug.apk", deviceName: "Pixel_4_API_30", platformVersion: "11.0", automationName: "UiAutomator2", // 明确指定自动化驱动,确保兼容性 avd: "Pixel_4_API_30", // 填写要启动的AVD名称,与deviceName一致即可 avdLaunchTimeout: 120000, // 可选:设置启动超时时间,单位毫秒,默认60000 avdReadyTimeout: 120000, // 可选:设置模拟器就绪超时时间,单位毫秒,默认60000 }
添加后,Appium会在测试前自动调用emulator -avd Pixel_4_API_30启动模拟器,无需手动操作。
方法二:通过WebDriverIO钩子函数手动启动模拟器
如果方法一不生效,可以在wdio.conf.js的beforeSession钩子中添加启动模拟器的逻辑:
import { execSync } from 'child_process'; export const config = { // ... 其他配置 beforeSession: (config, capabilities, specs) => { // 仅在Android测试时执行启动逻辑 if (capabilities.platformName === 'Android') { try { // 检查模拟器是否已运行 execSync('adb devices | grep emulator'); } catch (err) { // 未运行则启动指定AVD execSync('emulator -avd Pixel_4_API_30 -no-boot-anim -no-window', { stdio: 'ignore' }); // 等待模拟器完全启动就绪 execSync('adb wait-for-device shell "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done"'); } } }, // ... 其他钩子 };
-no-boot-anim:关闭启动动画,加快启动速度-no-window:可选参数,适合CI环境,不显示模拟器窗口- 最后的shell命令确保模拟器完成系统启动后再执行测试
注意事项
- 确保
emulator和adb命令已加入系统环境变量,MacOS下可检查~/.zshrc或~/.bash_profile是否配置了Android SDK路径:export ANDROID_HOME=$HOME/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/emulator export PATH=$PATH:$ANDROID_HOME/platform-tools - 确认AVD名称正确,可通过
emulator -list-avds命令验证 - 若遇到启动超时,可适当调大
avdLaunchTimeout和avdReadyTimeout的数值
内容的提问来源于stack exchange,提问作者twiz
相关产品推荐
相关产品推荐

