软件测试教程 自动化测试appium篇


本课程主要讲解自动化测试工具appium。

下面以android app测试为例,讲解appium的基本使用方法

appium概念

appium安装配置

一个测试样例

Appium 概念

Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。

Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。

原生的应用是指用android或ios的sdk编写的应用。原生应用程序看起来(外观)和运行起来(性能)是最佳的。

移动网页应用是指网页应用,HTML5应用程序使用标准的Web技术,通常是HTML5、JavaScript和CSS。

混合应用程序让开发人员可以把HTML5应用程序嵌入到一个细薄的原生容器里面,集原生应用程序和HTML5应用程序的优点(及缺点)于一体。

appium选择了client-server的设计模式。

image

通过上面一张图简单展示了appium的工具原理。

客户端/服务器架构
Appium 的核心是暴露 REST API 的网络服务器。它接受来自客户端的连接,监听命令并在移动设备上执行,答复表示执行结果的 HTTP 响应。客户端/服务器架构实际给予了许多可能性:我们可以使用任何有 http 客户端 API 的语言编写我们的测试代码,不过选一个Appium 客户端程序库 使用更容易。我们可以把服务器放在另一台机器上,而不是执行测试的机器。

会话(session)
自动化始终在一个会话的上下文中执行,这些客户端程序库以各自的方式发起与服务器的会话,但都以发给服务器一个 POST /session 请求结束,请求中包含一个被称作 'desired capabilities' 的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。

Desired Capabilities
Desired capabilities 是一些发送给 Appium 服务器的键值对集合 (比如 map 或 hash),告诉服务器我们想要启动什么类型的自动化会话。也有各种可以在自动化运行时修改服务器行为的 capabilities。例如,我们可以把 platformName capability 设置为 iOS,告诉 Appium 我们想要 iOS 会话,而不是 Android 或者 Windows 会话。我们也可以设置 safariAllowPopups capability 为 true ,确保我们在 Safari 自动化会话中可以使用 javascript 打开新窗口。有关 Appium capabilities 的完整列表,请参阅 capabilities doc 。

Appium 服务器
Appium 是用 Node.js 写的服务器。它可以从源码构建安装或者从 NPM 直接安装:

$ npm install -g appium
$ appium

Appium 客户端
有多个客户端程序库(Java、Ruby、Python、PHP,、JavaScript 和 C# 的)支持 Appium 对 WebDriver 协议的扩展,你需要用这些客户端程序库代替通常的 WebDriver 客户端。在这里浏览所有程序库的列表。

Appium.app, Appium.exe
有 Appium 服务器的图形界面包装器可以下载。它们打包了 Appium 服务器运行需要的所有东西,所以你不需要为 Node 而烦恼。它们还提供一个 Inspector 使你可以查看你应用的层级结构,这在写测试时很方便。

appium安装配置

Appium-desktop安装

原来版本的appium-server不再维护,新的工具 是Appium-desktop。

官网地址:http://appium.io/,下载合适的版本

windows平台下载:appium-desktop-setup-1.4.0.exe

双击进行安装,安装过程不需要任何设置

安装完成桌面会生成一个紫色的appium 图标,双击打开。

默认显示监控的 host 和 port ,这和 Appium-Server中是一致的。点击 “Start Server V 1.7.2” 按钮启动服务。

注意:不能在浏览器中设置代理
Traceback (most recent call last):File "C:\Users\liujiey\Desktop\test.py", line 20, in setUpself.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)File "build\bdist.win32\egg\appium\webdriver\webdriver.py", line 36, in __init__super(WebDriver, self).__init__(command_executor, desired_capabilities, browser_profile, proxy, keep_alive)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 87, in __init__self.start_session(desired_capabilities, browser_profile)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 141, in start_session'desiredCapabilities': desired_capabilities,File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 199, in executeresponse = self.command_executor.execute(driver_command, params)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\remote_connection.py", line 395, in executereturn self._request(command_info[0], url, body=data)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\remote_connection.py", line 463, in _requestresp = opener.open(request, timeout=self._timeout)File "C:\Python27\lib\urllib2.py", line 394, in openresponse = self._open(req, data)File "C:\Python27\lib\urllib2.py", line 412, in _open'_open', req)File "C:\Python27\lib\urllib2.py", line 372, in _call_chainresult = func(*args)File "C:\Python27\lib\urllib2.py", line 1199, in http_openreturn self.do_open(httplib.HTTPConnection, req)File "C:\Python27\lib\urllib2.py", line 1170, in do_openr = h.getresponse(buffering=True)File "C:\Python27\lib\httplib.py", line 1027, in getresponseresponse.begin()File "C:\Python27\lib\httplib.py", line 407, in beginversion, status, reason = self._read_status()File "C:\Python27\lib\httplib.py", line 371, in _read_statusraise BadStatusLine(line)BadStatusLine: ''

