| 万叶集 |
|---|
| 隐约雷鸣,阴霾天空。 |
| 但盼风雨来,能留你在此。 |
前言:
✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 哈士奇 ,一位致力于 TFS - 全栈 赋能的博主 ✌
CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
专栏系列(点击解锁) 学习路线指引 知识定位 Python全栈白皮书 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。 自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。 数据库开发实战篇 更新中 爬虫入门与实战 更新中 数据分析篇 更新中 前端入门+flask 全栈篇 更新中 django+vue全栈篇 更新中 拓展-人工智能入门 更新中 网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者 网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。 vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器 测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得! 测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。 MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。
文章目录
- basepage层 - base_app_page.py
- first_baidu_page 层 - first_baidu_page.py
- baidu_search_page 层 - baidu_search_page.py
- test_baidu.py 模块 - 程序入口
- 运行结果
- 小节
上一章节给大家完整的编写了一个 百度搜索 的demo 与滑动触控操作,滑动触控这里不再细表。 这个 demo 完全依赖于 appium 本身的 webdriver 的一种模式,没有使用像之前 WEB 自动化那种的 “unittest” 框架与 “PO” 模式等,所以该章节我们要实现的就是将这个 demo 融入到我们的框架中,做成一个类似于 WEB 页面自动化 PO 模式的 App 自动化,接下来就看一看如何实现吧。
basepage层 - base_app_page.py创建 base_app_page.py 模块 , 定义一个所有页面都继承的page层。
代码示例如下:
# coding=utf-8
from appium import webdriver
from appium.webdriver.common.appiumby import By, AppiumBy
class BaseAppPage():
"""
1、basepage层 定义一个所有页面都继承的page层
2、对 selenium 常用的底层方法,再 进行一次封装
"""
def __init__(self, driver, path=None):
"""定义 driver 初始状态"""
self.driver = driver
self.driver.implicitly_wait(10)
def by_xpath(self, xpath):
"""Xpath 元素定位 方法不常用,但是也一定要保留"""
# return self.driver.find_element_by_xpath(xpath)
# return self.driver.find_element(by=By.XPATH, value=xpath)
return self.driver.find_element(By.XPATH, xpath)
def by_id(self, id):
"""id 元素定位"""
return self.driver.find_element(By.ID, id)
def by_classname(self, classname):
"""claseName 元素定位"""
return self.driver.find_element(By.CLASS_NAME, classname)
def by_uiautomator(self, uiautomator):
"""大杀器的 uiautomator 元素定位"""
# return self.driver.find_element_by_android_uiautomator(uiautomator)
return self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, uiautomator)
first_baidu_page 层 - first_baidu_page.py
创建 first_baidu_page.py 模块 ,这个模块主要实现的是 "“百度App” 首页的定位搜索框的元素。 这里是各个页面单独封装成层,包括但限制页面的元素、操作、流程等。
# coding=utf-8
from appium import webdriver
from base_app_page import BaseAppPage
class FirstBaiduPage(BaseAppPage):
"""定位首页的搜索框的元素"""
def homePage_searchElement(self):
"""定位首页的搜索框"""
return self.by_xpath('//android.widget.LinearLayout[@content-desc="百度搜索,请输入"]/android.widget.FrameLayout[2]')
"""
方法流程
"""
def go_to_search(self):
self.homePage_searchElement().click()
baidu_search_page 层 - baidu_search_page.py
创建 baidu_search_page.py 模块 ,这个模块实现的是 定位元素、操作、流程等。
# coding=utf-8
from time import sleep
from appium import webdriver
from base_app_page import BaseAppPage
class BaiduSearchPage(BaseAppPage):
"""页面单独封装成层,页面的元素、操作、流程"""
def homePage_searchElement_input(self):
"""定位首页搜索框跳转的输入框"""
return self.by_xpath('//android.widget.RelativeLayout[@content-desc="请输入搜索关键词"]/android.widget.EditText')
def search_button(self):
"""定位 '搜索' 按钮"""
return self.by_uiautomator('new UiSelector().text("搜索")')
"""
方法流程:
1、"搜索框" 内输入要搜索的内容
2、点击 "搜索" 按钮
"""
def click_search(self, input_content):
self.homePage_searchElement_input().send_keys(input_content)
sleep(1)
self.search_button().click()
test_baidu.py 模块 - 程序入口
框架搭建完成之后,编写 est_baidu.py 作为整个测试的入口,脚本内容如下:
import unittest
from appium import webdriver
from time import sleep
from baidu_search_page import BaiduSearchPage
from first_baidu_page import FirstBaiduPage
class TestLogin(unittest.TestCase):
"""
初始化操作 进行app caps配置
最终结束操作 关闭app
"""
def setUp(self):
"""执行用例之前需要执行的设备启动参数"""
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '7.1.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
# desired_caps['appPackage'] = 'com.baidu.searchbox'
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity'
self.dr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_baidu(self):
# 初始化界面
first_page = FirstBaiduPage(driver=self.dr)
search_page = BaiduSearchPage(driver=self.dr)
# 跳转
first_page.go_to_search()
# 搜索
search_page.click_search("appium")
def tearDown(self):
self.dr.quit()
if __name__ == '__main__':
unittest.main()
运行结果
运行结果如下:
小节
这里我们使用的是 unittest驱动 加上 PO模式 做了很多页面上的配置,这样方便我们日后的维护。这里会发现 App 自动化 与 WEB 自动化有很多的相像的地方,比如都是针对页面做了很多的 PO 上的处理。(这样有个好处就是可以将 App 自动化和 WEB自动化融合在一起)
上文中的整个演示过程成功的通过了 “百度搜索” 的用例,将之前的一些列操作迁移到了我们的框架之中。这里的搜索demo,是一个很简单的搜索。
如果想要将其复杂一些的话,可以将搜索的参数放在数据文件里或者参考之前的 ddt 数据驱动模式 ,包括之前我们使用 suite 、调用邮件的发送、jenkins 的集成等,与之前的 WEB自动化、接口自动化 基本上是一样的。
所以我们最终的一套自动化测试的框架可以集成 App自动化、WEB自动化 以及API自动化 ,整体的三位一体的自动化可以融入到这一套框架之中。
通过这个框架来进行自动化测试,可以进行用例的编写、PO的分层,底层的编写到 unittest 的一些小技巧的使用,再到后续的用例的执行、测试报告的输出、日志的打印等都可以融于这样的一套框架之中。从而在这个框架里面不断的完善、不断的达到完成我们所有的自动化测试的标准。
其实做到这里,大家会发现 App自动化、WEB自动化 以及API自动化 在编程的思路上有很多的相似的地方,所以不管是做开发也好还是测试开发也好,很多东西都是万变不离其宗的,做测试、自动化测试也是如此。可能 接口、WEB、App在具体的使用场景与编程上略有不同,但是大体的框架思路、大体的架构思想、大体的细节设计也是非常类似的。
OK,到了这里,我们的 App 自动化的编程部分就告一段落了,下一章节将和大家简单的总结一下 App 自动化的知识点,顺带聊一聊 App 自动化未来的发展趋势。



