Appium - python

news2025/2/28 6:15:47

一、appium的介绍

Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合 的应用。Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改 自己的应用。Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、 Php、Python、Ruby、C#、,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架.Appium实现了真正的跨平台自动化测试。

二、appium 架构

        appium 是一个node.js 编写的http server ,它的创建、并管理多个webDriver sessiion 来和不同平台交互,如ios,Android等等,appium 开始一个测试后,就会在被测设备(手机)上启动一个server,监听来自appium server 的指令,每种平台ios 和android 都有不同的运行、和交互方式。4所以appiium会用某个桩程序 入侵该平台,并接受指令,来完成测试用例的运行

2.appium 的工作原理

client端发送自动化指令给appium server ,appium server 接收到client发送的指令后,转换为移动端能够识别的指令,然后发送给移动端设备,并对移动端设备进行操作。

工作流程,脚本请求--->4723端口appium server --->解析参数给pc端4724端口---->发送给设备4724端口---->通过设备4724端口发给bootstrap.jar --->bootstrap.jar把命令发给 uiautomator

注意:bootstrap.jar:是push到android手机上的一个应用程序,主要是接受appium server的执行并且运行这些测试指令。而指令的执行正式通过UIAutomator来驱动

1.appium安装

        1.安装jdk

        下载好后点击进行安装。安装好后进行环境变量的配置

        打开计算机-》系统属性-》高级系统设置-》环境变量-》新建(系统变量),如图所示:

配置JAVA_HOME C:\Program Files\Java\jdk\jdk1.8.0_91(根据自己的安装磁盘决定盘符)

配置Path: ;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin; 追加进Path中;

配置CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

验证:

验证一下JDK的环境是否配置好,win+r 输入cmd进入dos下输入java -version检查环境是否配置成 功。

安装 Android sdk  ---安装步骤类似jdk,不在赘述

验证:

2.安装Node.js

建议使用我提供下载的6.9.4版本,类似jdk,不再赘述

验证:

3.安装appium

下载:AppiumForWindows_1_4_16_1.zip

验证:

cmd打开命令行窗口,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境 配置成功

4.安装依赖包

appium-pytho-client 目的是需要将python 与appium 关联起来,首先要安装python3.x ,进行环境配置。配置的默认环境是本地的python 环境,如果后期使用pycharm的虚拟环境,这需要在虚拟环境中再次安装。

在需要的环境下,输入:pip install Appium-Python-Client==1.3.0,(此处需要配合appium版本使 用,所以需要指定版本安装)提示成功就可以了,我这边是已经安装过了。同时selenium的包要指定安 装4.8.0,安装命令:pip install selenium==4.8.0

验证 :出现successfully,就安装成功。

三、启动设备

1.appium 已经启动

        双击该软件appium-desktop,启动appium服务器

        点击start server,启动appium服务器

看到以上图形,代表服务启动成功

2.设备已连接

        A.连接模拟器

        adb命令进行连接模拟器  

        命令:adb connect 127.0.0.0.1:port

端口号:逍遥安卓模拟器:21503

B.连接真机:

安卓真机,需要在设置里面进入关于手机,里面连击版本号,会提示手机已进入开发者模式,在回到设 置中查找开发者选项,开启USB调试,再次通过数据线连接手机即可。(如果提示手机连接模式,应该 选择文件传输,不能选择仅充电)连接成功后,可以使用adb devices查看,如图:

        

3.被测软件已经安装:

将目标apk安装到目标机器上,如果是模拟器,如下图

四、启动目标app

此处我们以模拟器上的今日头条的apk为例 代码如下:

代码如下:

import time
from appium import webdriver

def startUp():
    print("启动中")
    #启动参数设置dict数据格式
    desire_caps = {
        #通过adb devices获取,此处是模拟器所以填写的是ip和port
        "deviceName": "127.0.0.1:21503",
        # 使用哪个移动操作系统平台
        "platformName": "Android",
        # 使用移动操作平台的版本
        "platformVersion": "5.1.1",
        # app的包名,通过aapt dumpsys bading xxx.apk获取
        "appPackage": "com.ss.android.article.news",
        "appActivity": "com.ss.android.article.news.activity.MainActivity",
        "noReset": True,
        "unicodeKeyboard": True
        # "autoLaunch": False
    }
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desire_caps)
    print("启动成功,等待6s关闭")
    time.sleep(6)
    #智能等待
    driver.implicitly_wait(1)
    time.sleep(4)
    driver.quit()

if __name__ == '__main__':
    startUp()

报错:
ValueError: Timeout value connect was <object object at 0x0000019A00694540>, but it must be an int, float or None.

