使用Appium 5.0.0-beta01&Selenium4.0.1实现.NET安卓自动化并行执行求助
.NET环境下基于Appium 5.0.0-beta01与Selenium 4.0.1实现安卓自动化并行执行方案
问题1:多Appium服务启动后实例化Android Driver报错
报错核心原因
你提供的代码存在两个格式错误,导致Appium服务无法正确识别配置:
- 参数使用了中文全角引号,会被解析为无效字符
–base-path使用了单长破折号,Appium要求参数前缀为双短破折号--
修正后的实现代码
// 修正参数格式:使用英文半角引号和标准双短破折号 var args = new OptionCollector().AddArguments(new KeyValuePair<string, string>("--base-path", "/wd/hub")); _appiumLocalService = new AppiumServiceBuilder() .WithIPAddress("127.0.0.1") .UsingAnyFreePort() .WithArguments(args) .Build(); // 确保服务启动成功后再初始化Driver _appiumLocalService.Start(); if (!_appiumLocalService.IsRunning) { throw new InvalidOperationException("Appium服务启动失败"); } // 并行执行必须为每个Driver配置唯一设备UDID,避免会话冲突 appiumOptions.AddAdditionalAppiumOption("udid", "<对应设备的UDID>"); // 直接传入服务EndpointUri,可避免会话识别异常 AndroidDriver _androidDriver = new AndroidDriver( new Uri(_appiumLocalService.ServiceUrl), appiumOptions, TimeSpan.FromSeconds(120));
额外注意事项
- 并行场景下,每个Appium服务对应的AndroidDriver必须绑定唯一设备UDID,可通过
adb devices命令获取已连接设备的UDID列表 - 若仍出现会话问题,可检查Appium服务日志,确认
--base-path参数是否被正确加载
问题2:程序化启动多模拟器并集成Appium服务
C#中没有官方封装的AndroidDebugBridge类,但可以通过调用adb/emulator命令行工具实现,核心是用Process类执行系统命令:
实现步骤
- 获取可用模拟器列表
// 执行emulator命令获取AVD列表 var process = new Process { StartInfo = new ProcessStartInfo { FileName = "emulator", Arguments = "-list-avds", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; process.Start(); string avdList = process.StandardOutput.ReadToEnd(); process.WaitForExit(); // 解析输出得到AVD名称数组 string[] avds = avdList.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
- 启动指定模拟器
每个模拟器需使用独立端口(默认从5554开始,步长为2),避免端口冲突:
// 启动第一个模拟器,端口设为5554 string avdName = avds[0]; var emulatorProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "emulator", Arguments = $"-avd {avdName} -port 5554 -no-snapshot-load", UseShellExecute = false, CreateNoWindow = true } }; emulatorProcess.Start();
- 等待模拟器启动完成
通过adb命令确认设备就绪:
// 等待模拟器设备上线 var adbProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "adb", Arguments = "wait-for-device", UseShellExecute = false, CreateNoWindow = true } }; adbProcess.Start(); adbProcess.WaitForExit(); // 验证设备是否可用 var devicesProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "adb", Arguments = "devices", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true } }; devicesProcess.Start(); string devicesOutput = devicesProcess.StandardOutput.ReadToEnd(); if (!devicesOutput.Contains("emulator-5554")) { throw new InvalidOperationException("模拟器启动失败"); }
- 绑定Appium服务与模拟器
为该模拟器对应的Appium服务配置UDID参数:
appiumOptions.AddAdditionalAppiumOption("udid", "emulator-5554");
测试完成后的清理
执行命令关闭模拟器:
var killProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "adb", Arguments = "-s emulator-5554 emu kill", UseShellExecute = false, CreateNoWindow = true } }; killProcess.Start(); killProcess.WaitForExit();
内容的提问来源于stack exchange,提问作者vpApp
相关产品推荐
相关产品推荐

