• 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

  • 相关阅读:
    NOIP2011 D1T1 铺地毯
    NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
    POJ 2513 trie树+并查集判断无向图的欧拉路
    599. Minimum Index Sum of Two Lists
    594. Longest Harmonious Subsequence
    575. Distribute Candies
    554. Brick Wall
    535. Encode and Decode TinyURL(rand and srand)
    525. Contiguous Array
    500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/liuyun66535309/p/8729374.html
Copyright © 2020-2023  润新知