其实是selenium版本和urllib3版本不兼容问题。更换urllib3版本:
pip uninstall urllib3
pip install urllib3==1.26.2
也可以更换selenium版本,参考以下文章:
https://blog.csdn.net/qq_48302722/article/details/130861992

APP启动参数说明:

参数描述
appPackageApp的包名,通过aapt dumpsys badging
xxx.apk获取
例如:'appPackage': 'com.jyibb.shell_customer',
platformName使用哪个移动操作系统平台例如:'platformName': 'Android'
platformVersion移动操作系统版本例如:'platformVersion': '5.1'
deviceName使用的移动设备或模拟器的名称,通过adb devices获取例如:'deviceName':'8TB6V4ZPZ54LPJ5P'
app如果为第一次启动则需要
通过该参数指定app安装
包的位置,一般为绝对路径
例如:'app': ‘D:\shell_customer-debug.apk'
newCommandTimeout在假定客户端退出并结束
会话之前,Appium将等
待来自客户端的新命令
(以秒为单位)
例如 60
appActivity通过aapt dumpsys
badging xxx.apk获取
例如 appActivity':
'com.jyibb.module_launch_customer.SplashActivity',
udid连接的物理设备的唯一设
备标识符,此参数为ios
特有参数
例如 :'udid':'1ae203187fc012g'
noReset在此会话之前不要重置应 用程序状态。true, false
fullReset执行完整的重置true, false
unicodeKeyboard解决输入中文的问题,否 则不能用sendkeys输入 中文例如, ‘unicodeKeyboard':'True'
resetKeyboard将键盘隐藏起来,默认 truetrue, false
autolunchAppium是否要自动启动 或安装app默认true ,该参数在设计框架时开启了lunchapp方法 后使用可以避免每次第一个用例失败
automationNameUiAutomator2有些手机定位不到元素,或调不动时,可以使用此参数

注意: "udid":设备唯一标识,通过adb devices获取,显示的设备标识,如果当前连接了多台设备,可以通过 此参数区分要启动的设备,安卓的deviceName不会校验正确性(可以随便写),ios必须校验 系统版本:打开模拟器里面的设置,查看系统版本即可,类似手机操作系统,如下图

appPackage和appActivity获取:

1、 将目标apk放在一个已知目录下

2、 进入该目录的dos环境,输入以下命令

aapt dump badging jinritoutiao.apk |findstr package ----用来查看package
aapt dump badging jinritoutiao.apk |findstr activity ----用来查看activity

如果是linux或者mac 则把findstr换成grep

aapt dump badging d:\xxx.apk   #获取安装包的所有信息

adb devices(查看手机是否连接到电脑,可以看到设备名称)

adb shell 可以进入默认连接设备的linux环境

如果不想进入linux环境好需要输入命令进行操作的话可以通过一下方式:

adb shell ls -l(shell后直接跟命令)

如果是连接了多台设备,可以通过adb -s 127.0.0.1:21503 shell来进入指定设备的linux环境

adb shell pm list packages 列出所有的包名

adb shell dumpsys package com.android.xxx:查看某个包的具体信息

adb logcat | grep xxx:查看当前app的日志并过滤关键字

自动化测试用例的实现

以今日头条发微头条为例

手工执行用例的步骤:

前提:启动头条app,且是登录状态

1- 打开首页,点击发表按钮

2- 点击微头条,输入内容

3- 点击发布

4- 检查是否发表成功(数据库/页面)

自动化执行的步骤:

1、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

2、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

3、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

4、 断言(接口状态码,数据库字段,app页面)

五、元素定位工具

1. uiautomator

Android SDK自带的一个工具,在sdk的tools目录下(一定关闭appium-desktop的自带的定位工具后打 开,否则连接不上模拟器/真机 )

找到sdk下的tools里面的uiautomatorviewer.bat

2. appium-desktop

优先使用desktop,启动appium-desktop,点击服务器右上角的查找按钮,界面如下

点击启动后:

3-monitor:Android SDK自带的一个工具,在tools目录下,此工具主要用来监控Android手机的运行情 况,比如线程、堆内存,日志输出、等等。

六、元素定位方式

1. 单个元素定位

        方法:find_element

        用法:driver.find_element(By.属性,'属性值'),传递两个参数:一个是定位属性,一个是该属性的值

        1. 通过id定位 取resource-id的属性值,替换到xxx

driver.find_element(By.ID," xxxx ")

        2. 通过class_name定位

                取class的属性值,替换到xxx

driver.find_element(By.CLASS_NAME," xxxx ")

        3. 通过xpath定位 取xpath的属性值,替换到xxx

driver.find_element(By.XPATH," xxxx ")

        4. 通过link_text定位 取text属性值,替换到xxx

        写法一:

driver.find_element(By.LINK_TEXT," xxxx ")

       写法二:

