Appium 开源分享优化版

之前分享过PageObject+Python+Appium

本版本是对上次版本较大改版,主要解决了:

  • 失败重连一次(默认一次)可配置多次
  • 基于appium1.7.1 uiautomator2
  • 解决uiautomator2启动超时
  • 新增检查点关键字,contrary_getval,exceptsl,contrary暂时没有写到yml配置文件中,直接在写在了page层
    • 检查点关键字contrary:相反检查点,传1表示如果检查元素存在就说明失败,如删除后,此元素依然存在
    • 检查点关键字toast: 表示提示框检查点
    • 检查点关键字contrary_getval: 相反值检查点,如果对比成功,说明失败
    • 检查点关键字check: 自定义检查结果
    • 检查点关键字excepts: 如果为1,表示操作出现异常情况检查点为成功。如:删除成功了,此数据不存在则为真
  • 测试报告新增对多台测试机结果统计(安卓)
  • 适配mac,windows平台
  • 适配ios测试(简单调试通过,后续有机会实际去使用和优化)

代码简要分析

yml测试用例

testinfo:
- id: test004
title: 每日新闻卡片浏览记录
info: 打开知识
testcase: - element_info: com.huawei.works.knowledge:id/title
find_type: ids
index: 0
operate_type: get_value
info: 获取每日新闻下对第一条数据
- element_info: com.huawei.works.knowledge:id/title
find_type: ids
index: 0
operate_type: click
is_time: 3
info: 点击每日新闻下对第一条数据
- element_info: h5-scroll
find_type: id
is_webview: 1 # 切换到webview
info: 查找并获取详情页标题
- element_info: com.huawei.works.knowledge:id/vtb_img_left
find_type: id
is_webview: 2 # 切换到native
operate_type: click
info: 点击返回按钮
- element_info: com.huawei.works.knowledge:id/vtb_img_right2
find_type: id
operate_type: click
info: 点击首页历史记录按钮
check:
- element_info: com.huawei.works.knowledge:id/browser_knowledge_history_text
find_type: ids
index: 0
operate_type: get_value
info: 查找是否存在历史记录
 

某个用例的page层

from PageObject import Pages

class DayNewHistoryPage:
'''
每日新闻浏览历史
''' def __init__(self, kwargs):
_init = {"driver": kwargs["driver"], "path": kwargs["path"], "device": kwargs["device"],
"logTest": kwargs["logTest"], "caseName": kwargs["caseName"]}
self.page = Pages.PagesObjects(_init) def operate(self): # 操作步骤
self.page.operate() def checkPoint(self): # 检查点
self.page.checkPoint()
 
  • pages再次封装了一层,主要可以看下重连机制的实现

    • 其实主要用的是launch_app+setupclass,另外一个好处是避免用例依赖,并不会重新启动一个session
if result is not True and be.RE_CONNECT:
self.msg = "用例失败重连过一次,失败原因:" + self.testInfo[0]["msg"]
self.logTest.buildStartLine(self.caseName + "_失败重连") # 记录日志
self.operateElement.switchToNative()
self.driver.launch_app()
self.isOperate = True
self.get_value = []
self.is_get = False
self.operate() # 执行步骤
result = self.check(kwargs) # 坚持点
self.testInfo[0]["msg"] = self.msg
self.operateElement.switchToNative()
 

testcase层调用page层

class HomeTest(ParametrizedTestCase):
# 首页下拉
def testAHomeSwipeDown(self):
app = {}
app["logTest"] = self.logTest
app["driver"] = self.driver
app["path"] = PATH("../yaml/home/HomeSwipeDown.yaml")
app["device"] = self.devicesName
app["caseName"] = sys._getframe().f_code.co_name page = HomeSwipeDownPage(app)
page.operate()
page.checkPoint() # banner浏览历史记录
def testB0annerHistory(self):
app = {}
app["logTest"] = self.logTest
app["driver"] = self.driver
app["path"] = PATH("../yaml/home/BannerHistory.yaml")
app["device"] = self.devicesName
app["caseName"] = sys._getframe().f_code.co_name
page = BannerHistoryPage(app)
page.operate()
page.checkPoint() @classmethod
def setUpClass(cls):
super(HomeTest, cls).setUpClass() @classmethod
def tearDownClass(cls):
super(HomeTest, cls).tearDownClass()
 

