Appium测试框架搭建
本文代码github地址:github.com/...
因为Appium网上的资料大多都是基础的,包括环境搭建、单界面的测试、单控件的测试等。 关于Appium测试框架的文章却没有查到,所以这篇文章主要是关于Appium框架的搭建。
Appium环境的搭建过程就不介绍了,网上可以查一下相关文章,也可以在我的项目中看一下相关参考。
一、appium_demo项目整体思路介绍
启动项目只需要运行项目根路径下的test.py
即可。
项目启动分析
1.
multi_appium.start_service()
该方法会先杀掉已经启动的 appium
进程,然后再启动 appium
服务。
2.
multi_appium.con_device()
该方法会执行以下方法,通过两个参数appium服务
和设备参数对象
创建 appium包的webdriver
对象。并赋值给基础类AppElement
的driver
属性。
`AppElement.driver`。 = webdriver.Remote(AppConfig.service_path, desired_caps)
3.
app = App()
和app.test()
该方法会创建App
对象,并执行界面测试方法。
二、appium_demo项目构建过程
1、基础类的创建
参考Android控件的继承思路:View->ViewGroup->Activity。创建控件基类AppElement
,所有ViewGroup
和Activity
都继承自它。
1.1 在
AppElement
里面写入类的基础属性webdriver
这样所有界面或布局都可以使用webdriver
来查找或者操作Element元素
。类似APP里面的BaseActivity
里面的基础属性,在所有界面都可以调用。
因为在Appium的使用过程是先创建webdriver
,所以我们在创建webdriver
对象后就赋值给AppElement.driver
。然后我们再创建MainActivity
对象就可以使用webdriver
的方法,并进行测试。
1.2 在AppElement里面添加基础
查找Element元素
的方法:findElementId
、findElementText
、findElementTextWait
。
通过findElementId
方法,我们可以延迟查找Element元素,并捕捉异常等逻辑。
以及其他常用的向一定方向划动的方法,如swipeUp、swipeDown等。
1.3 创建界面的标题栏
TitleLayou
类
在TitleLayout
类中初始化公共属性标题文本控件:title
、返回按钮:back
、右侧功能按钮:iv_right
。编写界面标题栏的基础方法:点击返回按钮方法:finish
、获取标题文本控件文字方法:getTitle
、点击右侧功能按钮方法:rightClick
。
1.4 创建界面的基类
Activity
在Activity基类中初始化界面的标题栏:title
。根据传入的界面的class_name
从全局配置的类名和包名对应数据
列表activity_list
中查找对应类的全路径,在初始化界面的时候使用driver.wait_activity
方法等待界面出现,防止界面未加载完成就查找控件产生异常等。
1.5 将上面的
Activity类名和包名的对应数据
配置在module包下activity_list
中,方便保存和读取:
2、界面的创建
2.1创建一个建议反馈的界面FeedbackActivity类。
该类继承自Activity基类
,并使用Activity.__init__(self, self.__class__.__name__)
方法复写Activity
的__init__
方法。(和java
不同这里必须复写才能执行Activity
的__init__
方法)
在使用__init__
方法时将当前类的__name__
传入Acitivity中执行上面讲的wait_activity
方法以及初始化界面的标题等。
2.2 在FeedbackActivity界面中编写操作、测试控件的方法和逻辑。
如上图中的建议反馈界面所示,有一个内容输入的文本框,下方还有一个添加图片的按钮。
所以我们在建议反馈界面编写【提示用户输入反馈内容】的方法-【inputContent】
,以及下面的【添加图片】的方法-【selectPicture】
,【请输入手机号】的方法-【inputPhone】
,【点击提交按钮】的方法-【submitFeedBack】
等。可以在初始化FeedbackActivity界面
时执行所有方法,也可以在创建FeedbackActivity实例
后单独调用方法。
进入FeedbackActivity
界面中,我们执行方法的顺序为:inputContent
->selectPicture
->inputPhone
->submitFeedBack
->finish
,执行完所有逻辑后再执行返回方法finish
返回首页。
这样一个测试界面就编写完成了。
2.3 编写测试界面代码后,我们还需要编写**APP进入
测试界面FeedbackActivity
**的逻辑
在Appium程序的启动过程中,我们在创建webdriver
对象启动APP的时候,需要在APP配置信息
参数中添加启动界面信息:
# desired_caps就是APP配置信息
AppElement.driver = webdriver.Remote(AppConfig.service_path, desired_caps)
# appActivity对应的就是启动界面的信息
desired_caps = {
.....
'appPackage': 'com.ennova.dreamlf',
'appActivity': 'com.ennova.dreamlf.module.main.splash.SplashActivity',
}
在Appium启动APP
后会自动跳转到APP的主页.module.main.MainActivity
。所以我们需要编写APP的 主界面MainActivity类及相应的跳转方法
。
2.3.1 编写主界面
MainActivity
的代码
如上图所示,MainActivity
主界面是由首页
和我的
两个模块组成,所以我们先在 mainac.py
文件中创建需要的MainActivity
、HomeFragment
类。在MainActivity
类中创建homeTest
方法测试首页模块逻辑。
def __init__(self):
...
def homeTest(self, vp_test=True, grid_test=True):
home_fragment = HomeFragment()
if vp_test: home_fragment.viewPagerTest()
if grid_test: home_fragment.gridClick(3)
在homeTest
方法中,创建HomeFragment
对象并执行上方轮播图布局点击
测试或者中间九宫格按钮点击
测试。
进入后MainActivity
界面中,执行的方法homeTest(vp_test=False, grid_test=True)
我们来测试九宫格点击逻辑。
2.3.2 编写首页
HomeFragment
的代码
def viewPagerTest(self):
.....
def gridClick(self, module_num=-1):
module_rv = self.findElementId("module_rv")
.....
if module_num == 3 or module_num == -1:
# 建议反馈点击
module_rv.find_elements(by=By.CLASS_NAME, value="android.widget.LinearLayout")[3].click()
feedbackactivity = FeedbackActivity()
在gridClick
方法中,判断传入参数module_num
为3时,从module_rv
列表布局中查找第四项子元素即建议反馈
控件并点击,这样APP就进入了建议反馈界面FeedbackActivity
。
在首页的建议反馈
控件点击后,通过创建feedbackactivity = FeedbackActivity()
来测试建议反馈
界面。
运行测试程序即可测试界面功能
至此测试框架已经完成。
appium_demo项目除了包含appium测试框架外,同时包含了启动Android模拟器程序
,以及启动AppiumServie程序
。
启动Android模拟器程序
所在位置android_avd.py
start_avd()
启动AppiumServie程序
所在位置multi_appium.py
start_service()