from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKey desired_caps = { # 被检测的手机是安卓 'platformName': 'Android', 'platformVersion': '5.1.1', # 设备名,安卓手机可以任意填写 'deviceName': 'xxx', # 启动APP Package名称(这里是微博) 'appPackage': 'com.sina.weibo', # 自动Activity,这里是微博首页 'appActivity': 'com.sina.weibo.SplashActivity', # 使用自带输入法,输入中文时填True 'unicodeKeyboard': True, # 执行完程序恢复原来的输入法 'resetKeyboard': True, # 不要重置App 'noReset': True, 'newCommandTimeout': 6000, 'automationName': 'Uiautomator2' } # 连接Appium Server,初始化自动化环境 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 设置缺省等待时间 driver.implicitly_wait(10) print(driver.page_source),报错Traceback (most recent call last): File "D:\Projects\media_crawl\weibo_auto_spider\weibo_automation.py", line 25, in <module> driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Projects\media_crawl\venv\Lib\site-packages\appium\webdriver\webdriver.py", line 236, in __init__ super().__init__( File "D:\Projects\media_crawl\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 230, in __init__ raise TypeError( TypeError: missing 1 required keyword-only argument: 'options' (instance of driver `options.Options` class)如何解决
时间: 2025-05-25 20:01:43 浏览: 70
### Appium 中 `webdriver.Remote` 初始化时出现的 `TypeError`
当使用 Python 的 Selenium WebDriver 和 Appium 进行移动端自动化测试时,如果在调用 `webdriver.Remote()` 方法时遇到如下错误:
```
TypeError: __init__() missing 1 required positional argument: 'options'
```
这通常是因为从 Selenium 版本 **4.x** 开始,`webdriver.Remote()` 需要额外提供一个名为 `'options'` 的关键字参数。此更改是为了增强浏览器配置选项的支持。
以下是解决问题的方法以及完整的代码实现[^1]:
#### 错误原因分析
Selenium 4 引入了一个新的强制性参数 `'options'`,用于传递特定于浏览器或驱动程序的配置项。即使对于 Appium 脚本(主要针对移动设备),也需要显式定义该参数并将其设置为空值或其他适当的内容。如果没有正确传入这个参数,则会触发上述类型的异常。
#### 解决方案
可以通过创建一个空的 `Options` 对象或者直接忽略它来适配 Appium 场景下的需求。下面是一个修正后的示例代码片段[^2]:
```python
from appium import webdriver
from selenium.webdriver.common.options import ArgOptions # 导入通用 Options 类
desired_caps = {
'platformName': 'Android',
'deviceName': 'emulator-5554', # 替换为实际设备名称
'appPackage': 'com.example.app',
'appActivity': '.MainActivity'
}
# 创建一个空的 Option 实例作为占位符
options = ArgOptions()
driver = webdriver.Remote(
command_executor='http://localhost:4723/wd/hub',
desired_capabilities=desired_caps,
options=options # 添加 options 参数以满足新版本的要求
)
# 执行其他操作...
driver.quit()
```
在这个例子中,我们导入了 Selenium 提供的一个基础类 `ArgOptions` 来充当所需的 `'options'` 参数角色。虽然这里并不涉及具体的桌面端浏览器行为调整,但是仍然需要填充这一字段以免报错。
另外需要注意的是,在某些情况下也可以完全省略掉单独声明变量的过程而直接在线上传递默认实例给函数调用:
```python
driver = webdriver.Remote(
command_executor='http://localhost:4723/wd/hub',
desired_capabilities=desired_caps,
options=ArgOptions() # 直接构建对象
)
```
以上两种方式均能有效规避因缺失必要参数而导致的功能障碍问题。
---
#### 注意事项
尽管当前讨论集中于如何处理新增加的关键字参数,但在设计脚本过程中还应考虑更多方面因素比如兼容不同环境版本间的差异等等.
阅读全文
相关推荐