代码入口

def runnerCaseApp(devices):
starttime = datetime.now()
suite = unittest.TestSuite()
suite.addTest(ParametrizedTestCase.parametrize(HomeTest, param=devices))
suite.addTest(ParametrizedTestCase.parametrize(TestWeiQunTest, param=devices))
unittest.TextTestRunner(verbosity=2).run(suite)
 

比较麻烦case处理

  • 当遇到有些用例比较麻烦,必须单独写page 层,比如长按交换空间位置
  • 自定义page层
.....
def operate(self):
for item in self.testCase:
m_s_g = self.msg + "\n" if self.msg != "" else "" result = self.operateElement.operate(item, self.testInfo, self.logTest, self.device)
if not result["result"]:
msg = "执行过程中失败,请检查元素是否存在" + item["element_info"]
print(msg)
self.msg = m_s_g + msg
self.testInfo[0]["msg"] = msg
self.isOperate = False
return False if item.get("operate_type", "") == "location":
app = {}
web_element = self.driver.find_elements_by_id(item["element_info"])[item["index"]]
start = web_element.location
# 获取控件开始位置的坐标轴
app["startX"] = start["x"]
app["startY"] = start["y"]
# 获取控件坐标轴差
size1 = web_element.size width = size1["width"]
height = size1["height"]
# 计算出控件结束坐标
endX = width + app["startX"]
endY = height + app["startY"] app["endX"] = endX - 20
app["endY"] = endY - 60 self.location.append(app)
# self.driver.swipe(endX, endY, starty, endY)
if item.get("operate_type", "") == be.GET_VALUE:
self.get_value.append(result["text"]) if item.get("is_swpie", "") != "":
print(self.location)
self.driver.swipe(self.location[0]["endX"], self.location[0]["endY"], self.location[1]["endX"], self.location[1]["endY"]+10)
 
  • yaml用例 可以自定义一些关键字给page用
testinfo:
- id: test019
title: 拖动排序知识卡片
info: 打开知识
testcase:
- element_info: com.huawei.works.knowledge:id/vtb_img_right
find_type: id
operate_type: click
info: 点击排序卡片按钮
- element_info: com.huawei.works.knowledge:id/my_card_item_name_text
find_type: ids
index: 1
operate_type: get_value
info: 得到第二个卡片的值
- element_info: com.huawei.works.knowledge:id/drag_item_image
find_type: ids
index: 0
operate_type: location
info: 得到第一卡片的坐标
- element_info: com.huawei.works.knowledge:id/drag_item_image
find_type: ids
index: 1
operate_type: location
is_swpie: 1 # 特殊关键字,滑动指令
info: 得到第二个卡片的坐标并拖动
- element_info: com.huawei.works.knowledge:id/vtb_img_left
find_type: id
operate_type: click
info: 点击返回按钮
check:
- element_info: com.huawei.works.knowledge:id/title_txt
find_type: id
operate_type: get_value
 

其他

  • 顺便说下遇到浮动层无法点击

    • 浮动层造成可以识别到元素,触发了点击却失效的处理方法是,得到元素坐标,然后用adb shell方式去触发,感兴趣的可以看下adb_tap关键字的封装
  • 其他更多优化可以看我的CHANGELOG
  • 开源地址
  • 参考: https://testerhome.com/topics/11720

