C#程序迁移至PC后无法连接Appium,报请求资源未找到错误
我在笔记本电脑上运行C#编写的Appium自动化代码一切正常,但迁移到台式机后无法运行。已在台式机上安装Appium、Java及Android SDK,运行时抛出以下错误:
OpenQA.Selenium.WebDriverException: 'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource'
相关代码
public bool ConnectAppium() { for (int i = 0; i < 5; i++) { try { DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); desiredCapabilities.SetCapability("platformName", "Android"); desiredCapabilities.SetCapability("platformVersion", this.Resutl("shell getprop ro.build.version.release").Replace("\r\n", "")); desiredCapabilities.SetCapability("deviceName", this._driver); desiredCapabilities.SetCapability("systemPort", this._port + 4000); desiredCapabilities.SetCapability("udid", this._driver); desiredCapabilities.SetCapability("devicePort", this._port); desiredCapabilities.SetCapability("noReset", true); desiredCapabilities.SetCapability("disableWindowAnimation", true); desiredCapabilities.SetCapability("gpsEnabled", true); desiredCapabilities.SetCapability("skipLogcatCapture", true); desiredCapabilities.SetCapability("dontStopAppOnReset", true); desiredCapabilities.SetCapability("ignoreHiddenApiPolicyError", true); desiredCapabilities.SetCapability("noSign", false); desiredCapabilities.SetCapability("newCommandTimeout", 36000); string resutl = TLExecute.CMD("netstat -an |find /i \"listening\""); bool flag = !resutl.Contains(this._port.ToString()); if (flag) { new Task(delegate () { Process process = Process.Start(new ProcessStartInfo { FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + "\\System32\\cmd.exe", WorkingDirectory = Application.StartupPath, Arguments = "/c appium --port " + this._port.ToString(), CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, RedirectStandardOutput = true, UseShellExecute = false, Verb = "runas", RedirectStandardError = true }); process.StandardOutput.ReadToEnd(); }).Start(); for (int j = 0; j < 5; j++) { Thread.Sleep(TimeSpan.FromSeconds(1.0)); resutl = TLExecute.CMD("netstat -an |find /i \"listening\""); bool flag2 = resutl.Contains(this._port.ToString()); if (flag2) { break; } } } this.remoteWebDriver = new RemoteWebDriver(new Uri("http://127.0.0.1:" + this._port.ToString() + "/wd/hub"), desiredCapabilities); this.remoteWebDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10.0); return true; } catch { } } return false; }
排查与解决步骤
确认Appium命令可执行性
台式机可能未将Appium加入系统环境变量,导致cmd无法直接调用appium命令。需改用Appium的完整启动路径,比如:C:\Program Files\Appium\resources\app\node_modules\.bin\appium.cmd --port 你的端口号路径根据实际安装位置调整。同时,代码中
process.StandardOutput.ReadToEnd()会阻塞线程,导致Appium服务器未完全启动就发起连接,建议移除该行或改用异步读取逻辑。校验DesiredCapabilities参数
- 手动执行
adb shell getprop ro.build.version.release,确认能返回有效Android版本号,确保ADB可正常连接设备。 - 通过
adb devices查看台式机连接的设备UDID,确认this._driver的值与实际UDID一致(代码中deviceName和udid都用了这个变量)。 - 检查
systemPort和devicePort是否被其他程序占用,建议systemPort使用8200-8299范围内的端口,避免冲突。
- 手动执行
统一版本兼容性
台式机的Appium版本可能与笔记本不一致,不同Appium版本对Selenium.WebDriver的版本要求不同。需确保两台机器的Appium版本、Selenium.WebDriver NuGet包版本完全一致。验证ADB环境配置
确认Android SDK的platform-tools目录已加入系统环境变量,在CMD中执行adb version,若能正常返回版本信息则配置正确,否则需添加环境变量。查看Appium服务器日志
修改代码中启动Appium的配置,将CreateNoWindow设为false、WindowStyle设为ProcessWindowStyle.Normal,直接查看服务器启动日志,排查是否存在依赖缺失、权限不足或其他启动错误。
内容的提问来源于stack exchange,提问作者Vũ Duy Huy

