Appium Service Builder启动服务失败,手动启动正常求解决方案
问题描述
手动执行终端命令appium --use-plugins execute-driver可正常启动Appium服务器,但通过Java代码的Appium Service Builder启动时遇到两个问题:
- 添加
withArgument(() ->"--use-plugins", "execute-driver")参数时,报错「Unrecognized arguments: --plugins execute-driver」 - 移除该参数后,又报错「Appium spawn npm ENOENT」
原代码如下:
AppiumDriverLocalService service = new AppiumServiceBuilder() .usingDriverExecutable(new File("//Users//ABC//.nvm//versions//node//v19.2.0//bin//node")) .withAppiumJS(new File("//Users//ABC//.nvm//versions//node//v19.2.0//lib/node_modules//appium//build//lib//main.js")) .withArgument(() ->"--use-plugins", "execute-driver") .withIPAddress("127.0.0.1").usingPort(4723).build(); service.start(); UiAutomator2Options options = new UiAutomator2Options(); options.setDeviceName("sampleDevice"); options.setApp("//Users//ABC//Documents//appiumSampleProject//src//test//java//resources//Demos-debug.apk"); AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723"),options);
解决办法
1. 修正插件参数传递方式
Appium Service Builder要求用GeneralServerFlag.USE_PLUGINS枚举传递插件参数,而非直接写字符串参数,这是导致第一个错误的核心原因。
2. 解决npm路径缺失问题
「Appium spawn npm ENOENT」错误是因为Appium无法找到npm可执行文件,需要显式指定npm路径或确保其在系统环境变量中。
修正后的完整代码
import io.appium.java_service.local.AppiumDriverLocalService; import io.appium.java_service.local.AppiumServiceBuilder; import io.appium.java_service.local.flags.GeneralServerFlag; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; import java.io.File; import java.net.MalformedURLException; import java.net.URL; public class AppiumServiceFix { public static void main(String[] args) throws MalformedURLException { // 配置npm可执行文件路径(根据你的nvm实际路径调整) File npmExecutable = new File("//Users//ABC//.nvm//versions//node//v19.2.0//bin//npm"); AppiumDriverLocalService service = new AppiumServiceBuilder() .usingDriverExecutable(new File("//Users//ABC//.nvm//versions//node//v19.2.0//bin//node")) .withAppiumJS(new File("//Users//ABC//.nvm//versions//node//v19.2.0//lib/node_modules//appium//build//lib//main.js")) // 使用枚举传递插件参数 .withArgument(GeneralServerFlag.USE_PLUGINS, "execute-driver") .withIPAddress("127.0.0.1") .usingPort(4723) // 将npm所在目录加入环境变量,解决ENOENT错误 .withEnvironment("PATH", System.getenv("PATH") + ":" + npmExecutable.getParent()) .build(); service.start(); UiAutomator2Options options = new UiAutomator2Options(); options.setDeviceName("sampleDevice"); options.setApp("//Users//ABC//Documents//appiumSampleProject//src//test//java//resources//Demos-debug.apk"); // 使用service.getUrl()替代硬编码URL,避免地址/端口不一致问题 AndroidDriver driver = new AndroidDriver(service.getUrl(), options); // 后续测试逻辑... // driver.quit(); // service.stop(); } }
额外注意事项
- 确保
execute-driver插件已安装:执行终端命令appium plugin install execute-driver - 部分Appium版本支持直接调用
.withNpmExecutable(npmExecutable)方法指定npm路径,可替代环境变量配置 - 启动服务后优先使用
service.getUrl()获取连接地址,避免硬编码带来的潜在问题
内容的提问来源于stack exchange,提问作者bucky barns
相关产品推荐
相关产品推荐

