zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用Vue.extend来动态创建组件
    SKU
    城市选择
    面试题整理
    清除本域名Cookies
    vue 使用腾讯IM即时通信
    路由重复加载报错的问题
    Vue 、H5音乐播放器播放音乐
    Android 开发实用方法大全
    Android 欢迎界面淡入效果并用WebView加载网址
  • 原文地址:https://www.cnblogs.com/liuyun66535309/p/8729374.html
Copyright © 2011-2022 走看看