美文网首页
2.appium 基础

2.appium 基础

作者: 艺名徐太宇 | 来源:发表于2018-05-22 15:15 被阅读0次

    启动

    Appium启动时需要指定一些通用配置,统称为Desired Capabilities,具体的一些参数可以参考Appium服务器初始化参数。这里介绍一些通用的参数与一些常见的问题。

    platformName
    手机操作系统

    platformVersion
    手机操作系统版本

    deviceName
    手机类型

    app
    待测app的路径

    appActivity, appPackage
    appActivity与appPackage指用于启动待测app的activityName与packageName,appium(1.6.4)已经支持activityName与packageName的自动检测,这两个参数已经可以省略了

    newCommandTimeout
    两条appium命令间的最长时间间隔,若超过这个时间,appium会自动结束并退出app

    noReset, fullReset
    noReset 不要在会话前重置应用状态。默认值false。 fullReset (Android) 通过卸载而不是清空数据来重置应用状态。在Android上, 这也会在会话结束后自动清除被测应用。默认值false。

    unicodeKeyboard, resetKeyboard
    在输入的时候,可能出现键盘挡住控件的情况,这时候需要使用 appium 提供的输入法(支持输入多语言,没有键盘 ui ),unicodeKeyboard 为 true 表示使用 appium-ime 输入法。 resetKeyboard 表示在测试结束后切回系统输入法。

    appWaitActivity, appWaitPackage
    appium需要等待的activityName与packageName,与appActivity不同的是,对于有启动动画的app来说,appWaitActivity应该是启动activity消失后出现的activity。这两个参数可以指定多个。


    控件定位

    android sdk的tools目录下自带一个元素查看工具uiautomatorviewer,通过这个工具可以获取到app的各个元素属性,辅助我们编写相关的脚本,uiautomatorviewer的界面如下:


    常用的定位方法:
    id
    使用元素的resource-id属性定位,如:
    driver.find_element_by_id('com.android.calculator2:id/digit1')

    class
    使用元素的class属性定位,如:driver.find_element_by_class_name('android.widget.Button')

    xpath
    定位速度很慢,不推荐。xpath的定位方式很多,这里就不一一叙述了。


    基本操作

    .click()
    点击操作,一般用在查找元素后面,如:
    driver.find_element_by_id('com.android.calculator2:id/digit1').click()

    .send_keys
    输入操作,一般用在查找元素后面,如:
    driver.find_element_by_class_name('android.widget.EditText').send_keys("123456")

    .clear()
    清除文本框内的所有字段,如:
    driver.find_element_by_class_name('android.widget.EditText').clear()

    swipe()
    滑动操作,如:
    driver.swipe(900,1320,180,600,1000)
    括号内的五个值分别是x坐标的起始位置、y坐标的起始位置、x坐标的目标位置、y坐标的目标位置和滑动时长(毫秒)

    wait_activity()
    等待activity出现时间,如:
    wait_activity('.activity.HomeActivity',5)
    括号内前面的是要等待的activity,后面的是超时时间,单位是秒。若超过这个时间等待的activity还没出现就跳过这个命令。


    组织用例

    unittest是python的一个单元测试框架,它可以帮助我们有效组织用例,把用例的不同部分区分开来。我们写一个登录的测试脚本:


    使用的APP
    import unittest
    from time import sleep
    from appium import webdriver
    
    class Login(unittest.TestCase):
    
        def setUp(self):
            desired_caps = {}
            desired_caps['platformName'] = 'Android'
            desired_caps['platformVersion'] = '6.0'
            desired_caps['deviceName'] = 'Huawei'
            desired_caps['appPackage'] = 'com.happy.food'
            desired_caps['appActivity'] = 'com.happy.food.activity.LauncherActivity'
            desired_caps["unicodeKeyboard"] = True
            desired_caps["resetKeyboard"] = True
    
            url = "http://127.0.0.1:4723/wd/hub"
    
            global driver
            driver = webdriver.Remote(url,desired_caps)
            sleep(3)
    
        def test_login(self):
            EditText = driver.find_elements_by_class_name("android.widget.EditText")
            #获取所有的输入框
            EditText[0].send_keys("13410066133")
            EditText[1].send_keys("1234567a")
            driver.find_element_by_id("com.happy.food:id/login").click()
            sleep(3)
    
        def tearDown(self):
            driver.quit()
    
    if __name__ == '__main__':
        unittest.main()
    

    运行脚本:

    /Users/yaulola/Public/appium-Android/venv/bin/python /Users/yaulola/Desktop/appium/test.py
    .
    ----------------------------------------------------------------------
    Ran 1 test in 42.277s
    
    OK
    
    Process finished with exit code 0
    

    setUp在每条用例前执行,
    tearDown在每条用例后执行,
    test_xxx 为要执行的用例,必须以test开头。

    相关文章

      网友评论

          本文标题:2.appium 基础

          本文链接:https://www.haomeiwen.com/subject/wymhjftx.html