Java和安卓环境安装和配置
安装java JDK 并配置环境变量
1.新建环境变量: JAVA_HOME
2.新建环境变量: CLASS_PATH: .,%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(注意最开始那个.)
3.在PATH里面增加: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
Android环境配置
1.解压android-sdk-windows.rar
2.新建环境变量ANDROID_HOME,将压缩的sdk路径配置到该环境变量中
3.在PATH里面添加: %ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
adb的基本工作原理
ADB(android debug brideg)是android平台的调试工具
ADB包含三部分
1.Client端:运行在开发机中,即你的开发电脑,用来发送ADB命令
2.Server端:同样运行在开发机器中,用来管理Client端和手机的Deamon之间的通信
3.Deamon守护进程:运行在调试设备中,手机或模拟器,用来接受并执行ADB命令
常用adb命令
将手机端的连接写成批处理文件
获取包名和activity名
包名:package name 用于唯一标识一个app应用(注意不是应用的名字,应用的名字可以相同,但包名一定不同,也不是apk的名字)
apk: 每一个安卓应用的安卓包后缀叫apk.可以被安装在安卓手机上
activity名:在Android中每个界面叫一个activity,获取activity名其实就是获取界面名
应用场景:自动化测试需要通过代码的形式告诉手机测试的是哪个应用的哪个界面,可以通过这个命令进行获取
步骤:1.先使用adb连接模拟器 2.在命令行中运行命令,获取当前显示的activity的名字:
adb shell dumpsys window windows | findstr mFocusedApp
文件传输相关命令
安装和卸载apk包
查询本机所有的应用程序包
查询apk包名和启动activity名字
截取当前界面
Appium
Appium是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持IOS、Android和FirefoxOS平台。Appium驱动Android的UIAutomator框架,使用Selenium的WebDriver JSON协议 Appium测试调用了Selenium的client库使其可以使用任意的语言
Appium核心是一个web服务器,提供了一套REST接口。它收到客户端的连接,监听到命令,接着在移动设备上执行这些命令,然后将执行结果放到HTTP响应中返还给客户端
特点:多语言编写测试代码,可以将服务器放在不同的机器上
Appium环境配置:appium的客户端 appium-python库
Appium启动设置
from appium import webdriver
from appium import webdriver
desired_cap={}
#必须参数,定义被测脚本的平台属性
desired_cap['platformName']='Android'
#必须参数,定义被测手机的安卓版本号(设置->关于本机->android版本,必须跟被测机对得上,不能乱写,大版本不能错,小版本可以不用写)
desired_cap['platformVersion']='7.1.2'
#可以写任意的值,但不能为空
desired_cap['deviceName']='127.0.0.1:62001'
#必须参数,指定被测软件的包名
desired_cap['appPackage']='com.android.settings'
#必须参数,指定要打开的app的页面是哪个
desired_cap['appActivity']='.Settings'
#不是必须的,但一般需要指定,appium封装的底层android测试工具
desired_cap['automationName']='Uiautomator2'
#设置app的重置策略
desired_cap['noReset']=True
#设置命令的超时时间
desired_cap['NewCommandTimeout']=6000
#用于设置中文输入
desired_cap['unicodeKeyboard']=True
desired_cap['resetKeyboard']=True
driver=webdriver.Remote('http://localhost:4723/wd/hub', desired_cap)
uiautomatorviewer的使用
对混合app元素的识别
下载好对应的Chromedriver的驱动 下载之后将路径添加到appium的Chromedriver Binary Path里面
import time
from appium import webdriver
desired_cap={}
#必须参数,定义被测脚本的平台属性
desired_cap['platformName']='Android'
#必须参数,定义被测手机的安卓版本号(设置->关于本机->android版本,必须跟被测机对得上,不能乱写,大版本不能错,小版本可以不用写)
desired_cap['platformVersion']='7.1.2'
#可以写任意的值,但不能为空
desired_cap['deviceName']='127.0.0.1:62001'
#必须参数,指定被测软件的包名
desired_cap['appPackage']='com.ibox.calculators'
#必须参数,指定要打开的app的页面是哪个
desired_cap['appActivity']='.CalculatorActivity'
#不是必须的,但一般需要指定,appium封装的底层android测试工具
desired_cap['automationName']='Uiautomator2'
#设置app的重置策略
desired_cap['noReset']=True
#设置命令的超时时间
desired_cap['NewCommandTimeout']=6000
#用于设置中文输入
desired_cap['unicodeKeyboard']=True
desired_cap['resetKeyboard']=True
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_cap)
driver.implicitly_wait(10)
dic=[
{'num1': 64,'num2': 98,'op':'+'},
{'num1': 789,'num2': 35,'op':'-'},
{'num1': 72,'num2': 65,'op':'*'},
{'num1': 831,'num2': 92,'op':'/'}
]
op_dic={
'+':'plus',
'-':'minus',
'*':'mul',
'/':'div'
}
for exp in dic:
#解析第一个操作数
for word in str(exp['num1']):
driver.find_element('id','com.ibox.calculators:id/digit{}'.format(word)).click()
#解析操作符
driver.find_element('id','com.ibox.calculators:id/{}'.format(op_dic[exp['op']])).click()
#解析第二个操作数
for word in str(exp['num2']):
driver.find_element('id','com.ibox.calculators:id/digit{}'.format(word)).click()
#点击等于符合
driver.find_element('id','com.ibox.calculators:id/equal').click()
#定位结束框,并且读出数据
print(driver.find_element('xpath','//android.widget.TextView[@index="1"]').text)
高级手势操作
TouchAction
from appium.webdriver.common.touch_action import TouchAction
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
desired_cap={
'platformName':'android',
'platformVersion':'7.1.2',
'deviceName':'127.0.0.1:62001',
'appPackage':'com.android.settings',
'appActivity':'.Settings',
'automatonName':'Uiautomator2'
}
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_cap)
while True:
try:
driver.find_element('xpath','//*[@text="开发者选项"]').click()
break
except NoSuchElementException:
driver.swipe(555,670,555,400,duration=1000)
在app中针对日期控件的常见的处理方式:
1.如果是第三方库,并且有公开的api接口,就可以直接使用python或者android的uiautomator这个工具直接去调用,从而设置日期的值,避免从界面上操作
2.通过界面方式进行滑动选择操作,没有api也可以直接使用,编程和操作效率比较低
from appium import webdriver
desired_cap={
'platformName':'android',
'platformVersion':'7.1.2',
'deviceName':'127.0.0.1:62001',
'appPackage':'com.laogejizhang.account',
'appActivity':'.MainActivity',
'automatonName':'Uiautomator2',
'noReset':True,
'newCommandTimeout':6000
}
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_cap)
driver.implicitly_wait(10)
def select_data(year,month,day):
current_year=driver.find_element('xpath','//*[@bounds="[163,783][293,817]"]').text
current_month=driver.find_element('xpath','//*[@bounds="[]"]').text
while True:
if int(current_year) == int(year):
break
if int(current_year) > int(year):
driver.swipe(274,740,274,800,duration=1000)
else:
driver.swipe(274,800,274,740,duration=1000)
while True:
if int(current_month) == int(month):
break
if int(current_month) > int(current_month):
driver.swipe()
else:
driver.swipe()
driver.find_element('xpath','//android.view.ViewGroup[@index="5"]/android.widget.ImageView').click()
driver.find_element('xpath','//*[@text="信用卡"]').click()
driver.find_element('xpath','//*[@text="广发银行"]').click()
driver.find_element('xpath','//*[@text="请输入账单日期"]').click()
select_data('2019','10','11')
Appium手机操作
from appium.webdriver.connectiontype import ConnectionType
0(None) 1(Airplane Mode) 2(Wifi only) 4(Data only) 6(All networl on)