如何在WDIO中实现跨设备多应用串联自动化测试及问题解决
解决WDIO Multiremote多设备交互测试问题
场景概述
拥有真实设备:
- MOT:基于React的Android/iOS移动下单应用(WebView上下文)
- POS:iPad上的iOS原生收银应用(native_app上下文)
测试目标:单流程中先操作MOT,再操作POS,验证数据同步,采用POM模式。
问题分析
- 配置文件定义多设备capabilities后无法使用
driver.getInstance():TypeScript类型匹配错误,默认driver类型为单实例Browser,而multiremote场景下应为MultiremoteBrowser,导致类型校验失败。 - 测试用例中直接声明multiremote出现连接拒绝:
ECONNREFUSED 127.0.0.1:4444,核心原因是未启动对应端口的Appium服务,或服务配置与代码不匹配。
正确实现步骤
1. 正确配置wdio.config.ts的Multiremote Capabilities
直接在配置文件中定义多设备capabilities,WDIO会自动启动多设备会话,无需在测试用例中手动创建实例:
// wdio.config.ts export const config: WebdriverIO.Config = { // 基础配置(specs路径、framework类型等) services: [ ['appium', { // 自动启动Appium服务,指定端口(默认4723) args: { port: 4723, allowInsecure: 'chromedriver_autodownload' // 适配Android WebView的chromedriver自动下载 }, command: 'appium' }] ], capabilities: { motAndroid: { capabilities: { platformName: 'Android', 'appium:platformVersion': '13', 'appium:deviceName': 'samsung xxx...', 'appium:automationName': 'UIAutomator2', 'appium:app': androidMotAppPath, 'appium:autoWebview': true, 'appium:noReset': true, } }, posMain: { capabilities: { platformName: 'iOS', 'appium:platformVersion': '15.3', 'appium:deviceName': 'iPad Air (5th generation)', 'appium:automationName': 'XCUITest', 'appium:app': posApp, 'appium:noReset': true, 'appium:autoWebview': false, 'appium:bundleId': 'com.xxx.xxxx', 'appium:xcodeSigningId': 'iPhone Developer', 'appium:udid': 'xxx...', 'appium:xcodeOrgId': 'xxx...', } } }, // 其他配置(如reporters、timeout等) }
2. 修复TypeScript类型问题,正确获取设备实例
在测试文件中,将driver断言为MultiremoteBrowser类型,即可正常使用getInstance()方法:
// 测试用例文件 import { MultiremoteBrowser } from 'webdriverio'; describe('多设备数据同步测试', () => { it('MOT下单后验证POS端同步', async () => { // 类型断言为多实例浏览器 const multiDriver = driver as unknown as MultiremoteBrowser; // 操作MOT设备(WebView上下文) const motAndroid = multiDriver.getInstance('motAndroid'); // 等待WebView加载完成(避免autoWebview未及时切换) await motAndroid.waitUntil( async () => (await motAndroid.getContext()).includes('WEBVIEW'), { timeout: 10000, timeoutMsg: '未切换到WebView上下文' } ); // 执行下单操作(示例,可替换为POM方法) await motAndroid.$('#submit-order').click(); // 操作POS设备(原生上下文) const posMain = multiDriver.getInstance('posMain'); await posMain.setContext('NATIVE_APP'); // 验证订单是否同步(示例) const newOrder = await posMain.$('~new-order-item'); await expect(newOrder).toBeDisplayed(); }); });
3. 解决连接拒绝问题
- 自动启动Appium服务:通过WDIO的
appium服务配置,启动命令会自动拉起Appium服务,无需手动操作。 - 手动启动验证:若需手动启动,执行命令
appium --port 4723,并访问http://127.0.0.1:4723/wd/hub/status,返回JSON则服务正常。 - 设备前置检查:
- Android设备:确保开启USB调试,执行
adb devices能识别设备。 - iOS设备:确保已信任电脑,Xcode签名、UDID配置与capabilities一致。
- Android设备:确保开启USB调试,执行
额外适配POM模式
在POM类中接收设备实例作为参数,实现多设备复用:
class MotPage { private driver: WebdriverIO.Browser; constructor(driver: WebdriverIO.Browser) { this.driver = driver; } async submitOrder() { await this.driver.$('#submit-order').click(); } } // 测试用例中调用 const motPage = new MotPage(motAndroid); await motPage.submitOrder();
内容的提问来源于stack exchange,提问作者Mikhail Yesipchuk
相关产品推荐
相关产品推荐

