无法在同一脚本中同时使用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服务实例:
- 启动第一个Appium服务(默认4723):
appium --port 4723
- 启动第二个Appium服务(例如4724):
appium --port 4724
- 修改代码中
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
相关产品推荐
相关产品推荐

