首页 > 其他分享 >Appium新版本引发的一个问题

Appium新版本引发的一个问题

时间:2023-07-20 10:23:09浏览次数:57  
标签:__ Appium 引发 None capabilities desired init 版本 options

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,引发,None,capabilities,desired,init,版本,options
From: https://www.cnblogs.com/wuxianfeng023/p/17567613.html

相关文章

  • Eclipse与jkd版本对应
    Eclipse官网https://www.eclipse.orgEclipse与jdk版本对应关系  JDk版本Eclipse版本版本日期JDK1.6Eclipse4.3(Kepler) releasedinJune2013.JDK1.7Eclipse4.4(Luna) releasedonJune25,2014.Eclipse4.5(Mars) releasedonJune24,2015......
  • golang slice (切片) 扩容机制详解(1.18版本后)
    slice源码定义:typeslicestruct{ arrayunsafe.Pointer//指向底层数组的指针 lenint//切片长度 capint//切片容量}growslice()方法:用于slice的扩容funcgrowslice(et*_type,oldslice,capint)slice{//...... newcap:=old.cap doubleca......
  • Win10家庭版 win10 HOME版本找不到 没有 组策略gpedit.msc 解决办法
    WIN10HOME很多用户使用电脑的时候,系统提示找不到组策略gpedit.msc,请确定文件是否正确,再试一次的错误情况,这是怎么一回事呢?由于系统中“gpedit.msc”系统文件被破坏或丢失导致,该这么解决呢?今天小编带来了解决方法,具体的下面一起来看看吧。win10家庭版本身不提供组策略的功能......
  • WPF版本发布流程
    前言使用工具:MicrosoftVisualStudio2012框架版本:.NETFramework4.5一、WPF发布程序的教程方法1.进入项目目录,右键点击属性 (右键:属性=>发布)  2.填写程序发布路径  本地发布选择【文件系统】、填入发布路径即可下一步(可以新建1个文件夹)。3.选择程序文件(发布......
  • 更新旧版本的 Deno 报错解决 error: You do not have write permission to /opt/homeb
    更新旧版本的Deno报错解决error:Youdonothavewritepermissionto/opt/homebrew/bin/deno参考1:https://www.denojs.cn/manual/getting_started/installation参考1:https://deno.land/[email protected]如需更新旧版本的Deno,你可以运行:denoupgrade此操作会从github.com/d......
  • Android GO 版本源码中preferred network type显示
    AndroidGO版本源码中preferrednetworktype的显示作为一名经验丰富的开发者,我将向你解释如何在AndroidGO版本的源码中实现"preferrednetworktype"的显示。下面是实现这个功能的步骤:步骤概览步骤动作步骤1创建一个新的Android项目步骤2添加必要的权限步骤......
  • Android版本下载
    Android版本下载Android是目前全球使用最广泛的移动操作系统之一,每年推出新的Android版本。新的Android版本通常带来更多的功能和改进,因此,及时更新Android版本对于用户来说是非常重要的。本文将介绍如何下载和安装Android版本,并提供一些相关的代码示例。下载Android版本要下载An......
  • Linux安装新版本Python3.9.0
    Linux自带的python版本过低,无法满足需要,遂安装一个Python3.9。在Linux系统上安装新版本的Python,可以通过以下步骤进行操作:1.下载新版本前往Python官方网站(https://www.python.org/downloads/source/),选择适合你的系统的最新版本的源代码进行下载。解压源代码包。使用命令行......
  • 关于mysql自增ID何时重置引发的思考
    背景mysql有一个表因为数据量太大,单表查询很慢,决定做表分区.但是做表分区的时候,分区键如果不是主键的话,要把原来的主键(id)取消重新将原来的主键(id)和分区键绑定做一个复合主键.但是原来的主键(id)是自增的,取消它需要先取消自增.然后复合主键建立之后再把id设为自增......
  • 【Spring Cloud Alibaba】毕业组件版本关系
    目录cloud组件版本关系框架版本依赖关系cloud组件版本关系SpringCloudAlibabaVersionSentinelVersionNacosVersionRocketMQVersionDubboVersionSeatacVersion2021.0.1.0*1.8.31.4.24.9.22.7.151.4.22.2.7.RELEASE1.8.12.0.34.6.12.7.131.3.0......