Appium1.22.3配置sessionOverride参数后仍报端口占用如何解决?
核心误区说明
你配置的sessionOverride: true无法解决当前的端口占用问题:
该参数仅在Appium服务已经正常启动的前提下生效,作用是允许新会话直接覆盖服务上已存在的旧会话,不会处理「上一次运行残留的Appium进程未退出、持续占用端口,导致新的服务实例根本无法启动」的场景。从你的日志可以看到,新的Appium进程在启动HTTP监听阶段就直接报
EADDRINUSE错误,服务根本没启动成功,配置的sessionOverride参数完全没有生效的机会。
排查解决步骤
- 验证残留进程问题
出现报错时先在终端执行端口查询命令(Mac环境):lsof -i :4723
如果返回结果中存在COMMAND为node的进程,就可以确认是上一次运行残留的Appium进程未退出,占用了4723端口。临时解决可以直接执行lsof -ti:4723 | xargs kill -9批量杀掉占用端口的进程,再重新运行测试即可。 - 修正测试代码的服务启停逻辑
绝大多数这类问题都是代码中只做了服务启动、driver初始化的逻辑,没有在测试收尾阶段显式关闭服务导致的:- 不要认为调用
driver.quit()就会同步关闭Appium服务:driver.quit()只会关闭当前远程会话,AppiumDriverLocalService启动的独立node进程不会随会话关闭自动退出 - 服务停止逻辑必须放在
finally代码块、或者测试框架的收尾钩子(比如TestNG的@AfterSuite、JUnit的@AfterAll、测试失败监听器)中,保证哪怕测试用例执行抛异常、中途被中断,停止逻辑也能正常执行
正确的代码结构参考:
public class AppiumTest { private AppiumDriverLocalService service; private IOSDriver driver; @BeforeSuite public void setUp() throws Exception { // 启动前先清理端口残留进程,做兜底 Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "lsof -ti:4723 | xargs kill -9"}).waitFor(); Thread.sleep(1000); // 等待端口释放 // 构建Appium服务配置 service = AppiumDriverLocalService.buildService(new AppiumServiceBuilder() .withIPAddress("127.0.0.1") .usingPort(4723) .withArgument(GeneralServerFlag.SESSION_OVERRIDE, "true")); service.start(); // 初始化driver DesiredCapabilities caps = new DesiredCapabilities(); // 补充你的测试设备、应用相关capability配置 driver = new IOSDriver(service.getUrl(), caps); } @Test public void testCase() { // 你的测试业务逻辑 } @AfterSuite public void tearDown() { // 先关driver会话,再关服务 if (driver != null) { driver.quit(); } if (service != null && service.isRunning()) { service.stop(); } } } - 不要认为调用
- 排查手动启动的服务冲突
检查运行测试前是否手动启动过Appium Desktop客户端、或者在其他终端窗口通过命令行启动了Appium服务,手动启动的服务会持续占用4723端口,和Java代码中自动启动的服务产生冲突,跑自动化测试前需要手动关闭所有独立启动的Appium进程。
内容的提问来源于stack exchange,提问作者SuryaKiran Reddy Edula
相关产品推荐
相关产品推荐

