我如何确保 UIAutomator2 的端口 8200..8299 在关闭 Appium 后释放?
How do I make sure ports 8200..8299 for UIAutmator2 are free'd up after killing Appium?
我 运行 Appium 24/7 在 Windows 机器上执行自动化测试。我在 Android 10 的模拟器上通过 AVD 运行 进行了这些测试。对于我的测试,我提供了正确的功能并在功能上运行得很好。但是经过几次 hours/days 我得到以下错误:
UnknownError: An unknown server-side error occurred while processing the command. Original error:*Cannot find any free port in range 8200..8299}. Please set the available port number by providing the systemPort capability or double check the processes that are locking ports within this range and terminate these which are not needed anymore at getResponseForW3CError at asyncHandler.
当我的代码被执行时,我确保 try
中的 finally
执行 AppiumDriverLocalService.stop();
方法来杀死 Appium。我的感觉是,这不会以某种方式释放 UIAutomator2 的任何端口(您可以配置,但我没有配置,通过 systemPort
功能。
} finally {
driver.closeApp();
service.stopServer();
System.exit(0);
}
为什么Appium停止服务后没有为UIAutomator2释放8000-8299范围内的任何端口?
- Android调试桥版本 1.0.40
- Appium 版本 1.20.2
- Android 10
PS 我知道 adb 命令 adb -s $UDID forward --remove-all
但这是否解决了真正的问题,我不想每次都执行 Java 进程
更新 - 修复 2-3
我已通过更改 finally
子句按顺序执行以下方法来解决此问题:
} finally {
AndroidDriver.quit();
AppiumDriverLocalService.stopServer();
为了释放端口 8200..8299,Android驱动程序必须退出,因为 UIAutomator2 链接到此。 AppiumDriverLocalService 将 kill/forward/free 这个端口和 UIAutomator2,之后我可以自由地停止服务器:
[ADB] Removing forwarded port socket connection: 8203
这个 issue 是您问题的一个很好的例子。如您所见,Appium 团队正在将其作为非错误关闭。
原因很明显:Appium 不负责管理端口,它依赖于您的系统在所需(Appium 代码)范围内有一些空闲。
systemPort
用于连接appium-uiautomator2-server,默认是8200。基本上Appium会从8200到8299中选择一个端口给appium-uiautomator2-server。但是,当你 运行 并行测试时,你必须调整端口以避免冲突。如果不是,在 99% 的情况下使用默认值应该是安全的。
重新启动系统(假设它将清除端口)和 运行 测试。在关闭会话时检查 Appium 服务器日志是否有任何错误。可能是ADB设置或权限问题,UI2服务器没有正常停止。
如果是这样,端口仍在使用中。而且它不是Appium来处理清理。我不确定您提到的 adb 命令是否是一种 100% 有保证的好方法。
我只想添加一个 shell 在 Appium 服务器开始清理 8200-8299 范围内的端口之前执行的脚本,然后忘记这个问题。
我 运行 Appium 24/7 在 Windows 机器上执行自动化测试。我在 Android 10 的模拟器上通过 AVD 运行 进行了这些测试。对于我的测试,我提供了正确的功能并在功能上运行得很好。但是经过几次 hours/days 我得到以下错误:
UnknownError: An unknown server-side error occurred while processing the command. Original error:*Cannot find any free port in range 8200..8299}. Please set the available port number by providing the systemPort capability or double check the processes that are locking ports within this range and terminate these which are not needed anymore at getResponseForW3CError at asyncHandler.
当我的代码被执行时,我确保 try
中的 finally
执行 AppiumDriverLocalService.stop();
方法来杀死 Appium。我的感觉是,这不会以某种方式释放 UIAutomator2 的任何端口(您可以配置,但我没有配置,通过 systemPort
功能。
} finally {
driver.closeApp();
service.stopServer();
System.exit(0);
}
为什么Appium停止服务后没有为UIAutomator2释放8000-8299范围内的任何端口?
- Android调试桥版本 1.0.40
- Appium 版本 1.20.2
- Android 10
PS 我知道 adb 命令 adb -s $UDID forward --remove-all
但这是否解决了真正的问题,我不想每次都执行 Java 进程
更新 - 修复 2-3
我已通过更改 finally
子句按顺序执行以下方法来解决此问题:
} finally {
AndroidDriver.quit();
AppiumDriverLocalService.stopServer();
为了释放端口 8200..8299,Android驱动程序必须退出,因为 UIAutomator2 链接到此。 AppiumDriverLocalService 将 kill/forward/free 这个端口和 UIAutomator2,之后我可以自由地停止服务器:
[ADB] Removing forwarded port socket connection: 8203
这个 issue 是您问题的一个很好的例子。如您所见,Appium 团队正在将其作为非错误关闭。
原因很明显:Appium 不负责管理端口,它依赖于您的系统在所需(Appium 代码)范围内有一些空闲。
systemPort
用于连接appium-uiautomator2-server,默认是8200。基本上Appium会从8200到8299中选择一个端口给appium-uiautomator2-server。但是,当你 运行 并行测试时,你必须调整端口以避免冲突。如果不是,在 99% 的情况下使用默认值应该是安全的。
重新启动系统(假设它将清除端口)和 运行 测试。在关闭会话时检查 Appium 服务器日志是否有任何错误。可能是ADB设置或权限问题,UI2服务器没有正常停止。
如果是这样,端口仍在使用中。而且它不是Appium来处理清理。我不确定您提到的 adb 命令是否是一种 100% 有保证的好方法。 我只想添加一个 shell 在 Appium 服务器开始清理 8200-8299 范围内的端口之前执行的脚本,然后忘记这个问题。