安装 python-client


python-client 的项目名称叫:Appium-Python-Client。

安装方式:pip install Appium-Python-Client

该项目依赖selenium

在python中测试: from appium import webdriver,导入成功说明安装完成

如果使用其他语言,则安装其他语言的client

安装 JDK

app sdk的运行需要JDK的支持,因此需要先安装JDK

需要配置JAVA_HOME,并设置path路径

安装 Android SDK

进行模拟器测试时,需要SDK的支持。如果真机测试的话,会用到platform-tool,例如adb等工具。因此建议安装SDK。

Android SDK 下载地址:

http://tools.android-studio.org/index.php/sdk

选择对应平台版本下载,这里选择:

installer_r24.4.1-windows.exe

安装SDK:

1、双击进行安装

2、安装过程中会检查JDK

3、安装完毕后会提示运行SDK manager

4、除默认勾选的之外,选择需要下载支持的版本,例如Android 7.0,Android 6.0等,这里选择Android 4.2.2进行下载

设置环境变量:

下面设置环境变量:

“我的电脑” 右键菜单 —> 属性 —> 高级 —> 环境变量 —> 系统变量 —> 新建…

变量名 变量值
ANDROID_HOME D:\android\Android\sdk

找到 path 变量名—> “编辑” 添加:

变量名 变量值
PATH ;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;

创建模拟器:

1、双击 AVD Manage.exe 启动AVD管理器。

2、点击 “Create…” 按钮,创建Android虚拟机。

3、不要选择超过电脑屏幕分辨率的Device。Target选择SDK下载的版本,Skin选择no skin即可,点击 “OK” 创建完成。

4、在 AVD Manage 工具中选中创建的Android虚拟机,点击 “Start…” 按钮启动。

使用Intel atom模拟时,可能会出现Starting emulator for AVD 'EMU'
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAXM is not installed on this machine此时可以在sdk manager下载extra中的HAXM或者https://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager-intel-haxm下载并安装
异常:未安装sdk
Traceback (most recent call last):File "C:\Users\liujiey\Desktop\test.py", line 20, in setUpself.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)File "build\bdist.win32\egg\appium\webdriver\webdriver.py", line 36, in __init__super(WebDriver, self).__init__(command_executor, desired_capabilities, browser_profile, proxy, keep_alive)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 87, in __init__self.start_session(desired_capabilities, browser_profile)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 141, in start_session'desiredCapabilities': desired_capabilities,File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 201, in executeself.error_handler.check_response(response)File "C:\Python27\lib\site-packages\selenium-2.48.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 181, in check_responseraise exception_class(message, screen, stacktrace)WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not find adb Please set the ANDROID_HOME environment variable with the Android SDK root directory path.

一个测试样例

创建脚本

