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()