Appium自动化测试环境搭建

1、Appium简介

Appium是一个开源的,适用于原生或混合移动应用( hybrid mobile apps )的自动化测试平台,Appium应用WebDriver: JSON wire protocol驱动安卓和iOS移动应用。

2、环境配置

(1) 配置java环境

首先安装jdk。安装完成后新建用户变量,变量名:JAVA_HOME,变量值:C:\Program Files (x86)\Java\jdk1.6.0_43。并在系统变量path中加入C:\Program Files (x86)\Java\jdk1.6.0_43\bin。

(2) 配置android环境。

新建系统变量,变量名: ANDROID_HOME,变量值:E:\software\android-sdk-windows(根据你电脑sdk实际的位置确定)。并在系统变量path中加入%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools(实际上就是把你sdk下的platform-tools以及tools加入到了环境变量中)。

(3) 下载您最熟悉的脚本开发语言并安装(我用的是Python,你也可以使用JS、Java、php、c和ruby),

Python安装包下载地址:http://www.python.org/download/(建议使用python2.7),安装完成后在系统变量path中加入C:\Python27。

(4)安装pythonsetuptools

下载地址:http://www.cncrk.com/downinfo/28512.html。安装完成后:在cmd命令行中进入到C:\Python27\Scripts目录,执行:easy_install.exe pip,执行完成后,再执行easy_install pip selenium。

如果在pycharm写脚本的话,那就在file-setting中设置如下:

(5)安装Appium Client Libraries

Appium 1.0.0以后的版本(含1.0.0)。封装了webdriver协议,所以使用appium时需要安装appium的lib,下载地址:https://pypi.python.org/pypi/Appium-Python-Client.下载完成解压后,在cmd下进入到E:\123\Appium-Python-Client-0.10(就是setup.py所在的目录),并执行python setup.py install。

(6) 下载appium客户端。

Appium客户端的下载地址如下(下载zip结尾的安装包,dmg结尾的是ios的):https://bitbucket.org/appium/appium.app/downloads/

