Appium新版本引发的一个问题
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新版本引发的一个问题的更多相关文章
- appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator
appium 1.7.6 不支持findElementByName(locator) 不知道为什么? 脚本中许多这样的语句,麻烦事情多了 org.openqa.selenium.InvalidSel ...
- Appium新版本不再支持ByName定位了怎么办
appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...
- 新版appium绘制九宫格的一个注意点
在用appium-desktop-setup-1.6.2进行app手势密码设置时,发现move_to(x, y)相对偏移量的方法用不了,绘制的手势也是乱跑 还会抛一个错误 selenium.commo ...
- appium环境配置和一个例子
最近觉得appium挺火的,看了一些资料,本来想使用npm在线安装,遇见各种问题,先简单说一下: 在cmd窗口中使用命令:npm install -g appium安装,报无python的error, ...
- 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 ...
- Appium之启动第一个App
搭建appium自动化环境真是各种问题呀. 如何启动在真机上启动App? 执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”. 脚本源码如下: from appium import ...
- “static”引发的一个错误
昨天晚上,舍友发来一个程序,先把代码贴上: #include<stdio.h>#define N 20short bufferA[N]={1,2,3,4,5,6,7,8,9,10,11, ...
- js json 与字符串 转换过程由于书写不统一规范引发的一个问题
对于两个字符串: 字符串1:{title:{},tooltip:{trigger:"axis"},legend:{data:["新关注人数"]},calcula ...
- 【转】NO.2、Appium之IOS第一个demo
接第一篇:Appium之iOS环境搭建 http://blog.csdn.net/clean_water/article/details/52946191 这个实例继承了unittest,重写了它的s ...
- Dubbo配置引发的一个问题--- Duplicate spring bean id
1.原因 因项目业务需要,要调用RPC框架,项目原本已经依赖了很多RPC接口需要启动时加载,所以准备做成启动时不预加载. 就是在配置的时候加上check=false. 官方文档解释的作用,就是Dubb ...
随机推荐
- c/c++零基础坐牢第一天
c/c++从入门到入土(1) 开始时间2023-04-12 22:37:21 结束时间2023-04-13 00:02:26 前言:恭喜大家打开信息时代的大门,每个时代都有代表性的炫酷技能:原始时代的 ...
- 关于 OAuth 你又了解哪些?
作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. OAuth 的背景 OAuth,O 是 Open,Au ...
- 五天学会Deep Learning
五天学完deep learning......是时候来证明chatGPT和new bing的能力了...... DAY1 Sigmoid function Sigmoid 函数是一种常用的激活函数,它 ...
- vue路由的两种方式(路由传参)
query和params区别 query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在 params类似 po ...
- Redis缓存穿透、击穿、雪崩
文章目录 缓存穿透 缓存雪崩 缓存击穿 代码实战部分 缓存击穿实战代码封装 缓存穿透解决 Redis目前是非常流行的缓存数据库,缓存穿透.缓存击穿.缓存雪崩是常见的面试题,也是非常重要的问题. 缓存穿 ...
- NFS共享存储实战
NFS共享存储实战 目录 NFS共享存储实战 NFS基本概述 为什么要使用共享存储 企业中文件服务器(共享存储) NFS应用场景 集群没有共享存储时 集群有共享存储 NFS实现原理 NFS的函数 本地 ...
- Linux 给用户赋予操作权限
赋予local目录读写权限给keesail,别的用户对这个目录没有任何权限. chown -R keesail:keesail ./local chmod 777 文件夹名称,可以把文件夹设置成所有用 ...
- 【python爬虫】对于微博用户发表文章内容和评论的爬取
此博客仅作为交流学习 对于喜爱的微博用户文章内容进行爬取 (此部分在于app页面进行爬取,比较方便) 分析页面 在这里进行json方法进行,点击Network进行抓包 发现数据加载是由这个页面发出的, ...
- 2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟 ③每一只母牛永远不会死 。请问N年后牛的数量是多少 ?
2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟 ③每一只母牛永远不会死 .请问N年后牛的数量是多少 ?福哥答 ...
- 2022-04-15:给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值, 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值, 同学安静值
2022-04-15:给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值, 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值, 同学安静值 ...