driver.find_element_by_android_uiautomator("new UiSelector().text(\"+关注
\")")

5. 通过css_selector定位(webview)

driver.find_element(By.CSS_SELECTOR,"XXXX")

6. 通过name定位(webview) web view容器中的html页面可以用name定位,native并没有name属性

driver.find_element(By.NAME," xxxx ")

2. 多个元素定位

        方法:find_elements

        用法:与find_element方式一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果 例如:通过ID定位到多个元素,我想点击第一个元素

driver.find_elements(By.ID,"xxxxx")[0].click()
# 或采用以下写法
list1 = driver.find_elements(By.ID,"xxxxx")
list1[0].click()

七、元素操作

找到元素后可以对元素进行的操作

1. click() 点击操作,也可以用tab实现点击操作

driver.find_element(By.ID," xxxx ").click()

2. clear() 清空输入框内容

driver.find_element(By.ID," xxxx ").clear()

3. send_keys() 输入框内输入内容

driver.find_element(By.ID," xxxx ").send_keys("test content")

4. text 获得元素的text内容

result = driver.find_element(By.XPATH," xxxx").text
print(result)

5. get_attribute() 通过传入xx属性,获取xx属性值

driver.find_element(By.ID,' xxxx ').get_attribute('text')

6. size 获取元素的大小,得到一个字典如:{'height': 48, 'width': 640}

driver.find_element(By.ID,' xxxx ').size

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模——统计回归模型

一、基本知识 1、基本统计量 总体&#xff1a;研究对象的某个感兴趣的指标。样本&#xff1a;从总体中随机抽取的独立个体X1,X2,…,Xn&#xff0c;一般称(X1,…,Xn)为一个样本&#xff0c;可以看成一个n维随机向量&#xff0c;它的每一取组值(x1,…,xn)称为样本的观测值。统计…

说说hashCode() 和 equals() 之间的关系?

每天一道面试题&#xff0c;陪你突击金九银十&#xff01; 上一篇关于介绍Object类下的几种方法时面试题时&#xff0c;提到equals()和hashCode()方法可能引出关于“hashCode() 和 equals() 之间的关系&#xff1f;”的面试题&#xff0c;本篇来解析一下这道基础面试题。 先祭一…

四川玖璨电子商务有限公司培训可靠吗?

四川玖璨电子商务有限公司是一家在抖音平台上进行培训的电商公司。如今&#xff0c;随着抖音带货的火热&#xff0c;越来越多的人加入到这个行业中。然而&#xff0c;对于消费者来说&#xff0c;选择一个可靠的抖音培训公司并不容易。 在这个领域中&#xff0c;四川玖璨电子商务…

微软(TTS)文本转语音服务API实现

此博客实现与java实现微软文本转语音&#xff08;TTS&#xff09;经验总结_java tts_${简简单单}的博客-CSDN博客之上&#xff0c;首先感谢博客源码的提供&#xff0c;本人在上面添加了一些详细的注释&#xff0c;方便大家跟好的理解和使用&#xff0c;毕竟我已经用原文调试了一…

openEuler 亮相全球顶级开源盛会 OSSUMMIT 2023,持续推动智能化未来的实现

2023年9月19日&#xff0c;全球顶级开源峰会 OSSUMMIT EU 2023 在西班牙-毕尔巴鄂正式开场。openEuler 作为钻石级别赞助参会。这是 openEuler 继去年正式亮相后的第二次全面参加该峰会。 本次会议&#xff0c;openEuler带来Keynote及多场分论坛演讲&#xff0c;涵盖Linux Kern…

C 初级学习笔记(基础)

目录 1.预处理器指令 预定义宏 预处理器运算符 &#xff08;\&#xff09; 参数化的宏 头文件 .h 引用头文件操作 2.函数&#xff08;标识符&关键字&运算符&#xff09;存储类 函数参数 a. 标识符&关键字 b. 运算符&#xff08;算术、关系、逻辑、位、赋…

【Java 基础篇】Java网络编程基础知识详解

网络编程是现代软件开发中不可或缺的一部分&#xff0c;它使我们能够在不同的计算机之间实现数据传输和通信。Java作为一种强大的编程语言&#xff0c;提供了丰富的网络编程库&#xff0c;使开发者能够轻松地创建网络应用程序。本文将介绍Java网络编程的基础知识&#xff0c;面…

c++opencv RotatedRect 旋转矩形角度转换和顶点顺序转换

这里写自定义目录标题 以下代码记录主要是完成轮廓点求解最小外接矩形之后计算该文本行的角度和旋转矩形的左下&#xff08;bl&#xff09;&#xff0c;左上&#xff08;tl)&#xff0c;右上&#xff08;tr),右下&#xff08;br)的坐标点。 RotatedRect rtminAreaRect(contours…

