Appium之Native App自动化

Appium的介绍

Appium是一个开源、跨平台的自动化测试工具,用于测试Native(原生)和Hybrid(混合) 应用,支持IOSAndroidFirefoxOS(已倒闭)平台

AppiumAndroid平台实现自动化,是基于UIAutomator框架的

Appium的理念

1、无需重新编译应用

2、不局限于语言和框架

3、无需重复造轮子,接口统一

4、无论精神上,还是名义上,必须开源

Appium的特点

跨架构:Native Hybrid Webview

跨设备:Android IOS Firefox OS

跨语言:Java Python Ruby PHP JavaScript

跨进程:不依赖源码(基于UIAutomator

脚本实现:测试计算器的加法、减法功能

—— Appium的配置、启动

测试平台-PlatformName: 可选androidFirefoxOS ,IOS在页面顶部选择

选择框架-AutomationName:测试NativeAppium,测试HybridSelendroid

系统版本-PlatformVersion:可进入手机查看系统版本号

配置完成后,收起配置菜单。在页面右上角点击Launch’启动Appium

Appiumlog中,如果出现:[Appium] Appium REST http interface listener started on 0.0.0.0:4723 那就说明,Appium的服务已经启动

 代码示例:

#urs/bin/python
#coding:utf8
import unittest,time
from appium import webdriver

class MyTestCase(unittest.TestCase):
    #脚本初始化,获取操作实例
    def setUp(self):
        desired_caps={}
        desired_caps['platformName']=''#指定平台
        desired_caps['platformVersion']=''#和Appium里设置的一样
        desired_caps['deviceName']=''#指定需要控制的设备,在控制台中输入adb devices 就会出现deviceName
        desired_caps['appPackage']=''#被测试程序的packageName,在控制台中输入adb logcat | grep(findstr) START
        desired_caps['appActivity']=''#packageName中/后面的就是这个
        desired_caps['unicodeKeyboard']='True'#更改测试机的输入法
        desired_caps['resetKeyboard']='True'#将更改后的输入法还原为机器原来的输入法,值为false则不还原
        #获得操作程序的句柄,用Remote实现
        #4723可以在启动APPium时,看到
        self.driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
        
    #释放实例,释放资源
    def tearDown(self):
        self.driver.quit()
        
    #测试的脚本
    def test_Add(self):
        #判断APP是否安装了
        print self.driver.is_app_installed('com.example.zhangjian.minibrowser2')#参数:APP包名
        #删除APP
        self.driver.remove_app('com.example.zhangjian.minibrowser2')#参数:APP包名
        #安装APP,(会遇到一个问题,初始化时由于没有这个APP会报错,可以修改初始化时的APP,然后这里的语句再安装我们想要安装的APP)
        self.driver.install_app('Users/zhangjiang/Downloads/app-debug.apk')#参数:APP在当前系统下的路径
        #启动APP
        self.driver.launch_app()
        time.sleep(3)
        
        #关闭APP
        self.driver.close_app()
        self.driver.launch_app()
        #启动activity
        self.driver.start_activity('com.example.zhangjian.minibrowser2','.myapplication.NewActivity')#参数1:包名,参数2:activity名
        #截屏
        time.sleep(3)
        self.driver.get_screenshot_as_file('test.png') # 图片保存在当前脚本目录下
        time.sleep(5)
        
        #快速滑动 API flick的用法
        self.driver.flick(100,750,100,100)
        #当前activity API current_Activity的用法
        print self.driver.current_activity
        #将某一个APP置于后台,3s钟后再调回前台
        self.driver.background_app(3)
        #等待指定activity显示API wait_activity的用法
        print self.driver.wait_activity('activity名称',3,1)# 3表示等待3秒,1表示1秒中check一下activity是否显示了
    
        #Locate定位一个元素,Operate操作一个元素
        self.driver.find_element_by_id('digit8').click()
        self.driver.find_element_by_id('plus').click()
        self.driver.find_element_by_id('digit5').click()
        self.driver.find_element_by_id('equal').click()
        #Verify验证结果
        #获取计算结果,结果处无id,使用class定位元素
        try:
            value=self.driver.find_element_by_class_name('android.widget.EditText').text
            self.assertEqual('13',value)
        except Exception:
            print u'出现异常了'
            self.fail(u'程序出现异常')
        #Exception异常处理的情况
        
    def testOtherAPI(self):
        '''
        elements=self.driver.find_elements_by_id("digit8")
        elements[0].click()
        time.sleep(3)
        print len(elements)'''
        
        # find_element_by_accessibility_id 的用法
        self.driver.find_element_by_id('digit1').click()
        self.driver.find_element_by_id('digit0').click()
        # accessibility 定位取content-desc的属性值
        self.driver.find_element_by_accessibility_id(u"").click()# 点击“除号”
        
        self.driver.find_element_by_id("equal").click()
        time.sleep(3)
        
    def test_moreAPI(self):
        #获取元素列表
        els=self.driver.find_elements_by_class_name("")
        '''
        # 1.滚动scroll的用法
        # 指定从某个元素滚动到另一个元素的位置
        self.driver.scroll(els[10],els[1])
        # 2.拖拽drag_and_drop的用法
        # 选中某个元素拖拽到另一个元素的位置
        self.driver.drag_and_drop(els[10],els[3])
        # 3.滑动swipe的用法
        # 需要传入4个参数(start_x,start_y,end_x,end_y)
        self.driver.swipe(100,750,100,100)
        # 4.点击tap的用法
        # 参数传入坐标点
        self.driver.tap([(100,750)])
        '''
        # 1.快速滑动flick的用法
        self.driver.flick(100,750,100,100)
        # 2.显示当前activity的api current_activity的用法
        print self.driver.current_activity
        # 3.将某一个app置于后台,3s后再调回前台
        self.driver.background_app(3)
        # 4.等待指定activity显示API
        print self.driver.wait_activity('activity名称',3,1)# 3表示等待3秒,1表示1秒中check一下activity是否显示了
        
if __name__=='__main__':
    unittest.main()

*** 常用API介绍 ***

scroll()       操作滚动条

drag_and_drop()   拖动元素到指定位置

swipe()        配合up(下滑)或down(上滑)使用

flick(x,y,x,y)      滑动

tap()                 点击

get_screenshot_as_file(截屏路径)   进行截屏

press_keycode()            Keycode_0 数字0对应键值7 即:Press_keycode(7)代表输入一个数字0以此类推数字9对应键值16

find_element_by_accessibility_id() accessibility 定位取content-desc的属性值

current_activity()   输出当前activity的名字

wait_activity()     等待activity显示

start_activity()      启动activity下的某一个活动页面

is_app_installed(package)   判断APP是否安装了

install_app(package路径)       安装APP

remove_app(package)        删除APP

launch_app()             启动APP(无需传入参数,启动的是初始化时指定的app)

close_app()             关闭APP

background_app()       将APP指给后台,在多长时间后再返回给前台,参数:时间 单位:秒

***END

原文地址:https://www.cnblogs.com/liuyun66535309/p/8729374.html