运行Appium Python脚本时出现AttributeError: 'NoneType'无to_capabilities属性
Appium脚本执行报错:AttributeError: 'NoneType' object has no attribute 'to_capabilities'
问题详情
使用Appium官网提供的示例Python脚本,已安装所有依赖且Appium服务器正常运行,但执行时触发如下错误:
C:\Users\syeda\Desktop>python test.py E ====================================================================== ERROR: test_find_battery (__main__.TestAppium.test_find_battery) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\syeda\Desktop\test.py", line 19, in setUp self.driver = webdriver.Remote(appium_server_url, capabilities) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\syeda\AppData\Local\Programs\Python\Python311\Lib\site-packages\appium\webdriver\webdriver.py", line 229, in __init__ super().__init__( File "C:\Users\syeda\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 185, in __init__ capabilities = options.to_capabilities() ^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'to_capabilities' ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (errors=1)
报错原因
这个错误是因为新版本的Appium Python客户端(v3.x及以上)与Selenium 4.x的API兼容要求变化:不再支持直接将capabilities字典作为第二个参数传给webdriver.Remote,需要使用对应自动化引擎的Options类来配置能力。
解决办法
1. 确保依赖版本兼容(可选但推荐)
先检查当前安装的包版本,确保Appium Python客户端和Selenium版本匹配:
pip list | findstr /i "appium-python-client selenium"
如果版本较低,执行升级命令:
pip install --upgrade appium-python-client selenium
2. 修改脚本代码,使用Options类配置Capabilities
将原来的capabilities字典替换为UiAutomator2Options实例,调整后的完整代码如下:
import unittest from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy from appium.options.android import UiAutomator2Options # 用Options类加载capabilities capabilities = dict( platformName='Android', automationName='uiautomator2', deviceName='Samsung S9', appPackage='com.android.settings', appActivity='.Settings', language='en', locale='US' ) options = UiAutomator2Options().load_capabilities(capabilities) appium_server_url = 'http://localhost:4723' class TestAppium(unittest.TestCase): def setUp(self) -> None: # 把options传给Remote,而不是直接传capabilities字典 self.driver = webdriver.Remote(appium_server_url, options=options) def tearDown(self) -> None: if self.driver: self.driver.quit() def test_find_battery(self) -> None: el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]') el.click() if __name__ == '__main__': unittest.main()
修改说明
- 新增导入
UiAutomator2Options类,对应Android平台的uiautomator2自动化引擎 - 通过
load_capabilities()方法将原有的capabilities字典加载到Options实例中 - 调用
webdriver.Remote时,通过options参数传入配置好的Options实例,而非直接传capabilities字典
内容的提问来源于stack exchange,提问作者Syed Aawaiz Ashraf
相关产品推荐
相关产品推荐

