美文网首页自动化测试自动化测试iOS开发者图书馆
Mac 下 appium 自动化测试iOS 测试配置和脚本编写(

Mac 下 appium 自动化测试iOS 测试配置和脚本编写(

作者: 红发_KVO | 来源:发表于2018-05-25 15:00 被阅读934次

    Mac 下 appium +python 自动化测试系列:
    Mac 下搭建 appium+ios+python 自动化测试环境(一)
    Mac 下 appium 自动化测试iOS 测试配置和脚本编写(二)
    Mac 下 搭建appium +android+python 自动化测试环境(三)
    Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)

    书接上回,环境配置已经耗光了我所有耐性,终于到了收割的时候,开始测试我们第一个测试脚本吧!

    一、 sample_code_python 的脚本测试验证

    • 1.开启 appium desktop
    image
    • 2.配置我们要测试的的.app信息

      进入的界面如下,当然是没有我哪些输出信息的

    image
    image
    • 3.开启 Inspector来查看元素定位和界面元素查找
    image
    • 4.配置我们的脚本来测试

      脚本来自网上下的 sample_code

    git clone https://github.com/appium/sample-code
    
    cd /Users/xxxx/Downloads/sample-code-master/sample-code/apps/TestApp(xxx 是你自己的目录)
    
    xcodebuild -sdk iphonesimulator
    

    如果出现*** BUILD SUCCEEDED ***则表示编译成功(指令是在目录下生成个一个.app 文件,目录大致如下:/Users/XXXX/Downloads/sample-code-master/sample-code/apps/TestApp/build/Release-iphonesimulator/TestApp-iphonesimulator.app )

    完成之后,我们进入到 example 的目录

    image
    选择用 Xcode打开或者下载一个 IDEPyCharm来打开,当然PyCharm强大很多
    image
    其中参数定义如下:
    `app`            :我们需要测试的 app的地址,填我们机子上的绝对地址
    `platformName`   :'iOS'我们测试的平台
    `platformVersion`:'ii.3',这是我们的版本号,手机版本
    `deviceName`     :'iPhone 8 Plus'这是我们需要的测试的机型,模拟器也行,会自己找,如果是真机需要填真机的 `UUID`
    

    接着修改以下部分,因为 demo里面的元素查找不到报错


    image

    接着,我们可以在PyCharm或者终端里面运行 ios_simple.py了,每次脚本运行前确定 appium 已经启动!
    PyCharm方式,第一次右键会有 run ios_simple.py的选项:

    image

    终端方式如下,进入到你需要运行的脚本目录下,我这里是 python 脚本模式:

    cd /Users/XXXX/Downloads/sample-code-master/sample-code/examples/python
    python ios_simple.py
    
    Ran 2 tests in 0.058s
    
    FAILED (errors=2)
    xxxxdeiMac:python xxxxx$ python ios_simple.py 
    test_scroll (__main__.SimpleIOSTests) ... ok
    test_ui_computation (__main__.SimpleIOSTests) ... ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 18.646s
    
    OK
    
    上面就是**sample_code_python** 方式的脚本测试了!接下来,我们书写自己的脚本了!
    

    二、自定义脚本测试用例详解

    • 1.脚本录制

      Inspector 提供脚本录制功能,至于如何操作,请看下面的 gif 把,我简单录制一下:


      image

      录制的脚本如下:

    el1 = driver.find_element_by_accessibility_id("进入主页面")
    el1.click()
    el2 = driver.find_element_by_accessibility_id("登录")
    el2.click()
    el3 = driver.find_element_by_xpath("//XCUIElementTypeApplication[@name=\"UTengineFrameworkTest\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[2]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[2]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[1]")
    el3.click()
    el4 = driver.find_element_by_accessibility_id("返回")
    el4.click()
    

    当然,,录制出来的脚本我们可能是无法直接使用的,需要自己修改!另外,里面的 xpath 查找元素并不一定是正确的,需要多次调试!最好的办法就是让开发者每个控件都设置accessibilityIdentifier,例如:

    [self.label setAccessibilityIdentifier:@"呵呵哒"]
    

    这样子找起来就方便准确多了

    • 2.自定义编写脚本,按照可以上传到阿里 MQC 云测试的模式

      开始我们自己编写属于自己的脚本吧!我们会新建两个.py 脚本,放在同一目录下,分别为:desired_capabilities.py 和 main.py
      具体内容如下:
      desired_capabilities.py 里面内容如下:

    #!/usr/bin/python 
    # -*- coding: UTF-8 -*-
    
    import sys
    
    def get_desired_capabilities():
        desired_caps = {
            #平台名称
            'platformName': 'iOS',
            #平台版本
            'platformVersion': '11.3',
            #设备名称
            'deviceName': 'iPhone 8 Plus',
            #app 的地址
            'app': '/Users/tanzhiwu/Desktop/appium自动化测试/UTengineFrameworkTest.app',
            #bundleid 如果没有填 app 地址,填了这个 id 就会直接运行已安装的 app
            'bundleId': 'com.ut.pc.UTengineFrameworkTest',
            #超时时间
            'newCommandTimeout': 60,
            #自动化测试平台
            'automationName': 'Appium',
            #是否不重新安装启动
            'noReset': True
            #自动处理系统权限弹框
            #`autoAcceptAlerts`:True 低版本有效
        }
        return desired_caps
        
    #获取服务器端口地址
    def get_uri():
        return 'http://localhost:4723/wd/hub'
    
    def flushio():
        sys.stdout.flush()
    

    main.py的内容如下:

    # -*- coding: UTF-8 -*-
    from appium import webdriver
    import desired_capabilities
    import time
    from time import sleep
    import unittest
    
    
    class MyIOSTest(unittest.TestCase):
    
    #setUp 和 tearDown 配对使用,场景是每个测试用例运行完都重启
    
    
        #def setUp(self):
            #获取我们设定的 capabilities,通知 appium Server 创建相应的对话
            #desired_caps = desired_capabilities.get_desired_capabilities()
            #获取 Server 的地址
            #uri          = desired_capabilities.get_uri()
            #创建会话,得到 driver 对象,driver 对象封装了所有的设备操作
            #self.driver = webdriver.Remote(uri,desired_caps)
            #设定等待时间,系统函数,在这个时间内会持续获取,超时会失败
            #self.driver.implicitly_wait(10)
            #处理系统权限弹框(新版本方法)
            #self.driver.switch_to.alter.accept()
    
    
        #def tearDown(self):
            #测试结束,退出会话
            #self.driver.quit()
    
    #setUpClass 和 tearDownClass配套使用,场景是不间断测试,后续测试用例依赖前一个测试用例的环境
        @classmethod
        def setUpClass(self):
            desired_caps = desired_capabilities.get_desired_capabilities()
    
            uri          = desired_capabilities.get_uri()
    
            self.driver = webdriver.Remote(uri,desired_caps)
    
            #self.driver.implicitly_wait(10)
    
        @classmethod
        def tearDownClass(self):
    
            self.driver.quit()
    
        #自定义元素查找方法
        def wait_for_element(self,xpath=None, id=None, name=None, index=None,timeOut= 20):
            starTime = time.time()
            nowTime  = time.time()
            while nowTime -starTime <timeOut:
            # 通过xpath 查找控件
                try:
                    if xpath is not None:
                        el = self.driver.find_element_by_xpath(xpath)
                        return el
                except:
                   pass
            #通过 id 或者 name 查找控件
                try:
                    if id is not None:
                        if index is not None:
                            return self.driver.find_element_by_accessibility_id(id)[index]
                        else:
                            return self.driver.find_element_by_accessibility_id(id)
                except:
                    pass
            #通过 name 查找控件
                try:
                    if name is not None:
                        if  index is not None:
                            return self.driver.find_elements_by_class_name(name)[index]
                        else:
                            return self.driver.find_element_by_name(name)
    
                except:
                    pass
    
                sleep(1)
                nowTime = time.time()
            raise Exception("Element xpath[%s] id[%s] name[%s] index[%s] not found" % (xpath, id, name, index))
    
    
        def test_1(self):
    
            mainBtn = self.wait_for_element(id="进入主页面")
            mainBtn.click()
    
            loginBtn = self.wait_for_element(id="登录")
            loginBtn.click()
    
        def test_2(self):
            sleep(3)
            item1 = self.wait_for_element(name="名字")
            item1.click()
    
            backItem = self.wait_for_element(id="返回")
            backItem.click()
    
    
    
    if __name__ == '__main__':
       # try:unittest.main()
       # except SystemExit:pass
       suite = unittest.TestSuite()
       suite.addTest(MyIOSTest("test_1"))
       suite.addTest(MyIOSTest("test_2"))
       unittest.TextTestRunner(verbosity=2).run(suite)
    

    这个时候最好就是上图来演示下我们的自动化测试结果了,有个注意点,右键开始 run 的时候不要放在测试用例体内,不然只会运行当前测试用例:


    image

    至此,我们iOS 端的测试python 自动化功能测试脚本就完成了。当然我这里只是简单的写两个用例,真的在生产环境中的时候,需要分割成不同的模块去编写测试用例,还有更细致的容错管理等!抛砖引玉一下,希望大家也能分享比较成熟的脚本编写方案,指导一下我们这种希望了解自动化测试的的新人!

    参考:

    Desired Capabilities Documentation

    Python脚本测试

    相关文章

      网友评论

      • iHTCboy:感谢!有空在学习!
      • 顾顾314:你好,可以向你请教一个问题吗?我在运行示例脚本 ios_simple.py这个文件时,总是报错:Cannot run program "/System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6" (in directory "/Users/guxuecheng/Desktop/sample-code/sample-code/examples/python"): error=2, No such file or directory。请问你知道什么原因导致的吗?
        红发_KVO:@夜_明月离城 一般会用系统的python运行脚本,我用的是pycharm这个ide,具体配置直接设置#!/usr/bin/python3 这样子
        顾顾314:我是用的是 Mac,系统预装的是 Python2,我又安装了一个 Python3.而我下载的 samlpe_code 文件放在了Desktop。请问方便指导一下怎么配置吗?Python3的安装路径是:/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages。
        Python2的安装路径是:/Library/Python/2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC。刚发现在 Python2.7的相同路径下还有一个 Python2.6.
        红发_KVO:@夜_明月离城 python路径错了,你py那里配置一下,或者版本低了……
      • 5bba73879f2a:相比是很辛苦了...牛逼啊 大兄弟
      • 飞飞飞鱼哥:不明觉厉,赞一个
      • 羽之_HB:好东西:+1:

      本文标题:Mac 下 appium 自动化测试iOS 测试配置和脚本编写(

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