Appium新版本引发的一个问题

准备工作

测试代码

from appium import webdriver
des_cap = {'platformName': 'android'}
driver = webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',
desired_capabilities=des_cap)

测试环境

  • python 3.10,虚拟环境
  • pycharm 2018 community
  • 测试时间 2023-7-20

场景一: 默认安装 PASS

  • 在pycharm中安装appium-python-client,版本不指定,此时是2.11.1

  • 对应依赖selenium4.10.0

  • 执行示例代码

  • 测试通过

  • ??? 所以博主你要表达啥

  • 继续看下去

场景二:appium-python-client2.6.0+selenium4.10 FAIL

  • 你根据指定版本安装appium-python-client为2.6,自动安装selenium4.10

  • 执行示例代码

  • 测试失败

  • 提示如下

    D:\Appium01\venv\Scripts\python.exe D:/Appium01/demo1.py
    Traceback (most recent call last):
    File "D:\Appium01\demo1.py", line 9, in <module>
    driver = webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',
    File "D:\Appium01\venv\lib\site-packages\appium\webdriver\webdriver.py", line 230, in __init__
    super().__init__(
    TypeError: WebDriver.__init__() got an unexpected keyword argument 'desired_capabilities'

场景3:appium-python-client2.6.0+selenium4.3.0 PASS

  • 你应该是先安装selenium4.3.0
  • 然后再安装appium-python-client2.6.0
  • 都是指定版本安装
    • 有同学会说,谁会这样安装呢
    • 会的,因为你可能是先学selenium(我课程要求是4.3,最新的版本4.10的改进对我们没有太大意义,但底层确实改变了很多)
  • 测试通过

问题说明

TypeError 分析

  • 先看报错

    TypeError: WebDriver.__init__() got an unexpected keyword argument 'desired_capabilities'
  • 主要版本信息:

    • appium-python-client2.6.0
    • selenium4.10
  • 报错行

    driver = webdriver.Remote
  • Remote是个别名

     from .webdriver import WebDriver as Remote
  • 看WebDriver源码

    class WebDriver(
    webdriver.Remote,
    ActionHelpers,
    Activities,
    Applications,
    Clipboard,
    Context,
    Common,
    DeviceTime,
    Display,
    ExecuteDriver,
    ExecuteMobileCommand,
    Gsm,
    HardwareActions,
    ImagesComparison,
    IME,
    Keyboard,
    Location,
    LogEvent,
    Network,
    Performance,
    Power,
    RemoteFS,
    ScreenRecord,
    Session,
    Settings,
    Sms,
    SystemBars,
    ):
    def __init__(
    self,
    command_executor: str = 'http://127.0.0.1:4444/wd/hub',
    desired_capabilities: Optional[Dict] = None,
    browser_profile: str = None,
    proxy: str = None,
    keep_alive: bool = True,
    direct_connection: bool = True,
    extensions: Optional[List['WebDriver']] = None,
    strict_ssl: bool = True,
    options: Union[AppiumOptions, List[AppiumOptions]] = None,
    ):
  • __init__中传递了desired_capabilities没有问题

  • 继续分析堆栈

    File "D:\Appium01\venv\lib\site-packages\appium\webdriver\webdriver.py", line 230, in __init__
    super().__init__(
  • 继续看WebDriver此处源码

            super().__init__(
    command_executor=AppiumConnection(command_executor, keep_alive=keep_alive),
    desired_capabilities=desired_capabilities,
    browser_profile=browser_profile,
    proxy=proxy,
    options=options,
    )
  • 这里也有desired_capabilities,为何报错了呢

  • 请看WebDriver的继承webdriver.Remote

    class WebDriver(BaseWebDriver):
    _web_element_cls = WebElement
    _shadowroot_cls = ShadowRoot def __init__(
    self,
    command_executor="http://127.0.0.1:4444",
    keep_alive=True,
    file_detector=None,
    options: Union[BaseOptions, List[BaseOptions]] = None,
    ) -> None:
  • 到这里你发现了,这个__init__里面没有desired_capabilities

  • 注意webdriver.Remote是隶属于selenium的,你此时的selenium是4.10,升级了,可能导致它remove了一些参数

appium-python-client2.11.1+selenium4.10

  • 这是默认组合,要知道selenium也是4.10了,为何没有报错呢?

  • 其调用关系简单分析下

  • Remote__init__中,也支持desired_capabilities,但有如下信息

            # TODO: Remove the deprecated arg
    desired_capabilities: Optional[Dict] = None, if desired_capabilities is not None:
    warnings.warn(
    'desired_capabilities argument is deprecated and will be removed in future versions. '
    'Use options instead.',
    DeprecationWarning,
    )
    • 后续要移除desired_capabilities
    • 用options替代(模仿selenium)
  • 关键的问题是在于,appium-python-client2.11.1中对父类__init__的调用是不携带desired_capabilities的

            super().__init__(
    command_executor=command_executor,
    options=dst_options,
    )
  • 完整代码片段如下

    class WebDriver(
    webdriver.Remote,
    ActionHelpers,
    Activities,
    Applications,
    Clipboard,
    Context,
    Common,
    DeviceTime,
    Display,
    ExecuteDriver,
    ExecuteMobileCommand,
    Gsm,
    HardwareActions,
    ImagesComparison,
    IME,
    Keyboard,
    Location,
    LogEvent,
    Network,
    Performance,
    Power,
    RemoteFS,
    ScreenRecord,
    Session,
    Settings,
    Sms,
    SystemBars,
    ):
    def __init__(
    self,
    command_executor: Union[str, AppiumConnection] = 'http://127.0.0.1:4444/wd/hub',
    # TODO: Remove the deprecated arg
    desired_capabilities: Optional[Dict] = None,
    # TODO: Remove the deprecated arg
    browser_profile: Union[str, None] = None,
    # TODO: Remove the deprecated arg
    proxy: Union[str, None] = None,
    keep_alive: bool = True,
    direct_connection: bool = True,
    extensions: Optional[List['WebDriver']] = None,
    strict_ssl: bool = True,
    options: Union[AppiumOptions, List[AppiumOptions], None] = None,
    ):
    if strict_ssl is False:
    # pylint: disable=E1101
    # noinspection PyPackageRequirements
    import urllib3 # pylint: disable=E1101
    # noinspection PyPackageRequirements
    import urllib3.exceptions # noinspection PyUnresolvedReferences
    AppiumConnection.set_certificate_bundle_path(None)
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) if isinstance(command_executor, str):
    command_executor = AppiumConnection(command_executor, keep_alive=keep_alive) if browser_profile is not None:
    warnings.warn('browser_profile argument is deprecated and has no effect', DeprecationWarning) if proxy is not None:
    warnings.warn('proxy argument is deprecated and has no effect', DeprecationWarning) if desired_capabilities is not None:
    warnings.warn(
    'desired_capabilities argument is deprecated and will be removed in future versions. '
    'Use options instead.',
    DeprecationWarning,
    )
    # TODO: Remove the fallback after desired_capabilities removal
    dst_options = (
    AppiumOptions().load_capabilities(desired_capabilities)
    if desired_capabilities is not None and options is None
    else options
    ) super().__init__(
    command_executor=command_executor,
    options=dst_options,
    )

appium-python-client2.6.0+selenium4.3.0

  • 想必分析到此处,你应该盲猜能知道为何这个也PASS了

  • 是因为selenium的版本中webdriver.Remote中是有desired_capabilities的

    class WebDriver(BaseWebDriver):
    _web_element_cls = WebElement
    _shadowroot_cls = ShadowRoot def __init__(self, command_executor='http://127.0.0.1:4444',
    desired_capabilities=None, browser_profile=None, proxy=None,
    keep_alive=True, file_detector=None, options: Union[BaseOptions, List[BaseOptions]] = None):

总结

  • 最新版本appium-python-client即将不提供desired_capabilities的传参,但目前能用
  • 在selenium4.10中已经不支持desired_capabilities参数
  • 错误的搭配可能会引发上述问题,要么用最新的版本(默认安装),要么2个都用较低的版本
  • 留在最后的问题,那么在appium最新版中应该如何传递能力值呢?

Appium新版本引发的一个问题的更多相关文章

  1. appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator

    appium 1.7.6 不支持findElementByName(locator)  不知道为什么? 脚本中许多这样的语句,麻烦事情多了 org.openqa.selenium.InvalidSel ...

  2. Appium新版本不再支持ByName定位了怎么办

    appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...

  3. 新版appium绘制九宫格的一个注意点

    在用appium-desktop-setup-1.6.2进行app手势密码设置时,发现move_to(x, y)相对偏移量的方法用不了,绘制的手势也是乱跑 还会抛一个错误 selenium.commo ...

  4. appium环境配置和一个例子

    最近觉得appium挺火的,看了一些资料,本来想使用npm在线安装,遇见各种问题,先简单说一下: 在cmd窗口中使用命令:npm install -g appium安装,报无python的error, ...

  5. Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session

    环境: 1.Appium: 1.15.1 2.Python: 3.7.0 3.Selenium: 3.141.0 4.IDE: Pycharm 5.PC:Windows 10 问题:在 Pycharm ...

  6. Appium之启动第一个App

    搭建appium自动化环境真是各种问题呀. 如何启动在真机上启动App? 执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”. 脚本源码如下: from appium import ...

  7. “static”引发的一个错误

    昨天晚上,舍友发来一个程序,先把代码贴上:  #include<stdio.h>#define N 20short bufferA[N]={1,2,3,4,5,6,7,8,9,10,11, ...

  8. js json 与字符串 转换过程由于书写不统一规范引发的一个问题

    对于两个字符串: 字符串1:{title:{},tooltip:{trigger:"axis"},legend:{data:["新关注人数"]},calcula ...

  9. 【转】NO.2、Appium之IOS第一个demo

    接第一篇:Appium之iOS环境搭建 http://blog.csdn.net/clean_water/article/details/52946191 这个实例继承了unittest,重写了它的s ...

  10. Dubbo配置引发的一个问题--- Duplicate spring bean id

    1.原因 因项目业务需要,要调用RPC框架,项目原本已经依赖了很多RPC接口需要启动时加载,所以准备做成启动时不预加载. 就是在配置的时候加上check=false. 官方文档解释的作用,就是Dubb ...

随机推荐

  1. 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    简介 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能. 这种模式是实现了一个原型接口,该接口用于创建当前对象的 ...

  2. 快速上手Linux核心命令(七):Linux系统信息相关命令

    目录 前言 uname 显示系统信息 hostname 显示或设置系统主机名 du 统计磁盘空间使用情况 echo 显示一行文本 watch 监视命令执行情况 stat whereis 显示命令及其相 ...

  3. JS 实现关键字文本搜索 高亮显示

    示例:  利用字符串的 split 方法,通过搜索的关键字分割成数组  在利用数组的 join 方法拼接成字符串 我是利用mock的省份 1 <template> 2 <div cl ...

  4. 2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个正整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 输入:n = 20。 输出:19。

    2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 . 给你一个正整数 n ,请你返回区间 [1, n] 之间特殊整数的数目. 输入:n = 20. 输出:19. ...

  5. IDEA中GIT提交后,发现提交有误想修改提交

    问题描述:在IDEA开发工具中,使用GIT提交本地后,在push时发现有问题,想要修改提交的内容. 步骤 一:打开version control,点击log 二:找到提交记录,右键点击Undo com ...

  6. #Python 缺失值的检测与处理,检测部分

    Python  缺失值的检测与处理,分两部分笔记,第一部分是检测缺失值部分

  7. docker(一):Develop faster. Run anywhere.

    前言 在进行微服务部署时,首先需要进行部署环境的搭建.目前,Docker 已经成为了微服务部署的主流解决方案之一.Docker 可以帮助我们更快地打包.测试以及部署应用程序,从而缩短从编写到部署运行代 ...

  8. 2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是

    2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是 ...

  9. 2022-01-10:路径交叉。给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南

    2022-01-10:路径交叉.给你一个整数数组 distance . 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南 ...

  10. 2021-12-15: 路径总和 III。给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开

    2021-12-15: 路径总和 III.给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目.路径 不需要从根节点开 ...