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

无法在同一脚本中同时使用UiAutomator2与Flutter Driver求解决方案

解决Appium Flutter Driver与UiAutomator2同时初始化失败并实现文件选择

问题分析

核心问题是同一个Appium端口无法同时运行两个独立会话,你当前用4723端口同时初始化Flutter和UiAutomator2驱动,导致会话冲突启动失败。另外,无需单独启动UiAutomator2驱动,Flutter驱动支持切换到原生上下文,直接操作系统级原生元素(如文件选择器)。

解决方案

方案1:切换上下文(推荐,无需额外端口)

在Flutter驱动会话内切换到Android原生的NATIVE_APP上下文,即可操作文件选择器的原生元素,无需重新启动新驱动。

修改后的代码示例:

const opts = {
  port: 4723,
  capabilities: {
    platformName: "Android",
    'appium:deviceName': "emulator-5554",
    'appium:app': "pkgname",
    'appium:appPackage': "xxx",
    'appium:appActivity': "yyy",
    'appium:autoGrantPermissions': true,
    'appium:automationName': "Flutter"
 }
};

async function Login () {
   // 初始化Flutter驱动
   const client = await wdio.remote(opts, FlutterDriver);

   // 执行原有Flutter元素操作
   // ... 你的Flutter元素访问代码 ...

   // 切换到原生上下文
   await client.switchContext('NATIVE_APP');

   // 操作文件选择器的原生元素
   const fileElement = await client.element('id', 'com.google.android.documentsui:id/icon_thumb');
   await fileElement.click();

   // 若需返回Flutter页面,切换回Flutter上下文
   // await client.switchContext('FLUTTER');
}
Login();

方案2:使用不同端口启动第二个会话(不推荐,资源占用高)

若必须启动两个独立驱动,需给第二个驱动指定不同端口,同时启动另一个Appium服务实例:

  1. 启动第一个Appium服务(默认4723):
appium --port 4723
  1. 启动第二个Appium服务(例如4724):
appium --port 4724
  1. 修改代码中androidOptions的端口,并修正语法错误:
const androidOptions = {
  port: 4724, // 指定新端口
  capabilities: {
    platformName: "Android",
    'appium:deviceName': "emulator-5554",
    'appium:appPackage': "com.android.documentsui", 
    'appium:appActivity': ".DocumentsActivity", // 移除原代码末尾多余的单引号
    'appium:automationName': "UiAutomator2"
  }
};

关键注意事项

  • 切换上下文是更高效的方式,避免多会话的资源浪费和冲突。
  • 操作完原生元素后,若需回到Flutter页面,记得切换回FLUTTER上下文。
  • 原代码中appActivity末尾的多余单引号是潜在错误,必须修正,否则无法正常打开文件选择器。

内容的提问来源于stack exchange,提问作者Jyothi S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:03:35