一个测试脚本样例:
import os
import unittest
from appium import webdriver
from time import sleep# Returns abs path relative to this file and not cwdclass ContactsAndroidTests(unittest.TestCase):def setUp(self):desired_caps = {}desired_caps['platformName'] = 'Android'desired_caps['platformVersion'] = '4.2'desired_caps['deviceName'] = 'Android Emulator'//desired_caps['app'] = 'E://ContactManager.apk'desired_caps['appPackage'] = 'com.example.android.contactmanager'desired_caps['appActivity'] = '.ContactManager'self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)def tearDown(self):self.driver.quit()def test_add_contacts(self):el = self.driver.find_element_by_accessibility_id("Add Contact")el.click()textfields = self.driver.find_elements_by_class_name("android.widget.EditText")textfields[0].send_keys("Appium User")textfields[2].send_keys("someone@appium.io")self.assertEqual('Appium User', textfields[0].text)self.assertEqual('someone@appium.io', textfields[2].text)self.driver.find_element_by_accessibility_id("Save").click()# for some reason "save" breaks thingsalert = self.driver.switch_to_alert()# no way to handle alerts in Androidself.driver.find_element_by_android_uiautomator('new UiSelector().clickable(true)').click()self.driver.press_keycode(3)if __name__ == '__main__':suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)unittest.TextTestRunner(verbosity=2).run(suite)

Desired Capabilities

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = '../../../sample-code/apps/ContactManager/ContactManager.apk'
desired_caps['appPackage'] = 'com.example.android.contactmanager'
desired_caps['appActivity'] = '.ContactManager'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  • deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator,iPad Simulator,iPhoneRetina 4-inch,Android Emulator,Galaxy S4…

    deviceName通过adb devices查看
    
  • platformName:使用哪种移动平台。iOS, Android, orFirefoxOS。

  • platformVersion:指定平台的系统版本。例如指的Android平台,版本为5.1。

  • app:apk文件的路径,appium会尝试先安装该app。

  • appActivity:待测试的app的Activity名字。比如MainActivity、.Settings。注意,原生app的话要在activity前加个”.“。

  • appPackage:待测试的app的Java package。比如com.example.android.myApp, com.android.settings。

appActivity和appPackage一般由开发人员提供,如果无法获取的话,可以通过以下方式获取

1、用winrar打开apk

2、选择AndroidManifest.xml,右键查看文件

3、查看

其中:m a n i f e s t " c o m . e x a m p l e . a n d r o i d . c o n t a c t m a n a g e r"就是appPackage

其中:a c t i v i t y � . C o n t a c t M a n a g e r 就是appActivity

v e r s i o n C o d e   v e r s i o n N a m e   m i n S d k V e r s i o n   � t a r g e t S d k V e r s i o n   � n a m e   � l a b e l   � i c o n   d e b u g g a b l e   � a n d r o i d   * h t t p : / / s c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d       � p a c k a g e    m a n i f e s t   " c o m . e x a m p l e . a n d r o i d . c o n t a c t m a n a g e r   � 1 . 0    u s e s - s d k   � u s e s - p e r m i s s i o n   � a n d r o i d . p e r m i s s i o n . G E T _ A C C O U N T S     a n d r o i d . p e r m i s s i o n . R E A D _ C O N T A C T S   ! a n d r o i d . p e r m i s s i o n . W R I T E _ C O N T A C T S   a p p l i c a t i o n    a c t i v i t y   � . C o n t a c t M a n a g e r   i n t e n t - f i l t e r   � a c t i o n   � a n d r o i d . i n t e n t . a c t i o n . M A I N    c a t e g o r y     a n d r o i d . i n t e n t . c a t e g o r y . L A U N C H E R

appium 定位控件

这里通过appium自带的Inspector工具可以查看对象各种属性。也可以用android sdk自带的uiautomatorviewer.bat来进行定位

1、启动appium server

2、启动模拟器,并安装待测试的apk:ContactManager.apk(将文件拖入模拟器即可)

3、模拟器中打开ContactManager.apk,放在待测试的页面

4、点击Start Inspector session图标