下载完成解压后,打开appium.exe启动appium服务,也可以进入到appium的bin目录(E:\software\AppiumForWindows-1.2.0.1\Appium\node_modules\appium\bin)通过node命令打开appium服务。(node appium.js,使用此命令前需要先安装node,下载地址:http://www.nodejs.org/)

此时环境已经配置好了,可以运行脚本进行appium的自动化测试了。

2,appium的使用

2.1 对象识别

Appium对象识别采用Selenium的对象识别方式,是其子集,我们可以通过sdk/tools/下的uiautomatorviewer.bat查看元素的类别,目前实现的方式有:name、id、class_name、xpath

对照上边的截图,有text的我们可以通过name去识别;有resource-id的我们可以通过id去识别;有class的我们可以通过class_name去识别去找到此元素。

Python方式识别样例:

1. 通过name找到界面的某个元素,如下例:

txt = driver.find_element_by_name("取消")

txt = driver.find_elements_by_name("取消")

element和elements的区别在于element找到的元素是唯一的,elements找到的元素是这一类,可以理解为一个数组一样的东西,我们可以通过索引来对它区分。

2. 通过id找到界面的某个元素,如下例:

txt = driver.find_element_by_id("com.me:id/search_news_item_type")

txt = driver.find_elements_by_id("com.me:id/search_news_item_type")

3. 通过id找到界面的某个元素,如下例:

txt = driver.find_element_by_class_name("android.widget.TextView")

txt = driver.find_elements_by_class_name("android.widget.TextView")

二、动作类型及常用方法

1. 点击 click/tap

点击界面某个元素:

driver.find_element_by_name("取消").click()

点击某一坐标:

driver.execute_script("mobile: tap",{"x":220,"y":634})

点击某个元素:

TouchAction(driver).tap(element).perform()

该动作实现的机制是通过调用外部动作来实现的,以Python为例:

首先需要引入外部TouchAction的动作。

fromappium.webdriver.common.touch_action import TouchAction

2. 滑屏 flick/flick_element

该动作实现的机制是通过调用外部动作来实现的,以Python为例:

首先需要引入外部TouchActions的动作。

from selenium.webdriver.common.touch_actions import TouchActions,之后可通过调用该动作实现长按功能。

TouchActions(driver).flick(x, y).perform()

对整个手机屏幕进行滑动,x表示左右滑动,y表示上下滑动,xy的正负表示滑动方向,x轴的负代表向左滑动,y轴的负代表向上滑动。

TouchActions(driver).flick_element(element, x,y,speed).perform()

针对于具体的控件进行滑动,x表示左右滑动,y表示上下滑动,xy的正负表示滑动方向,其中speed表示需要滑动的快慢速度。

3. 长按long_press

TouchActions(driver).long_press(element).perform()

该动作实现的机制是通过调用外部动作来实现的,以Python为例:

首先需要引入外部TouchActions的动作,

from selenium.webdriver.common.touch_actions import TouchActions,之后可通过调用该动作实现长按功能。长按某个元素,先使用对象识别的方法找到这个

element,然后可以去长按它。

4. 滑动 swipe

driver.execute_script("mobile: swipe", {'startX':497, 'startY':1824, 'endX':497, 'endY':77, 'tapCount':1, 'duration':10})

startX,startY是滑动的起始坐标;endX和endY是滑动的结束坐标;touchCount (默认为1): 触摸数量,即手指的个数;duration是滑动的持续时间,单位s。

5. 获取文本或者其他控件上的text方法(.text)

首先我们需要先找到某个element,然后通过.text方法获取文字,例如:

aa = driver.find_elements_by_class_name("android.widget.TextView")

printaa[0].text

6. 输入框输入方法.sendkeys()

button = driver.find_element_by_name("输入框")

button.sendkeys(u“您要输入的内容“)

7. 调用系统命令os.system()

os.system("adb shell input text baoma "),我们可以在括号里边写上我们想调用的外部命令,但是用此方法时,需要先import os。

8. 其他常用动作

(1) 点击返回键

driver.press_keycode(4)

(2) 点击搜索键

driver.press_keycode(84)

(3) 点击退格键

driver.press_keycode(67)

其他按键的操作可参见KEYCODE列表。

三、Appium检查点设置

检查点的设置在测试中是至关重要的,这是验证你先前操作的预期合理性和正确性,如果一个功能点的测试脚本不设置检查点的话,这个测试脚本做的任何操作都是无用功,因此,每一个测试脚本至少要有一个检查点,来验证你操作是否达到预期的结果。

验证方法如下:

assert实际结果==预测结果;

assert true 表示结果正确,测试结果返回OK

assert false 表示结果错误,测试结果返回Fail

断言的方法有很多种这里不一一介绍,有兴趣的可以在网上查找。

举例:

assert cmp(bb,“文案”)!=0

assert cmp(bb,“文案”)=0

assertEqual(bb,“文案”)

assertNotEqual(bb,“文案”)

四、基本测试demo
Appium支持多语言,根据喜好进行语言选择:ruby、java、javascript、python、c#、perl、php等。详细参考appium示例,sample-code地址: https://github.com/appium/sample-code/tree/master/sample-code/examples/python。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法大家庭】动态规划算法

目录 🧂1.动态规划思想 🌭2.背包问题思路分析 🍿3.代码实现 1.动态规划思想 将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的 2.背包问题思路分…

德人合科技 | 天锐绿盾终端安全管理系统

德人合科技提到的“天锐绿盾终端安全管理系统”是一款专业的信息安全防泄密软件。这款软件基于核心驱动层,为企业提供信息化防泄密一体化方案。 www.drhchina.com 其主要特点包括: 数据防泄密管理:天锐绿盾终端安全管理系统能够确保数据在创…

10.轮廓系数-机器学习模型性能的常用的评估指标

轮廓系数(Silhouette Coefficient)是评估聚类算法效果的常用指标之一。它结合了聚类的凝聚度(Cohesion)和分离度(Separation),能够量化聚类结果的紧密度和分离度。 背景 1.聚类分析的背景 在…

蓝桥杯算法题汇总

一.线性表:链式 例题:旋转链表 二.栈: 例题:行星碰撞问题 三.队列 三.数组和矩阵 例题: 四.哈希表 五.二叉树 主要方法是递归 主要考察点是遍历:前序,中序,后序遍历,层…

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

解决:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

解决&#xff1a;Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 先点击 Project Structure 查看jdk是否为1.8版本 我这jdk版本为1.8版本的&#xff0c;但还是运行还是报错 据以上错误显示以及上述配置&#xff0c;我选择的编译器是jdk1.8的&#xff0c;但是在i…

2.模拟问题——3.叠筐

【原题链接】 分析 题目含义 根据题目要求&#xff0c;即要将中心值放在正方形框正中心&#xff0c;然后依次轮换在外层围上另一个边缘值&#xff0c;围的时候边框要保证中心值和边缘值交替&#xff0c;所围图形保持为一个正方形&#xff0c;围完最后一圈后&#xff0c;需要…

【leetcode】用队列实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 在做此题之前&#xff0c;我们先要实现队列&#xff0c;这在上个博客中已经写过&#…

武器大师——操作符详解(下)

目录 六、单目操作符 七、逗号表达式 八、下标引用以及函数调用 8.1.下标引用 8.2.函数调用 九、结构体 9.1.结构体 9.1.1结构的声明 9.1.2结构体的定义和初始化 9.2.结构成员访问操作符 9.2.1直接访问 9.2.2间接访问 十、操作符的属性 10.1.优先性 10.2.结合性 …

JVM相关问题

JVM相关问题 一、Java继承时父子类的初始化顺序是怎样的&#xff1f;二、JVM类加载的双亲委派模型&#xff1f;三、JDK为什么要设计双亲委派模型&#xff0c;有什么好处&#xff1f;四、可以打破JVM双亲委派模型吗&#xff1f;如何打破JVM双亲委派模型&#xff1f;五、什么是内…

Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护

目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Shell反弹等 抓包技术&#xff1a…

随机生成验证码

随机生成验证码 需求&#xff1a;随机生成一个任意位的验证码包含数字、大写字母和小写字母 1.代码实现 package com.ham;import java.util.Random;public class case2 {public static void main(String[] args) {System.out.println(code(4));}public static String code(i…

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…

Java二叉树(1)

&#x1f435;本篇文章将对二叉树的相关概念、性质和遍历等知识进行讲解 一、什么是树 在讲二叉树之前&#xff0c;先了解一下什么是树&#xff1a;树是一种非线性结构&#xff0c;其由许多节点和子节点组成&#xff0c;整体形状如一颗倒挂的树&#xff0c;比如下图&#xff1…

1. vue3-环境准备

1、安装node.js 如果开发环境上面没有安装node.js&#xff0c;需要到node.js官方网站下载node.js。下载安装后&#xff0c;可以通过npm --version查看nodejs版本 2. 开发工具 开发工具建议使用vscode

C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码

1 微分方程 微分方程&#xff0c;是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛&#xff0c;可以解决许多与导数…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 &#xff0c;是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

分布式基础 --- Leader election

分布式基础 --- Leader election 为什么需要leader electionRing electionBully Algorithm 为什么需要leader election 在一组集群中, 需要选出一个leader来承担一些特别的任务, 比如 协调和控制系统操作&#xff1a;领导者负责协调和控制整个分布式系统的操作。它可以接收和处…

46、WEB攻防——通用漏洞PHP反序列化原生类漏洞绕过公私有属性

文章目录 几种常用的魔术方法1、__destruct()2、__tostring()3、__call()4、__get()5、__set()6、__sleep()7、__wakeup()8、__isset()9、__unset()9、__invoke() 三种变量属性极客2019 PHPphp原生类 几种常用的魔术方法 1、__destruct() 当删除一个对象或对象操作终止时被调…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…