Robot Framework+Appium测试录屏求助:遇无效会话ID错误
解决Robot Framework + Appium iOS测试录屏的Invalid Session ID问题
我之前做Appium+Robot Framework的iOS自动化测试时也踩过类似的坑,你遇到的核心问题是自定义库中的全局driver实例和Robot测试会话不匹配,导致调用录屏API时触发无效会话ID错误。下面给你分享具体的解决思路和修正方案:
问题根源分析
你代码里的driver是在库的全局作用域初始化的,但Robot Framework的测试流程中,Appium会话应该是在测试用例内部通过Open Application关键字启动的。库加载时初始化的driver早就在测试会话开始前失效了,或者根本和当前测试的会话不是同一个实例,所以调用start_recording_screen()时自然会报NoSuchDriverError。
修正后的自定义库代码
正确的做法是动态获取Robot Framework中AppiumLibrary维护的当前有效driver实例,而不是自己全局初始化。下面是修改后的代码:
import os import base64 from robot.api import logger from robot.libraries.BuiltIn import BuiltIn def start_screen_recording(): # 从AppiumLibrary中获取当前活跃的应用driver appium_lib = BuiltIn().get_library_instance('AppiumLibrary') current_driver = appium_lib._current_application() # 启动录屏(iOS平台Appium会自动处理录屏逻辑) current_driver.start_recording_screen() logger.info("Screen recording started successfully") def stop_screen_recording(filename="screen_recording.mp4"): # 同样获取当前有效driver appium_lib = BuiltIn().get_library_instance('AppiumLibrary') current_driver = appium_lib._current_application() # 优先使用Robot内置的输出目录变量,更灵活适配不同环境 output_dir = BuiltIn().get_variable_value('${OUTPUT_DIR}') if not output_dir: output_dir = "/Users/keo.sidara/Desktop/Mobile_Test/testcases/regression" filepath = os.path.join(output_dir, filename) logger.info(f"Preparing to save recording to: {filepath}") # 停止录屏并解码保存为MP4文件 recording_payload = current_driver.stop_recording_screen() with open(filepath, "wb") as file: file.write(base64.b64decode(recording_payload)) logger.info(f"Screen recording saved to: {filepath}")
测试用例中的使用方式
在Robot测试用例里,你需要先通过AppiumLibrary启动会话,再调用自定义库的录屏方法,示例如下:
*** Settings *** Library AppiumLibrary Library CustomScreenRecordingLibrary # 导入你的自定义录屏库 *** Test Cases *** Demo Screen Recording Test # 先启动Appium会话(参数根据你的设备/应用实际情况调整) Open Application http://localhost:4723/wd/hub ... platformName=iOS ... platformVersion=12.3.2 ... bundleId=xxxxxx ... udid=xxxxxxx ... deviceName=iPhone # 开始录屏 Start Screen Recording # 执行你的测试步骤(示例:点击元素、输入文本) Click Element id=test_button Input Text id=test_input hello@example.com # 停止录屏,用测试名称+时间戳命名避免文件覆盖 Stop Screen Recording screen_recording_${TEST NAME}_${TIMESTAMP}.mp4 # 关闭应用会话 Close Application
额外排查要点
- Appium服务状态:确保运行测试前已经启动Appium服务(终端执行
appium命令,确认没有报错信息)。 - 版本兼容性:iOS 12.3.2建议搭配Appium 1.22.x版本(过高或过低的Appium版本可能和iOS版本不兼容,导致会话异常)。
- 设备权限:确认你的测试设备已经信任电脑,并且Appium能正常识别到设备(可以用
idevice_id -l命令检查udid是否正确)。
内容的提问来源于stack exchange,提问作者Sidara KEO
相关产品推荐
相关产品推荐