5、在name和value处分别输入以下内容,点击start session启动

appium-1.PNG

platformName  Android
platformVersion  4.2
deviceName  Android Emulator
appPackage  com.example.android.contactmanager
appActivity  ContactManager

界面如下

appium-1png.png

录制脚本

Inspector提供了简单的脚本操作

1、选择录制脚本

2、在页面上做一些操作,比如点击等

3、可以看到页面上有脚本出现,复制脚本即可

定位元素信息

选中一个元素就可以实现定位,页面右侧展示了元素具体的内容

注意:出现不能点击鼠标来进行定位的话,可以选用uiautomatorviewer.bat来进行定位,或者两个结合使用。

appium-2.PNG

id 定位

如果目标设备的API Level低于18则UIAutomatorViewer不能获得对应的Resource ID,只有等于大于18的时候才能使用。

image

resource-id 就是我们理解的id属性了。

使用方法:

driver.findElement(By.id("com.android.calculator2:id/formula"))

name 定位

text就是我们要查找的name!

使用方法:

driver.findElement(By.name("21"))

Accessibility ID定位

这个方法属于Appium扩展的定位方法。

其实,我们的核心是要找到元素的contentDescription属性。它就是元素的 content-desc 。

使用方法:

driver.findElementByAccessibilityId("Add contact").click();

android uiautomator定位

这个方法也属于 Appium(Android)扩展的定位方法。

也就是说一个元素的任意属性都可以通过android uiautomator方法来进行定位,但要保证这种定位方式的唯一性。

使用方法:


