将Appium从1.8.1升级到1.22.3后遇到三类技术问题求助
升级Appium至1.22.3后Windows应用自动化测试问题解决
背景
使用Appium桌面版结合Java代码做Windows应用自动化测试,已完成以下升级操作:
- 下载并安装新版Node.js
- 卸载旧版Appium,通过
npm -g appium安装1.22.3版本 - 更新WinAppDriver至v1.2.1
- Appium Doctor检测无异常
- 更新pom.xml中的依赖配置
启动服务代码
String user = System.getProperty("user.name"); AppiumDriverLocalService service = AppiumDriverLocalService.buildService(new AppiumServiceBuilder().usingDriverExecutable(new File( "C:\\Program Files\\nodejs\\node.exe")).withAppiumJS(new File( "C:\\Users\\" + user + "\\AppData\\Roaming\\npm\\node_modules\\appium\\build\\lib\\main.js")). withArgument(GeneralServerFlag.LOG_LEVEL, "warn"). withIPAddress("127.0.0.1").usingAnyFreePort()); service.start();
启动应用代码
DesiredCapabilities appCapabilities = new DesiredCapabilities(); appCapabilities.setCapability("deviceName", "WindowsPC"); appCapabilities.setCapability("app", BIN_PATH + "CathWorksUI.exe"); // 示例路径:C:\\Cathworks\\bin\\CathWorksUI.exe appCapabilities.setCapability("newCommandTimeout", 9000); appCapabilities.setCapability("automationName", "Windows"); // Windows自动化需指定为Windows而非appium appCapabilities.setCapability("platformName", "Windows"); appium = new WindowsDriver<WindowsElement>(service.getUrl(), appCapabilities);
遇到的问题及解决方案
问题1:启动服务抛出AppiumServerHasNotBeenStartedLocallyException
排查解决:
- 路径转义检查:Windows路径需用双反斜杠
\\或正斜杠/,确保Node.js和Appium主文件路径无转义错误,避免服务找不到执行文件。 - 手动验证服务:命令行执行
appium,确认服务能正常启动,排除Appium安装本身的问题。 - 权限与端口:以管理员身份运行测试代码;检查端口占用,依赖
usingAnyFreePort()确保端口可用。 - 日志排查:添加日志打印服务状态和错误信息:
if (!service.isRunning()) { System.out.println("服务启动失败,标准输出:" + service.getStdOut()); System.out.println("错误日志:" + service.getStdErr()); }
问题2:WindowsDriver实例化与声明处有错误提示
解决步骤:
- 依赖版本匹配:pom.xml中Appium Java Client版本需与Appium服务兼容(1.22.3推荐搭配Java Client 8.x版本,如8.5.1)。
- 正确导入包:
import io.appium.java_client.windows.WindowsDriver; import io.appium.java_client.windows.WindowsElement; - 规范泛型声明:将
protected static WindowsDriver<?> appium;改为protected static WindowsDriver<WindowsElement> appium;,避免通配符导致的类型不匹配。 - 验证服务URL:打印
service.getUrl()确认返回有效地址(格式应为http://127.0.0.1:端口号/wd/hub)。
问题3:findElementByAccessibilityId方法不被识别
解决方案:
Appium Java Client 8.x版本开始,旧的findElementByXXX系列方法已废弃,改用新定位方式:
- 使用
AppiumBy工具类(推荐):import io.appium.java_client.AppiumBy; // 替换原有代码 appium.findElement(AppiumBy.accessibilityId("element")); - 兼容方案(不推荐):使用Selenium原生
By类:import org.openqa.selenium.By; appium.findElement(By.accessibilityId("element"));
内容的提问来源于stack exchange,提问作者Itay Sasson
相关产品推荐
相关产品推荐

