介绍

Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持iOS、Android及FirefoxOS平台测试。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。

特点:

  • 跨架构
  • 跨设备
  • 跨语言
  • 跨app
  • 不依赖源代码
  • 不限制测试框架和平台

Appium的加载流程
• 调用android adb完成基本的系统操作

• 向android上部署bootstrap.jar包并启动

• Forward android的端口到pc机器上
• Pc上监听端口接受请求,使用webdriver协议

• 分析命令并转通过forward的端口发给 bootstrap.jar
• Bootstrap.jar接受请求并把命令发给 uiautomator或者插桩体系

如:执行send_keys命令,发送到remote webdriver /wd/hub/session/xxx/keys,然后pc处理请求并转发给android和iphone,接着Bootstrap.jar调用uiautomator,Uiautomator调用settext方法

实际应用(以Android平台为例)

1、安装jdk

我装的jdk1.8.0_20

2、安装Android studio,使用其中的sdk

3、sdk环境配置

1)在环境变量的系统变量中新建变量ANDROID_HOME,变量值就是adk对应的路径

2)点击编辑系统变量path,添加sdk的tools和platform-tools

3)点击确定,在cmd下运行adb devices

出现下面的就是正确了

如果只显示了list of devices attached 则需先在命令行输入adb connect 127.0.0.1:62001(为了连接到夜神模拟器),再输入adb devices即可

4、安装模拟器(模仿Android的环境)

可以使用Android自带的模拟器,这里我使用的是夜神模拟器(相对较为流畅)

5、启动模拟器,出现桌面

6、安装Python

7、安装appium

8、安装Appium-client

注意:ip命令需要到python的scripts目录下用(因为pip.exe在那)

cmd下跳转到Python的script目录下,输入pip install appium-client,则自动安装

9、双击打开ANDROID_HOME/tools下的uiautomatorviewer.bat

出现以下界面

点击左上角第二个按钮,就可以显示模拟器中的界面

如果报错,一般是因为abd的问题,则再重复3、3)步骤则可以解决

这个应用是可以对apk中的元素进行定位,方便写Python脚本

Uiautomator具体的使用方法:

  • 先找index,再找text,若再找不到则尝试找resource-id,再不行则尝试找父类,再不行就只能通过坐标

  • 通过xpyth定位:

    findElementByXPath("//android.widget.TextView[10]") xpath下标从1开始,使用完整的classname

  • 通过id定位:findElementById("com.xwtec.zhy.xwlottery:id/grid_item_tv_red");
  • find_element_by_name(name对应uiautomator扫描后text的内容)
  • find_element_by_id(id对应resource-id)

  • find_element_by_class_name(class_name对应class)

  • find_element_by_accessibility_id(accessibility_id对应content-desc)

  • 定位到某个文本框,并输入内容:

    text = driver.find_element_by_id("com.changhong.smartalbum:id/passwd_edit") text.send_keys("123456")

  • 滑动屏幕:
    • 获取屏幕尺寸 width=self.driver.get_window_size()['width'] height=self.driver.get_window_size()['height']
    • 滑动屏幕 driver.swipe(width*9/10, height*1/2, width*1/10, height*1/2, 1000)

推荐一个网址里面有一些具体的Appium Python的用法:http://blog.csdn.net/alvin_lam/article/details/50717338

10、编写Python测试脚本

pyunit介绍:pyunit被称作python版本的junit,一般python安装好即带有unittest,检验unittest是否存在的方法:import unittest

下面是一些Python脚本中操作app的用法:

  • 检查app安装情况(返回true/false), driver.is_app_installed(package_name)

  • 安装app driver.install_app("x:/xxx.apk")

  • 卸载app driver.remove_app(package_name)

  • 打开通知栏 driver.open_notifications()

  • 关闭app driver.close_app()

  • 启动app driver.launch_app()

  • 锁定屏幕x秒(不是很好用,锁定后屏幕无法解锁,导致无法后续,本人未找到解锁的方法) driver.lock(X)

  • 模拟摇晃设备 driver.shake

  • 重置应用 driver.resetApp()

  • 检查是否存在某个activity(未找到则返回异常) driver.find_element_by_id(activity)

  • 获取当前的activity: activity = self.driver.current_activity print(u"当前的activity是:", activity)

  • 等待activity启动直到x秒超时,每隔y秒扫描一次 driver.wait_activity(activity, x, y)

  • 将app置于后台运行x s(注意:测试发现置于后台数秒后变为前台时,将是重新启动app,进入首页,而不是切入后台时的界面) driver.background_app(x)

  • 打印可用的输入法 IME_LISE = driver.available_ime_engines print(IME_LISE)

  • 检查设备是否有输入法服务活动,返回True/False driver.is_ime_active()

  • 激活安卓设备中的指定输入法(设备可用输入法可以从“available_ime_engines”获取)") driver.activate_ime_engine(IME_LISE[-1])

  • 退出键盘 driver.hide_keyboard()

11、运行Python脚本,若adb没有启动,重启adb http://jingyan.baidu.com/article/d169e186b38f37436611d8fb.html

如:使用以下模板:(以爱壁纸的登录页面为例)