driver.find_element_by_android_uiautomator('new UiSelector().text("Custom View")').click()       driver.find_element_by_android_uiautomator('new UiSelector().textContains("View")').click()
driver.findElementByAndroidUIAutomator('new UiSelector().description("equals")").click();

需要注意的是 description() 方法用的是content-desc属性。

find_elements_by_class_name方法

方法:

  • find_elements_by_class_name()

通过元素class name属性定位所有含有该属性的元素

driver.find_elements_by_class_name('name')

appium API

sendKeys()方法

方法:

  • sendKeys()

用法:

driver.findElements(By.name("Name")).sendKeys("jack");

pressKeyCode()方法

除此之外,appium扩展提供了pressKeyCode()方法。该方法Android特有。

方法:

  • pressKeyCode()

发送一个键码的操作。需要一个入参。

driver.pressKeyCode(29); // 字母“a”
driver.pressKeyCode(3);//KEYCODE_HOME

switch_to_alert()方法

方法:

  • switch_to_alert()

切换到alert窗口

driver.switch_to_alert()

click()方法

方法:

  • click()

点击某个控件

element.click()

API文档参考:http://blog.csdn.net/yangyinsong815/article/details/51235708

至此,脚本中所有的知识点讲解完毕,现在开始运行它吧!运行之前请确保模拟器打开!

真机运行

模拟器并不能模拟真实的手机执行,最终我们的案例还是需要在真机中进行。

真机和模拟器执行的区别在于:

真机运行需要打开USB调试所有项

7人点赞

测试教程

作者:zzulj
链接:https://www.jianshu.com/p/347c925d1d12
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

软件测试教程 自动化测试appium篇相关推荐

  1. Android自动化测试-Appium篇(二)

    Android自动化测试-Appium篇(二) 基于Appium的Android自动化测试环境部署 1. 安装Appium Desktop: a.访问Appium官网:http://appium.io ...

  2. app自动化测试appium教程之番外1——进阶补充内容

    app自动化测试appium教程之番外1--进阶补充内容 混合app测试 1. 打开app内webview debug模式 2. 验证是否为混合app 3. 切换至H5页面 4. 切回原生app 5. ...

  3. app自动化测试appium教程之三——appium基础命令(python)

    app自动化测试教程之三--appium基础命令(python) hello appium 基础操作API 教学视频参考b站课程,此文为学习记录 (免费的羊毛,要薅呀,筒子们~) 零基础入门移动自动化 ...

  4. app自动化测试appium教程之二——adb命令

    adb命令 ADB简介 获取包名和界面名 文件传输 获取app启动时间 获取手机日志[应用] 其他adb命令 教学视频参考b站课程,此文为学习记录 (免费的羊毛,要薅呀,筒子们~) 零基础入门移动自动 ...

  5. 【测试开发】自动化测试selenium篇(一)

    [测试开发]自动化测试selenium篇(一) 什么是自动化测试 如何实施自动化 发展方向 什么是selenium 什么是自动化测试 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预 ...

  6. 软件测试黑马程序员课后答案_软件测试教程课后答案

    软件测试教程课后答案 [篇一:软件测试习题答案] > 一.简答题和应用题: 1 测试人员面试题 01 .为什么要在一个团队中开展软件测试工作? 因为没有经过测试的软件很难在发布之前知道该软件的质 ...

  7. 软件测试分类,本篇博文属于对软件测试领域的科普篇

    本篇博文属于对软件测试领域的科普篇,关于软件测试领域,名词颇多,发现有许多测试新手混淆概念,甚至有不少招聘要求中对各种软件测试相关的名词乱用,所以,这里汇总测试相关的名词,也许能理清你对各种名词的概念 ...

  8. [ZT]grub4dos初级教程-入门篇

    From:http://hi.baidu.com/rabeta/blog/item/4814a81bd7d9d91c8618bff0.html 0 为何写此初级教程? 假如你是第一次听说grub,你可 ...

  9. 软件测试框架——自动化测试框架(专题)

    软件测试框架 --自动化测试框架 专题关键字: 框架( formwork ).自动化.自动化测试框架.专题 内容简介 本专题讲解什么是测试框架,以及什么是自动化测试框架?在了解框架技术的前提下具体介绍 ...

最新文章

  1. HarmonyOS 修改App的默认加载的界面
  2. TMG标准版轻松升级到企业版---TMG 2010 系列之四
  3. Java知识点总结(Java容器-EnumSet)
  4. ELK学习5_ELK文档资料:《ELK stack 权威指南/饶琛琳》推荐
  5. ASP.NET 对类进行XML序列化和反序列化
  6. 基于Android平台淘宝网手机客户端实战开发(共四季,涉及各类技术应用)
  7. STM32 USART通信
  8. c语言三级试题及答案,2013年计算机二级C语言模拟试题五及答案
  9. 排列算法 C++实现
  10. iOS 10越狱设备终于有越狱移除工具了!
  11. 解决wps在windows上弹窗等的流氓行为
  12. 深度学习之Bias/Variance偏差、方差
  13. 在github上写脚注的方法 markdown
  14. RIP --- 路由信息协议
  15. 助力千亿级市场 阿里云进军智能电动车产业
  16. ##gif录制软件——初识GifCam##
  17. [WARNING]: Platform linux on host is using the discovered Python interpreter at /usr/bin/python, but
  18. 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗
  19. AI大神Hinton再次“逃离”美国,成就了虎视眈眈的加拿大
  20. vscode怎么对选定的代码格式化?ctrl+k,ctrl+f(格式化代码)

热门文章

  1. 我的 网上商城网站布局 练习(含效果图和源码)
  2. text-shadow阴影文本
  3. 为什么收藏了这么多3D游戏建模教程,还是没达到可以就业接包的水准?
  4. 01-死磕QNX someip
  5. Rabbitmq 和erlang 安装成功但是网面访问不了
  6. 【C语言典例】——day7:尼科彻斯定理
  7. 【每周话题第七期】你是#新生代农民工#吗?你赞同IT从业者被纳入新生代农民工吗?
  8. 打开远程会议模式新篇章,华为云会议让沟通更高效!
  9. Spring框架IoC/DI原理及实现
  10. 二本应届生的大学生活、2020年总结(已上岸百度)