python+android ui自动化


环境:python2.7

定位工具:weditor

手机:小米

 

1.环境搭建,需要安装python环境,和编辑工具 pycharm,然后利用python中  uiautomator2 和weditor 这两个包进行接下来的操作。

2.安装方式 直接 命令窗口 pip install 包名  (前提你在环境变量配置了 pip)

3.安装完成之后 检查环境 在命令窗口执行  python -m  uiautomator2 init 

提示这个Successfully 就是代表环境 OK

 

 

 

4.在命令窗口中执行 python -m weditor

 

 

 

 

 

 

会在浏览器中打开网页,输入设备devices信息 可以 通过 adb devices来进行查询设备 信息。出现树的模样,代表链接上手机,然后点击右上角的Reload 实时显示手机页面。 这样就可以开始你的元素定位了。

 

5.通用的元素定位方式。

 

(1)根据文本进行定位。

d(text=显示的文本).click()

 

(2)通过 resourceId 进行定位

d(resourceId="com.tcl.tclplus:id/cart_layout").click() # 进入购物 

 

3)滑动 上 或者下 

手指向上,就是页面往下拉,分两种情况 拉到底 或者 只拉一部分。

 

拉到底:

d(scrollable=True).scroll.toEnd()

拉一部分:

d.swipe(0.806, 0.801,0.818, 0.487) # 向上滑动  横坐标可以不变,纵坐标是变化的,是变小的趋势  这是手指向上

以此类推 那么需要手指向下:

 

拉倒底:就是拉倒页面首页 开头部分

 

d(scrollable=True).scroll.toBeginning(steps=50)

 

拉一部分

 

横坐标不变,纵坐标是变化的,是变大的趋势  这是手指向下

 

 

(4)滑动 左右 

d(scrollable=True).scroll.horiz.toEnd() #横向滚动到最右侧

d(scrollable=True).scroll.horiz.toBeginning() #横向滚动到最左侧

 

或者

c.水平向右滚动:d(scrollable=True).scroll.horiz.forward(steps=50)
 
d.水平向左滚动:d(scrollable=True).scroll.horiz.backward(steps=50)
 
(5)滑动到指定位置:滑动到文本为测试的位置
 
d(scrollable=True).scroll.to(text ='测试')

 

(6)元素判断  可以这样写,通过判断元素的存在性来执行不同的操作

s = self.d(resourceId="com.tcl.tclplus:id/iot_txt_home_name", text=u"立即登录", className="android.widget.TextView")
if len(s) == 0:
print '元素未找到,执行退出操作'

 

(7)随机字符串或者随机字母 输入

a = random.sample(string.ascii_letters, 4)
data = ''.join([str(x) for x in a])

d(resourceId="com.tcl.tclplus:id/et_invoice_header").set_text(data)

  随机从大小写字母中取四位,然后写入到输入框中。

 

(8)截图

filepaths 就是截图所存的路径,可以自己填写。

filepaths = os.path.normpath(os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)), "Automation/Tcase")))
def get_png(self, filename, filepath='/Member'):
"""
截图操作,默认截图的存储路径为Member
"""
imgName = filename + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png' # 截图可以单独保存为别的名字的文件
stringPath = filepaths + '/image' + filepath + '\\' + imgName
print stringPath
# img.save('filename.png')#图片保存在当前项目的文件夹下边
self.d.screenshot().save(stringPath) # 保存文件到指定的文件夹下边

self.get_png(filename='订单-取消购买'.decode('utf-8'), filepath='/Market/订单')  实际调用的时候 需要进行decode



(9)apk 自动安装

def install_app(path):
app_Path = lambda x: os.path.join(file_path, "app", x)
apk = app_Path(path + ".apk")
os.system('adb install -r -d ' + apk)
time.sleep(5)

(10)报告生成

用例文件很多 采用 关键字匹配的方式进行。
def all_case():
testcase = unittest.TestSuite() # 加载测试套件
# 用例的目录,关键字进行匹配
discover = unittest.defaultTestLoader.discover(filepath, pattern='Market*.py', top_level_dir=None)
testcase.addTest(discover)
return testcase


@UI_Report(testcase=all_case(),ReportPath=filepath+'/report/result.html')
def run():
print '生成测试报告'


if __name__ == '__main__':
run()

 

这里加了一个装饰器 

def UI_Report(testcase, ReportPath):
"""
根据传入的testcase 来判断执行哪种报告生成方式。
"""

def Report(s):
@wraps(s)
def creat_report():
AA = hasattr(testcase,'__call__')
# AA = isfunction(testcase)
if AA:
print '这个是函数'
suite = unittest.makeSuite(testcase)
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自动化', description=r'接口自动化测试报告')
runner.run(suite) #区别
fp.close()
else:
print '不是函数,是执行run_main方法'
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自动化测试报告', description=r'商城')
runner.run(testcase)
fp.close()

return creat_report

return Report

 

 

 

 

 因为run_main 去执行的时候,是打印所有的用例文件+名称

而通过测试套件 添加 类名称时,执行方式不一样

 

 

 

至于公共函数,比如启动app、一些共有的操作,可以写到 公共函数中,

 

 

在unitest中 增加setupclass 函数 是只 启动一次app,跟setup 区别一下

 

下面增加你的公共函数。然后用例文件中 直接通过继承的方式来进行

 

例如

class test(commons):

 

 

执行的过程中需要加上一个清理环境的操作,例如为了保证用例执行可靠 和 及时删除调截图。


def del_file(filepath):
listdir = os.listdir(filepath) # 获取文件和子文件夹
for rename in listdir:
rename = filepath + "//" + rename
if os.path.isfile(rename): # 是文件
os.remove(rename) # 删除文件
elif os.path.isdir(rename): # 是子文件
duellist = os.listdir(rename)
for f in duellist: # 遍历该子文件夹
file_path = os.path.join(rename, f)
if os.path.isfile(file_path): # 删除子文件夹下文件
os.remove(file_path)
elif os.path.isdir(file_path): # 强制删除子文件夹下的子文件夹
shutil.rmtree(file_path)


可以在用例文件执行开头增加一些 调用方法

 

 

如删除截图 和初始化 app环境 都是可以的 

 

至此  python2.7+android+UI自动化分享完毕。大家有兴趣一起学习。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM