Robot Framework搭配Appium在AWS Device Farm中Swipe/Scroll关键字失效求助
报错根因定位
AttributeError: 'WebDriver' object has no attribute 'w3c' 报错与AWS区域政策限制无关,本质是测试环境依赖版本不兼容:
- AWS Device Farm真机环境默认预装的Appium Server、Selenium、Appium Python客户端版本普遍低于本地开发环境,旧版本依赖未适配W3C动作协议,缺少对应的
w3c对象属性 - AppiumLibrary原生
Scroll、Swipe关键字在高版本中默认基于W3C动作协议实现,调用时会主动访问WebDriver的w3c属性,旧环境下就会触发属性缺失报错 - 本地模拟器运行正常是因为本地环境已经安装了适配W3C标准的高版本依赖,接口匹配
修复方案
按实施优先级从高到低排列:
1. 替换原生滑动关键字,使用跨版本兼容的接口实现
放弃使用AppiumLibrary自带的Scroll、Swipe关键字,直接封装自定义滑动关键字调用移动端内置脚本接口,新旧版本Appium均可兼容:
*** Keywords *** 通用向上滑动 [Arguments] ${duration}=1000 ${win_size} Get Window Size ${start_x} Evaluate ${win_size['width']} * 0.5 ${start_y} Evaluate ${win_size['height']} * 0.8 ${end_y} Evaluate ${win_size['height']} * 0.2 # 安卓设备用下方调用 Execute Script mobile: swipe ${{ {'left': ${start_x}, 'top': ${start_y}, 'width': 0, 'height': ${start_y} - ${end_y}, 'duration': ${duration}} }} # iOS设备替换上方调用为:Execute Script mobile: dragFromToForDuration ${{ {'fromX': ${start_x}, 'fromY': ${start_y}, 'toX': ${start_x}, 'toY': ${end_y}, 'duration': ${duration}/1000} }}
2. 锁定依赖版本对齐本地环境
将测试环境依赖与本地正常运行的版本完全对齐,避免AWS默认安装的低版本依赖导致兼容问题:
- 本地执行
pip freeze > requirements.txt导出当前可用的依赖版本列表 - 将
requirements.txt放在测试包根目录一起上传到AWS Device Farm,平台会优先安装你指定的依赖版本 - 无本地版本参考的情况下,可直接锁定以下兼容版本组合:
- Appium-Python-Client <= 2.6.0
- Selenium <= 4.5.0
- robotframework-appiumlibrary <= 2.0.0
3. 强制关闭W3C模式兼容旧协议
在测试启动的Desired Capabilities中添加以下参数,强制Appium走旧版JSONWP协议,无需访问w3c属性即可运行滑动操作:
{ "w3c": false, "forceMjsonwp": true }
附加说明
- 要获取AWS Device Farm当前环境的ChromeDriver版本,可在测试用例开头添加逻辑:
Execute Script print(driver.capabilities.get('chromeDriverVersion')),运行后从测试日志中即可读取对应版本 - AWS支持自定义ChromeDriver,可将适配版本的ChromeDriver打包到测试包内,在Capabilities中通过
chromedriverExecutable参数指定包内路径即可完成配置
内容的提问来源于stack exchange,提问作者Esa Wirta
相关产品推荐
相关产品推荐

