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. win10 双开微信 微信双开

    方法1:鼠标连续点击实现Windows微信双开在桌面上找到微信图标,鼠标左键连续点击2次为打开一个微信,连续点击8次就打开了4个微信. 注意:不要连续点开太多防止卡顿. 方法2:回车键双击微信图标实现 ...

  2. 使用RAMMap+PoolMon分析Windows内存异常使用问题

    由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢. 1 RAMMap和PoolMon工具简介 RAMMap和PoolMon都是微软Sysinternals的工具,前者可以从使 ...

  3. TensorFlow - 框架实现中的三种 Graph

    文章目录 TensorFlow - 框架实现中的三种 Graph 1. Graph 2. GraphDef 3. MetaGraph 4. Checkpoint 5. 总结 TensorFlow - ...

  4. [Pytorch框架] 5.1 kaggle介绍

    文章目录 5.1 kaggle介绍 5.1.1 Kaggle 平台简介 比赛介绍 5.1.2 Kaggle板块介绍 Data Rules Team Kernels Discussion Leaderb ...

  5. 希望所有计算机学生能看到这篇c语言教程

    大部分程序员走入编程世界第一个学习的语言就是C语言. 作为一门古老的编程语言,c语言拥有48年的发展历程. 为什么要学习 C语言? C语言是学习计算机程序设计语言的入门语言.最全面的编程面试网站 C语 ...

  6. 安装anaconda遇到的一些问题

    文章目录 前言 一.报错:jupyter notebook:Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100 ...

  7. AutoGPT:有手就会的安装教程

    AutoGPT 是什么 Auto-GPT 是一个实验性开源应用程序,展示了 GPT-4 语言模型的功能.该程序由 GPT-4 驱动,将 LLM 的"思想"链接在一起,以自主实现您设 ...

  8. Python_16 session、cookie 鉴权

    一.查缺补漏 1. pprint https://www.cnblogs.com/yjybupt/p/10669988.html https://www.cnblogs.com/wongbingmin ...

  9. thinkphp常量定义

    是已经封装好的系统常量 主要是用在控制器下面的动作当中 这样能很大的提高我们的开发效率主要有下面的一些     手册上面都有的     __ROOT__ 网站的根目录     __APP__ 代表项目 ...

  10. 雪球 app 实战(1)

    开头 因为理论篇结束之后,需要一个实战,估选用了雪球app作为一个作业 业务场景: 雪球 app 自选设置(入口位于 行情 模块) 作业内容 使用 百度脑图 编写 思维导图 [自选设置]模块的测试用例 ...