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

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脚本测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容