1. 环境准备
1-1. 安装selenium环境(版本3.141.0)
1-2. 安装JDK(环境变量配置)
1-3. 安装nodejs(傻瓜式安装,win7最高支持V13.14.0,win10用v14.16.0,npm是6.14.11)
下载地址:https://nodejs.org/en/download/
http://nodejs.cn/download/
DOS验证:npm version
1-4. 安装appium (提前关闭360卫士、腾讯管家等,版本1.7.1)
下载地址:https://github.com/appium/appium-desktop/releases/
一键傻瓜式安装(约5分钟)
在线安装(不建议,时间太长!)
设置淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org
安装指定版本:cnpm install appium@1.7.2 -g
安装最新版本:cnpm install -g appium
1-5. 安装Android SDK (可以看做用于开发和运行Android 应用的软件)
官方下载地址: https://developer.android.com/studio/index.html
国内镜像地址: http://tools.android-studio.org/index.php/85-tools/110-androidsdk-mirrors
http://www.androiddevtools.cn/(访问不了)
最底部下载对应的SDK 工具包就可以了(SDK Tools)
环境变量配置
变量名:ANDROID_HOME
变量值:C:\tools\Andriod_SDK或 C:\tools\adt\sdk或 C:\tools\android-sdk-windows(看情况定)
变量名:PATH
变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
1-6. 安装Appium-Python-Client(版本1.3.0)
pip install Appium-Python-Client
pip install -i https://pypi.douban.com/simple/ appium-python-client
pip install -i https://pypi.douban.com/simple/ appium-python-client==1.3.0
1-7. 夜神模拟器 (版本6.2.8.2)
6.2.7.0是安卓4.4.2 (设置)
6.2.8.2是安卓5.1.1 (通讯录、文件管理器、设置一级界面)
--------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
2. 常用adb命令
2-1. 连接设备 adb connect 设备名,例如:adb connect 127.0.0.1:62001
夜神模拟器:adb connect 127.0.0.1:62001/62025
断开连接: adb disconnect 设备名
2-2. 查看设备 adb devices 查看当前连接到计算机的android设备
2-3. 安装软件 adb install 包名 将指定的apk文件安装到设备上(包名不要有中文)
adb install 路径\release.apk 或先输入adb install,再将apk包拖到DOS窗口
若显示success,说明安装apk包成功,若显示Failure,则安装失败。
检查错误,排错后,再执行命令:abd install -r 包名.apk
2-4. 获取app的包名和activity名称
输入下面的命令后打开软件,查看cmp后面的值
adb logcat -v time | findstr START 脚本中,cmp= 后面的值就是 包名
Ctrl + C 退出
查看当前运行的APP的包名和打开的Activity
adb shell "dumpsys window | grep mCurrentFocus"
adb shell dumpsys window | findstr mCurrentFocus
2-5. 卸载软件 adb uninstall 包名
获取包名(单个设备)
adb shell pm list packages -3 (3指的第三方)
获取包名(多个设备)
adb -s 设备名 shell pm list packages -3
2-6. 把本地文件上传到Android设备 adb push 本地文件路径 Android设备路径
例:把E:\android\test.txt 上传到安卓服务器的/storage/sdcard0/目录
adb push E:\android\test.txt /storage/sdcard0/
PS:文件管理器,依次进入storage/sdcard0,就能查看到刚才上传的文件
也可以使用命令adb shell,进入shell模式下,使用Linux命令查看,使用exit命令退出
注:只能上传文件,无法上传文件夹
2-7. 把Android设备的文件下载到本地 adb pull Android设备上的文件路径 本地路径
例:把安卓服务器的/storage/sdcard0/test.txt下载到本地磁盘中的E:\android\目录
adb pull /storage/sdcard0/test.txt E:\android
2-8. 连接真机 安卓驱动下载:https://adbdriver.com/downloads/
步骤:手机连接电脑 → 安装驱动 → 连点7次版本号打开开发者选项 → 勾选USB调试 → 手机端允许授权
C:\Users\Administrator>adb devices
List of devices attached
727f22be device (有线,插线即连接)
C:\Users\Administrator>adb tcpip 5555
restarting in TCP mode port: 5555
C:\Users\Administrator>adb connect 192.168.0.9:5555
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *
connected to 192.168.0.9:5555
C:\Users\Administrator>adb devices
List of devices attached
192.168.0.9:5555 device (无线)
taskkill /f /pid 2345
taskkill /f /im chrome.exe
taskkill /f /im wininit.exe 蓝屏
---------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
3. appium内容
Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。
它使用WebDriver协议驱动iOS,Android和Windows应用程序。
Appium的运行原理,和selenium有点类似,都可以理解为c/s架构。
我们的电脑(c端)上运行自动化测试脚本,调用的是appium的webdriver的接口,
appium服务器(s端)接收到我们client上发送过来的命令后,
他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来在设备上执行自动化。
3-1. appium直接启动APP
1. 打开appium,默认simple(基础设置)标签页下点击Start Server 1.9.1
2. 点击右上角放大镜图标Start Inspector Session(启动检查器会话)
3. 新页面左下方Desired Capabilities(参数设置),依次填写以下内容:
平台名称、平台版本、设备名称、包名、activity(可理解为应用页面)
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.android.settings",
"appActivity": "com.android.settings.Settings"
4. 保存参数设置,以便下次使用。点击右下角 Start Session启动会话
5. 打开新页面后,从左往右三部分:页面预览、页面代码、元素定位
6. 上方工具条分别是元素拾取、滑动、点击、返回、刷新、录制、元素查询、复制、退出
7. 右侧上方三个功能按钮分别是点击、输入、清空
Desired capability的功能是配置Appium会话,告诉Appium服务器我们想要自动化的平台和应用程序。
Desired Capabilities是一组设置的键值对的集合,主要用于通知Appium服务器建立需要的Session。
获取包名及activity命令:adb shell dumpsys window |findstr mCurrentFocus
3-2. 元素捕捉工具
Inspector:appium开启会话之后的页面
Uiautomatorviewer:SDK\tools\uiautomatorviewer.bat,但经常报错且无解 。
3-3. python连接appium,启动APP
from appium import webdriver
# 打开设置页面(夜神模拟器v6.2.8.2的设置APP)
desired_caps = {
"platformName": "Android", # 操作系统
"platformVersion": "5.1.1", # 系统版本
"deviceName": "127.0.0.1:62001", # 设备名称
"appPackage": "com.android.settings", # 测试包名
"appActivity": "com.android.settings.Settings" # 打开页面
# ,"unicodeKeyboard": "True" # 使用unicode编码方式发送字符串
# ,"restKeyboard": "True" # 将键盘隐藏一起来
}
# 也可以用appium里面的http://localhost:4723/wd/hub
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
wd:可以理解是WebDriver的缩写
hub:是指主节点、中心节点
3-4. 元素定位
1)常规定位---------------------------------------
与Web自动化测试一样,app自动化测试过程中最重要一个环节就是元素定位,
只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。
appium提供了许多元素定位的方法,如id定位、class定位、xpath定位等等。
resource-id 对应 id定位方式
class 对应 class
from appium import webdriver
# 打开简书v1.9.7页面(夜神模拟器v6.2.8.2)
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.jianshu.haruki",
"appActivity": "com.baiji.jianshu.account.LoginActivity" }
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
# 1-1. 根据id定位
inputBox = dr.find_element_by_id("com.jianshu.haruki:id/edit_email")
inputBox.send_keys("python")
# 1-2. 根据class定位
inputBox = dr.find_element_by_class_name("android.widget.EditText")
inputBox.send_keys("good")
# 1-3. 根据xpath定位
inputBox = dr.find_element_by_xpath('//*[@resource-id="com.jianshu.haruki:id/edit_email"]')
inputBox.send_keys("appium")
# 多个元素属性
loc = '//*[@resource-id="com.jianshu.haruki:id/edit_email" and @class="android.widget.EditText"]'
dr.find_element_by_xpath(loc).send_keys("bad")
2) UIAutomator定位-----------------------------
UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,
且支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。
Appium元素定位方法其实也是基于Uiautomator来进行封装的。
使用方法
find_element_by_android_uiautomator('new UiSelector().resourceId("")')
find_element_by_android_uiautomator('new UiSelector().text("")')
find_element_by_android_uiautomator('new UiSelector().className("")')
# 2-1. 根据('new UiSelector().resourceId("")')定位
inputBox = dr.find_element_by_android_uiautomator\
('new UiSelector().resourceId("com.jianshu.haruki:id/edit_email")')
inputBox.send_keys("hard")
inputBox.clear()
# 2-2. 根据('new UiSelector().text("")')定位
inputBox = dr.find_element_by_android_uiautomator\
('new UiSelector().text("邮箱或手机号")')
inputBox.send_keys("hard2")
# 2-3. 根据('new UiSelector().className("")')定位
inputBox = dr.find_element_by_android_uiautomator\
('new UiSelector().className("android.widget.EditText")')
inputBox.send_keys("hard3")
3) 二次定位----------------------------------------
先定位到元素父节点,再在父节点包含的内容中查找元素
# 先定位到账号输入框的父节点
ele = dr.find_element_by_class_name("android.widget.LinearLayout")
# 再在父节点包含的内容中查找元素
ele2 = ele.find_element_by_id("com.jianshu.haruki:id/edit_email")
ele2.send_keys("two")
4) 定位一组元素-----------------------------
find_elements_by_xxx( ),注意elements的s
# 定位一组元素,第1个是用户名,第2个是密码
ele = dr.find_elements_by_class_name("android.widget.EditText")
ele[0].send_keys("admin")
ele[1].send_keys("123456")
3-5. Appium常用API
1) 输入中文------------------------------------
在capability中加入unicodeKeyboard和resetKeyboard两个参数即可
# 打开简书v1.9.7页面(夜神模拟器v6.2.8.2)
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.jianshu.haruki",
"appActivity": "com.baiji.jianshu.account.LoginActivity" ,
"unicodeKeyboard": "True", # 使用unicode编码方式发送字符串
"resetKeyboard": "True" # 将键盘隐藏起来
}
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
ele = dr.find_elements_by_class_name("android.widget.EditText")
ele[0].send_keys("中文用户名")
2) 两点之间滑动 --------------------------------
两点之间滑动,适用于刷微博、看图片等上下滑动、左右移动的场景。
swipe(x1, y1, x2, y2, duration=0)
swipe(起始横坐标,起始纵坐标,目标横坐标,目标纵坐标,持续时间)
左上角为原点(0,0)。持续时间为滑动时间,单位毫秒,默认为空,即可以不填
注: 有时候在滑动前,可以强制等待1秒,避免出错(元素未加载完成)。
如果坐标不好计算,可以打开手机开发者选项的指针位置直接查看
# 打开设置APP页面(夜神模拟器v6.2.8.2)
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.android.settings",
"appActivity": "com.android.settings.Settings" }
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
# dr.implicitly_wait(10) # 隐式等待10秒
# 获取屏幕尺寸
def screenSize():
x = dr.get_window_size()["width"]
y = dr.get_window_size()["height"]
return x,y
size = screenSize()
print(size) # 返回的元组
# 向上滑动
def swipeUp():
x1 = size[0]*0.5
y1 = size[1]*0.8
y2 = size[1]*0.2
dr.swipe(x1,y1,x1,y2)
swipeUp()
# 向下滑动
def swipeDown():
x1 = size[0] * 0.5
y1 = size[1] * 0.2
y2 = size[1] * 0.8
dr.swipe(x1,y1,x1,y2,1000)
swipeDown()
# 向下滑动两次
for i in range(2):
swipeDown()
3) 连续滑动 ------------------------------------
连续滑动适用于手势密码操作,切西瓜等场景,使用appium的TouchAction类。
TouchAction类包含一些列操作,比如按压、长按、点击、移动、暂停,释放、执行等,
由这些不同的操作可以组成一套动作。使用方法如下:
from appium.webdriver.common.touch_action import TouchAction
TouchAction(driver).press(element)
TouchAction(driver).press(x=0,y=308)
1.按压元素或坐标点,press(el=None,x=None,y=None)
2.长按元素或坐标点,long_press(el=None,x=None,y=None,duration=1000),持续时间为毫秒
3.点击元素或控件,tap(element=None,x=None,y=None,count=1),次数默认为1
4.移动到指定的元素或点,move_to(el=None, x=None, y=None),
移动到目标位置有时是算绝对坐标点,有时是基于前面一个坐标点的偏移量,要结合具体App来实践。
5.暂停脚本的执行,wait(ms=0),单位为毫秒。
6.释放,release(),即滑动停止
7.执行,perform(),把要执行的操作发送到Appium服务器,即让要执行的操作生效。
# 打开随手记V10.5.6.0(夜神模拟器v6.2.8.2)
# 首页→右下角的【更多】→滑动到【高级】→密码与手势密码
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.mymoney",
"appActivity": "com.mymoney.biz.main.MainActivity"
}
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
dr.implicitly_wait(10) # 隐式等待10秒
# 获取屏幕尺寸
def windowSize():
x = dr.get_window_size()["width"]
y = dr.get_window_size()["height"]
return (x,y)
size = windowSize()
# 向上滑动
def swipeUp():
x1 = size[0] * 0.5
y1 = size[1] * 0.8
y2 = size[1] * 0.2
dr.swipe(x1,y1,x1,y2,1000)
# 点击右下角的【更多】
more = dr.find_element_by_id("com.mymoney:id/nav_setting_btn")
more.click()
# 滑动之前强制等待1秒,否则会因页面元素未加载完成导致报错
time.sleep(1)
# 向上滑动页面
swipeUp()
# 点击【高级】
senior = dr.find_element_by_android_uiautomator\
('new UiSelector().text("高级")')
senior.click()
# 点击【密码与手势密码】
passwd = dr.find_element_by_android_uiautomator\
('new UiSelector().text("密码与手势密码")')
passwd.click()
# 点击【手势密码保护】
protect = dr.find_element_by_android_uiautomator\
('new UiSelector().text("手势密码保护")')
protect.click()
# 手势密码设置(连续滑动Z字形)
TouchAction(dr).press(x=210,y=290).wait(1000)\
.move_to(x=510,y=290).wait(1000)\
.move_to(x=210,y=580).wait(1000)\
.move_to(x=510,y=580).wait(1000)\
.release().perform()
4) 多点触控操作----------------------------------------------------------------------
在对照片、地图进行缩放时,需要至少两个手指头同时触碰屏幕操作,叫做多点触控。
在Appium里面实现多点触控,使用MultiAction类,该类提供了add()和perform()两个方法,
结合TouchAction类,可以模拟出用户使用多个手指进行多点触控操作的场景。
from appium.webdriver.common.touch_action import TouchAction # 连续滑动
from appium.webdriver.common.multi_action import MultiAction # 多点触控
zoomAction = MultiAction(dr)
t1 = TouchAction(driver).press(element1).wait(ms).move_to(element2).release()
t2 = TouchAction(driver).press(element1).wait(ms).move_to(element2).release()
zoomAction.add(t1,t2) # 将TouchAction对象添加到MultiAction里面
zoomAction.perform() # 执行MultiAction
sleep(2)
# 获取屏幕尺寸
def windowSize():
x = dr.get_window_size()["width"]
y = dr.get_window_size()["height"]
return (x,y)
# 封装放大
def enlarge():
x = windowSize()[0]
y = windowSize()[1]
print(x,y)
# 实例化类
zoomAction = MultiAction(dr)
a1 = TouchAction(dr).press(x=x*0.4,y=y*0.4).wait(500).move_to(x=x*0.3,y=y*0.3).release()
a2 = TouchAction(dr).press(x=x*0.6,y=y*0.6).wait(500).move_to(x=x*0.7,y=y*0.7).release()
zoomAction.add(a1,a2) # 将TouchAction的对象添加到MultiAction中
zoomAction.perform() # 执行MultiAction中的TouchAction对象
# 封装缩小
def reduce():
x = windowSize()[0]
y = windowSize()[1]
print(x,y)
# 实例化类
zoomAction = MultiAction(dr)
a1 = TouchAction(dr).press(x=x*0.3,y=y*0.3).wait(500).move_to(x=x*0.4,y=y*0.4).release()
a2 = TouchAction(dr).press(x=x*0.7,y=y*0.7).wait(500).move_to(x=x*0.6,y=y*0.6).release()
zoomAction.add(a1,a2) # 将TouchAction的对象添加到MultiAction中
zoomAction.perform() # 执行MultiAction中的TouchAction对象
# 执行放大
# enlarge()
5) Toast识别------------------------------------------------------------
Toast是浮动的消息提示框,一般显示3秒左右,无法被点击,无法使用传统的元素定位。
Toast类的思想就是尽可能不引人注意,同时还向用户显示信息。
Appium 1.6.3开始支持识别Toast内容,安卓系统必须5.0以上,主要是基于UiAutomator2
# 只能使用xpath定位,才会成功
text = "您现在处于开发者模式!"
loc = "//*[@text='{}']".format(text)
print(loc)
toast = dr.find_element_by_xpath(loc).text
print(toast)
# 也可根据部分文本信息
toast = dr.find_element_by_xpath('//*[contains(@text,"开发者模式")]').text
# toast的className值为:android.widget.Toast
toast = dr.find_element_by_xpath('//*[@class="android.widget.Toast"]').text
print(toast)
下面前2步不安装也行?
(环境准备第2步失败?win7最高支持V13.14.0的node.js,win10用v14.16.0,npm是6.14.11)
1、先安装淘宝镜像:
npm install -g cnpm --registry=https://registry.npm.taobao.org
2、安装appium-uiautomator2-driver:
cnpm install appium-uiautomator2-driver
3、最后在Capablity配置如下参数:
desired_caps['automationName']='uiautomator2'
6) H5元素的定位----------------------------------------------------
H5元素定位:原生APP环境→web环境
在混合开发的App中,经常会有内嵌的H5页面,可理解为web端的表单切换。
常规定位都是基于Andriod原生控件进行的,而Web网页是单独的B/S架构,
两者的运行环境不同,因此需要进行上下文(context)切换,然后对H5页面元素进行定位操作。
在程序中context可以理解为当前对象在程序中所处的一个环境。
比如App一个界面是属于Activity类型,也就是Android界面环境,
但是当访问内嵌的网页是属于另外一个环境(网页环境),两者处于不同的一个环境。
###################################################################
环境准备:
1.App Webview开启debug模式,请开发人员在app中配置代码
(在WebView类中调用静态方法setWebContentsDebuggingEnabled):
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
2.电脑端Chrome浏览器地址栏输入 chrome://inspect/#devices,进入调试模式。
打开app的h5页面,chrome刷新,检查是否显示对应的webview。
3.由于app的webview自动化是依赖于chromedriver的,所以appium中的chromedriver要跟
手机的Android System WebView的版本对应起来,如Android System WebView为版本39,
对应chromedriver版本为2.11~2.14均适配
4.手机端Android System WebView在设置-全部应用里面查看版本号,appium 1.7以后
默认安装在c盘,chromedriver位于C:\Program Files (x86)\Appium\resources\app
\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\,
双击chromedriver.exe,即可看到版本号,如2.14
5.到http://npm.taobao.org/mirrors/chromedriver/ 查看chromedriver版本2.14的notes.txt
描述,是否支持手机的Android System WebView的版本,若不支持,就下载支持的版本,
下载后的chromedriver.exe覆盖appium中的chromedriver,最后重启appium,必须重启。
6.在原生APP定位时若看到class包含webview/view,或者获取上下文看到WEBVIEW_com.xxx,
则说明是webview,切换后可使用web定位
dr.contexts 查看上下文,返回列表
dr.switch_to.context("xxx") 切换环境(切换到webview,切回到原生app)
dr.current_context 查看当前环境
# 演示APP为drfone_v3.2.0
from appium import webdriver
from time import sleep
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.wondershare.drfone",
"appActivity": "com.wondershare.drfone.ui.activity.Main2Activity" }
dr = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
dr.implicitly_wait(10) # 隐式等待10秒
# 进入backup
dr.find_element_by_id("com.wondershare.drfone:id/btnBackup").click()
# 点击next
dr.find_element_by_id("com.wondershare.drfone:id/btnRecoverData").click()
# 查看上下文 dr.contexts ["NATIVE_APP","WEBVIEW_xxxx"]
contexts = dr.contexts
print(contexts)
# 切换到指定的webview
# dr.switch_to.context("WEBVIEW_com.wondershare.drfone")
dr.switch_to.context(contexts[1])
sleep(1)
# 打印切换后的环境
print("切换后的环境是:",dr.current_context)
# 输入邮箱地址,并提交
dr.find_element_by_id("email").send_keys("juzi01@qq.com")
dr.find_element_by_class_name("btn_send").click()
# 切回原生APP页面
# dr.switch_to.context("NATIVE_APP")
dr.switch_to.context(contexts[0])
# 继续在原生APP操作 ...
代码补充:
在selenium中,我们获取文本的方法通常是find_element_by_id(id的值").text,
但是对于div,dt这些标签,这个方法则获取不到的文本内容,如下:
<div class="container">
<dt> hello</dt>
</div>
对于div,dt这些标签,我们可以通过获取他的innerHTML属性来获取对应的文本:
text = dr.find_element_css_selector('.container > dt').get_attribute("innerHTML")
print(text) →:hello
===========================================
app项目自动化测试框架
1.创建项目文件夹,如Appium自动化测试框架,
2.项目下创建common文件夹,
3.在common下创建desired_cap.py文件,配置APP启动时的信息
4.项目下创建base文件夹
5.在base下创建basePage.py文件,接收driver,封装基础方法,如find_element_by_id()等
6.在common下创建common.py文件,继承basePage.py,存放公共的操作,
如点击元素,向输入框输入数据,滑动元素等,给业务模块进行继承,并调用其中的方法
7.项目下创建business文件夹,存放指定页面的业务操作,如查找、编辑、保存等操作,
以及元素定位方式,给测试用例调用
8.在business下创建writeAccount.py文件
9.项目下创建testCases文件夹,存放测试用例
10.在testCases下创建testWriteAccount.py文件
---------------------------- 以下为登录相关
11.在business下创建login.py文件
12.在testCases下创建testLogin.py文件
13.项目下创建dataConfig文件夹,其下新建data.xlsx文件,在Excel里面配置测试数据
14.项目下创建util文件夹,其下新建operateExcel.py文件,操作Excel文件的读取、存放等
-------------------------封装unittest里面的setUp和tearDown(视情况而定)
15.在common下创建myUnittest.py文件,其下封装unittest里面环境准备和环境恢复
16.项目下创建reports文件夹,存放测试报告
17.准备HTMLTestRunner.py和runAllCases.py文件,并将testCases下的顺序调整好