#coding:utf-8
#Import the common package
import os
import unittest
from appium import webdriver
from time import sleep #设置路径信息
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
) class LoginAndroidTests(unittest.TestCase):
def setUp(self):
#初始化测试平台
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
#desired_caps['app'] = 'D:\apk\爱壁纸.apk'
desired_caps['appPackage'] = 'com.lovebizhi.wallpaper'
desired_caps['appActivity'] = 'com.lovebizhi.wallpaper.WelcomeActivity'
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) def tearDown(self): self.driver.quit() def test_1(self):
#测试导航页
print("start test1...") #判断是否安装爱壁纸APP
wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
if wallpaper:
#self.driver.remove_app("com.lovebizhi.wallpaper")
sleep(8)
# 点击某一壁纸图片
self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[4].click()
sleep(4)
# 点击设置壁纸
self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
sleep(5)
else:
self.driver.install_app("D:\apk\爱壁纸.apk")
sleep(30) def test_2(self):
#测试导航页
print("start test2") #判断是否安装爱壁纸APP
wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
#是
if wallpaper:
sleep(8)
# 点击某一壁纸图片
self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[5].click()
sleep(4)
# 点击设置壁纸
self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
sleep(5)
#否,安装
else:
self.driver.install_app("D:\apk\爱壁纸.apk")
sleep(30) if __name__ == '__main__':
suite =unittest.TestLoader().loadTestsFromTestCase(LoginAndroidTests)
unittest.TextTestRunner(verbosity=2).run(suite)

开启Appium

运行Python脚本即可看到APP自动操作实现设置壁纸的整个流程

Appium 测试APK的更多相关文章

  1. Appium使用Python运行appium测试的实例

    Appium使用Python运行appium测试的实例 一.  Appium之介绍 https://testerhome.com/topics/8038 详情参考--https://testerhom ...

  2. 【亲测】Appium测试Android混合应用时,第二次切换到WebView失败

    要解决的问题:Appium测试Android混合应用时,第二次切换到WebView时失败 原因分析:在用Appium测试Android混合应用时,当程序第一次切换到WebView时,可以正常进行自动化 ...

  3. 安卓BLE测试apk

    安卓蓝牙测试APP 文件下载:蓝牙测试.apk

  4. 创建一个apk:按钮-click-文字display,测试apk;安装在真机进行调试的方法

    问题引入: 怎么样在一个app做event事件?例如touch操作,滑动操作,和按键事件(back,home等) 回答1:device.touch(x,y) ---获取device对象,然后touch ...

  5. MTK Android 计算器Calculator输入暗码!77!+,启动工厂测试apk

    Android8.0 计算器Calculator输入暗码!77!+,启动工厂测试apk 路径: packages/apps/ExactCalculator/src/com/android/calcul ...

  6. 一文带你趟过mac搭建appium测试环境的遇到的坑

    做UI自动化,最难的一步就是在环境搭建上,怎么去搭建一个UI自动化测试的环境,会难住很多人,在Mac上搭建appium如何搭建呢,本文带着大家去领略如何在mac上搭建appium测试环境.下面就是详细 ...

  7. 『与善仁』Appium基础 — 14、Appium测试环境搭建

    目录 1.Appium测试环境搭建整体思路 (1)Android测试环境搭建 (2)Appium测试环境搭建 (3)测试脚本语言的环境搭建 2.Appium在Android端和IOS端的工作流程 (1 ...

  8. 移动端UI自动化Appium测试——获取APK的Package及Activity属性值

    1.如果有代码环境,直接在AndroidManifest.xml中查找: package值: Activity值: 2.如果没有开发代码,直接用命令获取: cmd进入到 android-sdk-win ...

  9. Appium测试安卓apk遇到的问题及解决方法

    1.Showing error - “Returned value cannot be converted to WebElement: {ELEMENT=1}  解决方法:https://sqa.s ...

随机推荐

  1. 【虚拟机】linux 桥接模式 固定静态IP

    1:在root用户下修改 2:进入root用户下 vim/etc/sysconfig/network-scripts/ifcfg-eth0 2.修改完保存退出 3.重启网络服务:service net ...

  2. JS变量比较陷阱

    我们觉得JS简单是因为它是弱类型的语言,不像java那样对对类型那样敏感,但js也有其不尽人意的地方. 在java中我们无法将数字与字符串直接比较,而js能,而且能直接转换成数值比较,但是如果是字符串 ...

  3. C++中string的成员函数

    string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...

  4. rocketMQ基本理解

    消息中间件需要解决哪些问题? Publish/Subscribe 发布订阅是消息中间件的最基本功能,也是相对于传统RPC通信而言. Message Priority 规范中描述的优先级是指在一个消息队 ...

  5. python-运算、分支、深浅拷贝

      算术表达式: + - * / 除法Python3中是默认向浮点数靠拢 //取整运算   结果的最小整数靠拢  向下 5 // 2 = 2(向下取整) %取余运算 5 % 2 = 1 **幂值运算 ...

  6. Maven取消编译自动测试

    Maven取消编译自动测试 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...

  7. SaltStack执行状态收集入库-第五篇

    实验目标 1.salt执行的状态然后结果写入MySQL可以方便查询执行salt执行的历史记录 实现方法 1.使用salt的return功能,是minion直接写入MySQL(相对比较麻烦) 2.使用m ...

  8. bzoj1879: [Sdoi2009]Bill的挑战(codevs2308)(luoguP2167) 状压dp

    唔...懒兔子来写博客了... 点我看题 这题的话...我想了很久但是都不是可行解 刚开始想预处理任意两个串是否可以匹配然后在乱搞,后来发现完全不会写... 然后按照惯例,我会看题解认真的思考... ...

  9. Vue中使用百度地图——设置地图标注

    知识点:创建Map实例,为指定的位置设置标注 参考博客:https://www.cnblogs.com/liuswi/p/3994757.html 1.效果图:初始化地图,设置指定经纬度为地图中心点坐 ...

  10. mac iterm2 打开Linux 服务器文件乱码

    我的mac 上用是iterm2终端, Shell 环境是zsh.ssh 到Linux 服务器上查看一些文件时,中文乱码. 这种情况一般是终端和服务器的字符集不匹配,MacOSX下默认的是utf8字符集 ...