如何解决‘ImportError: No module named marionette_test’及Marionette会话异常
解决Marionette启动会话时的UnknownCommandException问题
你在使用Marionette驱动连接移动设备时遇到的这个异常,大概率是版本兼容、设备配置或会话初始化方式出了问题,我来分享几个实用的排查和解决思路:
1. 先搞定版本匹配问题
UnknownCommandException最常见的诱因就是marionette_driver客户端版本和设备上Firefox(或GeckoView)的服务端版本不兼容——不同版本的Firefox对Marionette命令集的支持差异很大。建议:
- 先查看设备上Firefox的具体版本(打开Firefox → 设置 → 关于Firefox)
- 安装对应大版本的marionette_driver:
比如设备上是Firefox 115.x,就安装pip install marionette_driver==<对应版本号>marionette_driver==115.*的版本。
2. 确认设备端Marionette服务已正确开启
手机上的Firefox必须开启调试模式,才能被Marionette客户端连接:
- 打开设备上的Firefox,输入
about:config,接受风险提示 - 搜索并将以下两个参数设置为
true:marionette.enableddevtools.debugger.remote-enabled
- 重启Firefox使设置生效
- 最后通过adb转发端口(Marionette默认监听设备的2828端口):
adb forward tcp:2828 tcp:2828
3. 显式指定设备Capabilities
有时候直接调用start_session()缺少必要的设备上下文信息,导致服务端无法识别命令。可以尝试添加Android设备专属的Capabilities:
from marionette_driver import By from marionette_driver import Wait from marionette import Marionette from marionette_driver import DesiredCapabilities # 配置设备专属Capabilities caps = DesiredCapabilities.FIREFOX.copy() caps["marionette"] = True caps["platformName"] = "Android" caps["deviceName"] = "你的设备名称" # 可通过`adb devices`命令获取设备标识 # 初始化客户端并启动会话 client = Marionette('localhost', port=2828, capabilities=caps) client.start_session()
4. 检查端口是否被占用
如果本地2828端口被其他进程占用,也会导致连接异常:
- Mac/Linux下查看端口占用:
lsof -i :2828 - Windows下查看端口占用:
netstat -ano | findstr :2828
杀掉占用端口的进程后,重新尝试连接即可。
调试加分项:开启详细日志
如果以上方法都没解决问题,可以开启Marionette的调试日志,获取客户端与服务端的交互细节,方便定位具体是哪个命令不被支持:
client = Marionette('localhost', port=2828, log_level="debug") client.start_session()
内容的提问来源于stack exchange,提问作者NurShomik
相关产品推荐
相关产品推荐