【转】Appium 优化版的更多相关文章

  1. 通用PE工具箱 4.0精简优化版

    通用PE工具箱 4.0精简优化版 经用过不少 WinPE 系统,都不是很满意,普遍存在篡改主页.添加广告链接至收藏夹.未经允许安装推广软件等流氓行为,还集成了诸多不常用的工具,令人头疼不已.那么今天给 ...

  2. GHOST WIN7系统64位经典优化版 V2016年

    来自系统妈:http://www.xitongma.com 深度技术GHOST win7系统32,64位经典优化版 V2016年3月 系统概述 深度技术ghost win7系统64位经典优化版适用于笔 ...

  3. Chrome 扩展程序 CrxMouse 优化版 v3.0.1

    说明 CrxMouse 原版更新至 v2.7.8,跟进升级优化版至 v3.0.1. 改动说明: 1. 去除可能存在的后台数据上传隐患: 2. 解决鼠标右键拖动时的轨迹漂移问题. 3. 加入部分默认设置 ...

  4. POJ-2533最长上升子序列(DP+二分)(优化版)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Acc ...

  5. 搜狗拼音输入法 V9.1.0.2589 最新去广告精简优化版

    搜狗拼音输入法9.0 正式版例行发布,最新版字母代号b,详细版本号为v9.1.0.2589:搜狗拼音输入法是电脑装机必备软件,版本有传统版和智慧版之分,其打字超准.词库超大.速度飞快.外观漂亮,因此使 ...

  6. 将多个图片合并到一个TIF文件里(非 GDAL) 优化版

    不知道为什么,网上对TIF的操作的资料少得可怜,包括CodeProject上都没有找到多少,在网上大多用GDAL,但这个东西,对只想做个合并图片的功能来说,实在是牛刀杀鸡,(9个DLL要带全,相当的恐 ...

  7. m3m4加载器的优化版m3m4-v1.1

    m3m4加载器的优化版m3m4-v1.1 /* //1.以$开头的模块名,表示服务,服务只会执行一次,它可以有自己的方法.比如cookie就是一个服务 //例如:console.log("r ...

  8. Windows下安装appium桌面版和命令行版

    安装appium桌面版和命令行版   一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本:  github search appium desktop download late ...

  9. 洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈

    其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue ...

随机推荐

  1. PythonStudy1——Python 值拷贝 浅拷贝 深拷贝

    拷贝:对值进行复制的过程 # 值拷贝:应用场景最多  ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来  # ls内部的值发生任何变化,ls1都会随 ...

  2. WIFI 802.11 a/b/g/n/ac

    802.11 a/b/g/n/ac FHSS: Frequency-hopping spread spectrum (FHSS) is a method of transmitting radio s ...

  3. 第一章 C#入门 (Windows窗体应用程序)(三)

    [案例] 编写一个Windows窗体应用程序,窗体上有一个文本框和两个按钮([显示]和[清除]按钮). 单击[显示]时,文本框的背景变为蓝色并且居中显示“努力学习C#”: 单击[清除]按钮,文本框的背 ...

  4. Web GIS系统相关

    最近研究了百度 echarts 的一个很炫酷的示例: http://gallery.echartsjs.com/editor.html?c=xrJHCfsfE- 看了代码发现了很多不懂1东西,研究研究 ...

  5. 浏览器调试动态js脚本

    前两天拉取公司前端代码修改,发现在开发者工具的sources选项里边,居然没有列出来我要调试的js脚本,后来观察了一下,脚本是动态在页面里引入的,可能是因为这样所以不显示出来,但是如果不能断点调试,只 ...

  6. 前端-JavaScript1-3——JavaScript之字面量

    字面量?????? 字面量:英语叫做literals,有些书上叫做直接量.看见什么,它就是什么. 我们先来学习数字的字面量,和字符串的字面量.剩余的字面量类型,我们日后遇见再介绍. 3.1 数字的字面 ...

  7. [转]jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...

  8. Linux Bash Shell字符串分割substring等(转)

    原文https://blog.csdn.net/wuyinggui10000/article/details/52779364 脚本开发中遇到的问题是:原java中的字符串分割操作(substring ...

  9. [sharepoint]根据用户名获取该用户的权限

    写在前面 这样的一个场景,客户端请求sharepoint的rest api,但不允许传输用户的密码,使用的是证书认证的方式,但这样所有的用户用的是同一个证书,这样造成的结果就是无法识别该用户是否有操作 ...

  10. centos6.5 yum安装redis

    1.yum添加epel源 yum install epel-release 2.安装yum  yum install redis 3.Redis 服务端配置——Could not connect to ...