想了解windows下android自动化测试环境搭建的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于appium+python的相关问题,此外,我们还将为您介绍关于Android应用UI自
想了解windows 下 android 自动化测试环境搭建的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于appium+python的相关问题,此外,我们还将为您介绍关于Android应用UI自动化测试(Python+appium之appium启动APP前配置的参数)、Android自动化测试——Appium+python+Jenkins自动化测试框架搭建、Appium + python 自动化测试环境配置、Appium App自动化测试环境搭建的新知识。
本文目录一览:- windows 下 android 自动化测试环境搭建(appium+python)(appium安卓自动化测试)
- Android应用UI自动化测试(Python+appium之appium启动APP前配置的参数)
- Android自动化测试——Appium+python+Jenkins自动化测试框架搭建
- Appium + python 自动化测试环境配置
- Appium App自动化测试环境搭建
windows 下 android 自动化测试环境搭建(appium+python)(appium安卓自动化测试)
搭建步骤如下:
- 安装jdk,安装好后将jdk相关目录加入环境变量,以我的为例:
将 C:\Program Files (x86)\Java\jdk1.6.0_45\bin 加入path 系统变量
将 C:\Program Files (x86)\Java\jdk1.6.0_45\lib 加入classpath 变量(没有classpath的话自己新建) - 下载adt-bundle-windows-x86-20130522(版本可选)并解压,这是个集成了android sdk 的集成开发环境,对于开发android程序很方便。我们的自动化测试主要用到的是其中集成的android sdk,但是为了方便阅读相关代码,这个工具是比较好的一个选择。也可以直接下载android sdk
解压后的目录为(以我为例):D:\adt-bundle-windows-x86-20130522
添加环境变量,将D:\adt-bundle-windows-x86-20130522\sdk\tools目录以及D:\adt-bundle-windows-x86-20130522\sdk\platform-tools
添加至path系统变量 - 安装node.js,去node.js官网下载msi格式的安装文件,下载后安装
- 安装appium。 node.js安装成功后打开命令行,输入npm install –g appium 命令安装appium,安装完成后在命令行中输入 appium-doctor 检验appium的运行环境是否正常,如果有错误,对照错误解决即可,下图说明appium的android运行环境配置成功:
- 安装python,下载并安装python,安装后将python根目录添加至path环境变量
以我的目录为例:将C:\Python27 加至path环境变量,加入后进入命令行,输入python 出现类似下图所示的界面表示安装成功
- 安装appium的python客户端
下载python-client-master.zip包,下载地址:https://github.com/appium/python-client
下载后解压,在命令行中进入python-client-master目录,该目录下包含setup.py文件
进入后输入 python setup.py install命令安装客户端 - 启动appium。进入命令行输入appium 即可启动appium,出现如下界面表示启动成功:
8.运行测试(模拟器)
*进入命令行,输入 emulator –avd XXXX 来启动模拟器(前提是已经新建了XXXX模拟器,XXXX是已经存在的某个模拟器的名字)
*重新打开一个命令行,输入appium 命令启动appium
*运行编写好的python自动化测试脚本执行测试
9.运行测试(真机)
*将真机连接至pc,打开usb调试功能
*进入命令行,输入appium 命令启动appium
*运行编写好的python自动化测试脚本执行测试即可
Android应用UI自动化测试(Python+appium之appium启动APP前配置的参数)
desired_caps = {
'platformName': 'Android', # 被测手机是安卓
'platformVersion': '10', # 手机安卓版本
'deviceName': 'xxx', # 设备名,安卓手机可以随意填写
'appPackage': 'tv.danmaku.bili', # 启动APP Package名称
'appActivity': '.ui.splash.SplashActivity', # 启动Activity名称
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
'resetKeyboard': True, # 执行完程序恢复原来输入法
'noreset': True, # 不要重置App,如果为False的话,执行完脚本后,app的数据会清空,比如你原本登录了,执行完脚本后就退出登录了
'newCommandTimeout': 6000,
'automationName': 'UiAutomator2'
}
appPackage和appActivity获取方法:
1、打开cmd命令行窗口
2、切换到adb的sdk中的build-tools目录下,如:cd D:Porgram\Android\sdk\build-tools
3、输入命令aapt dump badging <apk路径>,如:aapt dump badging C:\Users\Anita\Desktop\VideoPlayer_1.0.5_release.apk
4、查找package:name,等于号后面的名称对应appPackage
5、查找activity:name,等于号后面的名称对应appActivity
Android自动化测试——Appium+python+Jenkins自动化测试框架搭建
目录
整体知识框架
环境准备 (windows)
appium安装和使用
deviceName 可通过adb devices 得到
appPackage 和appActivity 的获取:连接手机 dos 输入
Pycharm引入插件Appium-Python-Client----关联Appium 和Python
HTMLTestReportCN----生成测试报告
修改后的测试用例代码 :
测试用例二:FirstTest
测试用例二:SecondTest
主测试用例:使用unittest封装多个测试用例
yaml数据配置----数据分离
日志收集
logging构成
PageObject设计模式----代码封装
封装App启动配置信息
封装基类:baseview
封装通用公共类
Windows 中使用批量工具Bat文件运行测试用例
Python 启动Appium
Jenkins 持续集成
整体知识框架
环境准备 (windows)
1.jdk1.8.0 (64位)
2.android-sdk(直接下载安卓studio就都有了)
3.python:3.7
4.Appium-windows-1.15.1
5.Node.js
//以上安装并配置好环境变量
6.Appium-Python-Client
7.pycharm(用于编写脚本)
8.HTMLTestReportCN(用于生成测试报告)
//以下可选
yaml
//以下两个是为了定时执行用例和发送测试报告——可不用安装
9.Tomcat
10.Jenkins
appium安装和使用
官网地址:https://github.com/appium/appium-desktop/releases/tag/v1.15.1
下载后安装即可
deviceName 可通过adb devices 得到
appPackage 和appActivity 的获取:连接手机 dos 输入
adb shell dumpsys window | findstr mCurrentFocus
Pycharm引入插件Appium-Python-Client----关联Appium 和Python
HTMLTestReportCN----生成测试报告
下载并放入python 目录lib文件夹下
官网:https://github.com/findyou/HTMLTestRunnerCN
HTMLTestReportCN是unittest 拓展插件,二者配合使用
修改后的测试用例代码 :
测试用例二:FirstTest
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from appium import webdriver
import time
import unittest
from HTMLTestRunnerCN import HTMLTestReportCN
caps = {}
caps["platformName"] = "Android"
caps["platformVersion"] = "10"
caps["deviceName"] = "R28M3126C2W"
caps["appPackage"] = "cn.cntv"
caps["appActivity"] = "cn.cntv.ui.activity.SplashActivity"
class FirstTest(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
def tearDown(self) -> None:
self.driver.quit()
def test_start(self):
el1 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el1.click()
time.sleep(10)
el2 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_always_button")
el2.click()
time.sleep(10)
el3 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el3.click()
time.sleep(10)
el4 = self.driver.find_element_by_id("cn.cntv:id/agree")
el4.click()
time.sleep(10)
el5 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.horizontalscrollview/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.TextView")
el5.click()
el6 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.horizontalscrollview/android.widget.LinearLayout/android.widget.LinearLayout[3]/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.TextView")
el6.click()
el7 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.horizontalscrollview/android.widget.LinearLayout/android.widget.LinearLayout[4]/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.TextView")
el7.click()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(FirstTest)
unittest.TextTestRunner().run(suite)
测试用例二:SecondTest
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from appium import webdriver
import time
import unittest
caps = {}
caps["platformName"] = "Android"
caps["platformVersion"] = "10"
caps["deviceName"] = "R28M3126C2W"
caps["appPackage"] = "cn.cntv.zongyichunwan"
caps["appActivity"] = "cn.cntv.ui.activity.SplashActivity"
#TestCase类,所有测试用例类继承的基本类
class SecondTest(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
def tearDown(self) -> None:
self.driver.quit()
def test_start(self):
el1 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el1.click()
time.sleep(10)
el2 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el2.click()
time.sleep(10)
el3 = self.driver.find_element_by_id("com.android.permissioncontroller:id/permission_allow_button")
el3.click()
time.sleep(10)
el4 = self.driver.find_element_by_id("cn.cntv.zongyichunwan:id/dialog_like_ios_certain")
el4.click()
time.sleep(10)
el5 = self.driver.find_element_by_id("cn.cntv.zongyichunwan:id/btnJump")
el5.click()
time.sleep(10)
el6 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.horizontalscrollview/android.widget.LinearLayout/android.support.v7.app.ActionBar.Tab[2]/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.TextView")
el6.click()
time.sleep(10)
el7 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.ImageView[2]")
el7.click()
time.sleep(10)
self.driver.back()
el8 = self.driver.find_element_by_xpath(
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.TextView")
el8.click()
time.sleep(10)
self.driver.back()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SecondTest)
unittest.TextTestRunner().run(suite)
主测试用例:使用unittest封装多个测试用例
# import os
# os.system("python ./FirstTest.py")
# os.system("python ./SecondTest.py")
import unittest
from FirstTest import FirstTest
from SecondTest import SecondTest
import HTMLTestRunnerCN
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(FirstTest))
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SecondTest))
# 确定生成报告的路径
filePath = 'D:\ReportCN.html'
fp = open(filePath, 'wb')
# 生成报告的Title,描述
runner = HTMLTestRunnerCN.HTMLTestReportCN(stream=fp, title='自动化测试报告', description='详细测试用例结果', tester='jackron')
runner.run(suite)
yaml数据配置----数据分离
1.参数配置表:desired_caps.yaml
platformName: Android
platformVersion: 5.1.1
deviceName: 127.0.0.1:62025
app: C:\Users\Shuqing\Desktop\Appium software\chapter4\App\kaoyan3.1.0.apk
noreset: False
appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
python文件进行数据读取
rom appium import webdriver
import yaml
file=open('desired_caps.yaml','r')
data=yaml.load(file)
desired_caps={}
desired_caps['platformName']=data['platformName']
desired_caps['platformVersion']=data['platformVersion']
desired_caps['deviceName']=data['deviceName']
desired_caps['app']=data['app']
desired_caps['noreset']=data['noreset']
desired_caps['appPackage']=data['appPackage']
desired_caps['appActivity']=data['appActivity']
driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub', desired_caps)
日志收集
级别 |
何时使用 |
DEBUG |
调试信息,也是最详细的日志信息。 |
INFO |
证明事情按预期工作。 |
WARNING |
表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。 |
ERROR |
由于更严重的问题,软件已不能执行一些功能了。 |
CRITICAL |
严重错误,表明软件已不能继续运行了。 |
定义日志输出位置和输出格式
#导入logging模块
import logging
logging构成
logging模块包括logger,Handler,Filter,Formatter四个部分。
- Logger 记录器,用于设置日志采集。
- Handler 处理器,将日志记录发送至合适的路径。
- Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
- Formatter 格式化器,指明了最终输出中日志的格式。
Formatter
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%s。
格式 |
描述 |
%(levelno)s |
打印日志级别的数值 |
%(levelname)s |
打印日志级别名称 |
%(pathname)s |
打印当前执行程序的路径 |
%(filename)s |
打印当前执行程序名称 |
%(funcName)s |
打印日志的当前函数 |
%(lineno)d |
打印日志的当前行号 |
%(asctime)s |
打印日志的时间 |
%(thread)d |
打印线程id |
%(threadName)s |
打印线程名称 |
%(process)d |
打印进程ID |
%(message)s |
打印日志信息
|
logging.basicConfig(filename='runlog.log',level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
PageObject设计模式----代码封装
封装App启动配置信息
desired_caps.py
import yaml
import logging.config
from appium import webdriver
CON_LOG = '../log/log.conf'
logging.config.fileConfig(CON_LOG)
logging = logging.getLogger()
def appium_desired():
stream = open('../yaml/desired_caps.yaml', 'r')
data = yaml.load(stream)
desired_caps={}
desired_caps['platformName']=data['platformName']
desired_caps['platformVersion']=data['platformVersion']
desired_caps['deviceName']=data['deviceName']
desired_caps['app']=data['app']
desired_caps['noreset']=data['noreset']
desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
desired_caps['resetKeyboard']=data['resetKeyboard']
desired_caps['appPackage']=data['appPackage']
desired_caps['appActivity']=data['appActivity']
logging.info('start run app...')
driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub', desired_caps)
driver.implicitly_wait(8)
return driver
if __name__ == '__main__':
appium_desired()
封装基类:baseview
class BaseView(object):
def __init__(self,driver):
self.driver=driver
def find_element(self,*loc):
return self.driver.find_element(*loc)
封装通用公共类
common_fun.py
from appium_advance.page_object.baseView import BaseView
from selenium.common.exceptions import NoSuchElementException
import logging
from selenium.webdriver.common.by import By
from appium_advance.page_object.desired_caps import appium_desired
class Common(BaseView):
cancelBtn=(By.ID,'android:id/button2')
skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip')
def check_cancelBtn(self):
logging.info("============check_cancelBtn===============")
try:
element = self.driver.find_element(*self.cancelBtn)
except NoSuchElementException:
logging.info('update element is not found!')
else:
logging.info('click cancelBtn')
element.click()
def check_skipBtn(self):
logging.info("==========check_skipBtn===========")
try:
element = self.driver.find_element(*self.skipBtn)
except NoSuchElementException:
logging.info('skipBtn element is not found!')
else:
logging.info('click skipBtn')
element.click()
if __name__ == '__main__':
driver=appium_desired()
com=Common(driver)
com.check_updateBtn()
com.check_skipBtn()
Windows 中使用批量工具Bat文件运行测试用例
@echo off
appium
pause
@echo off
D:
cd D:\study\PycharmProjects\HelloTest
start python MainTest.py
Python 启动Appium
import subprocess
from time import ctime
def appium_start(host,port):
'''启动appium server'''
bootstrap_port = str(port + 1)
cmd = 'start /b appium -a ' + host + ' -p ' + str(port) + ' -bp ' + str(bootstrap_port)
print('%s at %s' %(cmd,ctime()))
subprocess.Popen(cmd, shell=True,stdout=open('./appium_log/'+str(port)+'.log','a'),stderr=subprocess.STDOUT)
if __name__ == '__main__':
host = '127.0.0.1'
for i in range(2):
port=4723+2*i
appium_start(host,port)
Jenkins 持续集成
jenkins定时构建语法
* * * * *
(五颗星,中间用空格隔开)
第一个*表示分钟,取值0~59
第二个*表示小时,取值0~23
第三个*表示一个月的第几天,取值1~31
第四个*表示第几月,取值1~12
第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
每天下午下班前18点定时构建一次
0 18 * * *
每天早上8点构建一次
0 8 * * *
每30分钟构建一次:
H/30 * * * *
Appium + python 自动化测试环境配置
--------------------------------------------------------------1. jdk-8u121-window(32位的就下载32位的,64位的就下载64位的)。2.Android-sdk_r24.3.4-windows(下载这个adt-bundle-windows-x86-20140624)3.Python:(V3.6也可以)4.appium:1.4.13.15.Node.js:node-v4.4.7-x646.Appium-python-Client7.pycharm————————————————--------------------------------1.1jdk1.8.exe 安装,配置环境变量 classpath值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; path值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin cmd -> java 测试配置成功!2.1 下载SDK 已经有包了 安装好就可以 注意:必须打开设置 SDK marager 下载Tools前3个 环境变量: 新建:ANDROID_HOME = 路径 path:%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;cmd-> adb 测试3.1官网下载 python 环境变量:安装完成后将D:\python和D:\python\Scripts,添加到环境变量path下 cmd -> python -v 测试4.1nodeJS 安装nodejs包,配置nodejs 环境变量 cmd -> npm -v cmd -> 配置淘宝镜像源 npm install -g appium appium –v npm install -g appium-doctor appium-doctor(测试语句)5.1软件安装 appinum 下载链接:https://github.com/appium/appium-desktop/releases 打开exe配置 : 127.0.0.1 默认端口 pip install Appium-Python-Client测试 cmd -> adb devices 连接模拟器的手机6.1 安装pycharm编辑器大功告成!
Appium App自动化测试环境搭建
一、安装Python
python下载地址:可以去python官网:https://www.python.org/下载对应机器的安装包。以下版本可以任意选择进行下载。
双击已下载的python安装包,出现如下图所示的界面,点击运行,
<ignore_js_op>
然后下一步下一步进行默认安装即可,安装成功后会有对应的路径:
添加环境变量后,输入python就会直接进入python的环境中,现在开始演示手动添加到环境变量: 首先,点击计算机->属性->高级系统设置
二、JDK环境变量配置 2.1) jdk下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 。 下载并进行安装。 <ignore_js_op>
2.3)验证JDK环境是否OK 打开cmd输入java -version进行验证,如下图表示ok。 <ignore_js_op>
4、 下载nodejs 并配置环境变量 4.1)下载地址: http://www.nodejs.org/ 4.2)环境配置: 将node安装路径D:\Program Files\nodejs(具体根据你安装的路径决定)添加到环境变量Path中。 4.3)验证环境变量: 打开cmd输入node -v或者npm -v,如下图即正常: <ignore_js_op>
6、安装其他依赖库 在cmd下输入如下命令:
- pip install selenium
- pip install Appium-Python-Client
7、Appium第一个程序运行 1、电脑插上手机真机或者电脑安装手机模拟器 2、手机真机或者模拟器开启调试模式,设置开发者选项->USB调试开启 3、cmd中输入adb devices 查看手机是否和电脑正常连接 4、启动appium server 5、pycharm编写第一个appium 代码demo 流程:
- 1)首先打开模拟器或者插上一个真机
- 2)adb devices 验证设备是否可以和模拟器正常通信
- 3)adb install 安装apk
- 4)启动appium server
- 5)运行脚本
http://www.bcbxhome.com/bcbx/forum.PHP?mod=viewthread&tid=9&fromuid=27
(出处: 编测编学软件测试)
关于windows 下 android 自动化测试环境搭建和appium+python的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android应用UI自动化测试(Python+appium之appium启动APP前配置的参数)、Android自动化测试——Appium+python+Jenkins自动化测试框架搭建、Appium + python 自动化测试环境配置、Appium App自动化测试环境搭建的相关知识,请在本站寻找。
本文标签: