You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:45:20