Mac 下 appium +python 自动化测试系列:
Mac 下搭建 appium+ios+python 自动化测试环境(一)
Mac 下 appium 自动化测试iOS 测试配置和脚本编写(二)
Mac 下 搭建appium +android+python 自动化测试环境(三)
Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)
书接上回,环境配置已经耗光了我所有耐性,终于到了收割的时候,开始测试我们第一个测试脚本吧!
一、 sample_code_python 的脚本测试验证
- 1.开启 appium desktop
-
2.配置我们要测试的的.app信息
进入的界面如下,当然是没有我哪些输出信息的
image
- 3.开启 Inspector来查看元素定位和界面元素查找
-
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 的目录
选择用
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
的选项:
终端方式如下,进入到你需要运行的脚本目录下,我这里是 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 自动化功能测试脚本就完成了。当然我这里只是简单的写两个用例,真的在生产环境中的时候,需要分割成不同的模块去编写测试用例,还有更细致的容错管理等!抛砖引玉一下,希望大家也能分享比较成熟的脚本编写方案,指导一下我们这种希望了解自动化测试的的新人!
参考:
网友评论
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.