芯片SoC设计你了解吗?

数字IC设计根据岗位性质一般包含SOC设计&#xff0c;前端设计&#xff0c;ASIC设计&#xff0c;逻辑设计&#xff0c;IP设计&#xff0c;CPU设计等。 有人说&#xff1a;做IP设计就是翻译官&#xff0c;做SOC设计就是连连看。 SoC设计是做什么的&#xff1f;与IP设计有什么不同…

C#里面的三种定时计时器:Timer

在.NET中有三种计时器&#xff1a; 1、System.Windows.Forms命名空间下的Timer控件&#xff0c;它直接继承自Componet。Timer控件只有绑定了Tick事件和设置EnabledTrue后才会自动计时&#xff0c;停止计时可以用Stop()方法控制&#xff0c;通过Stop()停止之后&#xff0c;如果想…

彻底讲透redo日志磁盘顺序写机制

文章目录 引言Redo日志的作用Redo日志的磁盘顺序写机制技术和策略&#xff1a; 刷盘机制详解1. Checkpoint&#xff08;检查点&#xff09;2. Commit&#xff08;提交&#xff09; 优化策略举例说明 参考文档 引言 背景&#xff1a;今天看了一节某培训机构的公开课关于BufferPo…

高速串行总线设计基础

高速串行总线设计&#xff08;1&#xff09; 高速信号设计涉及到方方面面的知识积累&#xff0c;也许你认为即使没有掌握甚至没有听过一些高速设计的专业术语&#xff0c;也没有关系&#xff1f;因为专业集成的IP可以帮你解决这一问题&#xff0c;但殊不知&#xff0c;根基不牢…

ABB COM0011 2RAA005844A0007J编码器模块

ABB COM0011 2RAA005844A0007J 编码器模块是用于测量和反馈旋转或线性位置信息的设备&#xff0c;通常用于自动化、机器控制和运动控制系统。以下是该编码器模块可能具备的产品功能&#xff1a; 位置测量&#xff1a;ABB COM0011 2RAA005844A0007J 编码器模块的主要功能是测量旋…

【初阶数据结构】——堆排序和TopK问题

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 接上篇二叉树和堆的引入 目录 前言 建堆 插入数据向上调整算法建堆 移动数据向上调整算法建堆 无序数组从H-1层向上移动的向下调整算法建堆 堆排序 TOP-K问题 前言 上篇文章详细讲解了堆&#xff0c;…

腐蚀与膨胀,图像处理中的结构元与腐蚀膨胀问题(数字图像处理大题复习 P9)

文章目录 腐蚀膨胀 腐蚀 我们要用结构元 B 来 腐蚀 图像 A 如果结构元 B 放到图像的某个地方&#xff0c;正好能对上&#xff0c;那么就把中心放到结果图像上 这里显然红色框是对不上的&#xff0c;而黄色是对得上的 对不上的&#xff0c;全部补上0&#xff0c;这就是结果了…

HTTP 响应头Cache-Control

每个资源都可以通过Http头Cache-Control来定义自己的缓存策略&#xff0c;Cache-Control控制谁在什么条件下可以缓存响应以及可以缓存多久。 最快的请求是不必与服务器进行通信的请求&#xff1a;通过响应的本地副本&#xff0c;我们可以避免所有的网络延迟以及数据传输的数据…

新版考勤管理系统正式发布

O2OA(翱途)开发平台 V8.1版本&#xff0c;因老的考勤管理系统已经无法满足用户需求&#xff0c;并且在架构和业务结构上都不再符合现在大多数考勤功能的需求。我们对考勤管理重新进行了开发&#xff0c;全新的版本更好用&#xff0c;更直观。 考勤管理对员工的工作出勤情况进行…

Multisim—用示波器观察电流波形

使用仪表里面的current probe&#xff1a;它显示实时电流&#xff0c;但无法将电流波形在示波器中显示。 仿真Simulate >仪器Instruments > 电流探针 current clamp&#xff1a;也就是电流钳&#xff0c;它能够将流经的电流转成电压并输入到示波器中进行显示。 双击图纸上…

手机上比较好用的笔记软件使用哪一款?

手机已经成为我们日常生活不可或缺的一部分&#xff0c;它们伴随着我们的方方面面。在这部小小的设备中&#xff0c;我们可以完成许多任务&#xff0c;其中之一就是记录笔记。手机上的笔记软件如今多种多样&#xff0c;但在选择时&#xff0c;敬业签可能是你不容错过的选择。 …

软件需求文档、设计文档、开发文档、运维文档大全

在软件开发过程中&#xff0c;文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程&#xff0c;还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用&#xff0c;以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档要求…