You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WDIO中实现跨设备多应用串联自动化测试及问题解决

解决WDIO Multiremote多设备交互测试问题

场景概述

拥有真实设备:

  • MOT:基于React的Android/iOS移动下单应用(WebView上下文)
  • POS:iPad上的iOS原生收银应用(native_app上下文)

测试目标:单流程中先操作MOT,再操作POS,验证数据同步,采用POM模式。

问题分析

  1. 配置文件定义多设备capabilities后无法使用driver.getInstance():TypeScript类型匹配错误,默认driver类型为单实例Browser,而multiremote场景下应为MultiremoteBrowser,导致类型校验失败。
  2. 测试用例中直接声明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一致。

额外适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:55