美文网首页
微信公众号UI自动化回归

微信公众号UI自动化回归

作者: 龙猫六六 | 来源:发表于2019-06-25 14:44 被阅读0次

背景

微信公众号有业务范畴,需要实现微信UI自动化,来提高回归效率,减轻测试压力。

测试需求分析

1.微信为第三方app,无微信源码
2.微信公众号UI自动化测试,如Android系统,细分Native,H5两块UI自动化
3.微信有黑厂

测试方案设计

1.微信是个比较成熟的软件,本身质量稳定,因此针对公众号测试更多关注的是公众号功能本身,即H5页面测试。考虑平台开放性,选择Android版本微信作为回归载体
2.在上述的基础上,公众号UI自动化框架选型FAutoTest。主要考虑FAutoTest为微信自研UI自动化框架,对微信H5自动化兼容性好;支持Native,H5两种自动化测试,满足测试需求。

环境搭建

FAutoTest官网:https://github.com/Tencent/FAutoTest
参考官网完成环境的搭建:依赖环境+FAutoTest开发环境
注意:
1.只支持Python2.7.x
2.安装Python库,确认pip对应Python2.7.x

image.png

测试用例编写

官网提供的用例相对简单,下述内容在demo基础上丰富用例,更接近实际应用场合

工程介绍

官网git下工程,使用pycharm打开,工程结果如下:


image.png

1.dist:fastAutoTest依赖框架,需要到该路目录下运行手动下载

pip install dist/fastAutoTest-xxx.whl(whl文件请在dist目录下手动下载)

2.docs:说明文档目录,API使用方法可以再次进行参考
3.fastAutoTest:核心代码文件夹
4.sample:测试脚本文件夹

Navtive UI API介绍

FAutoTest集成了uiautomator,使用uiautomator实现Native UI自动化,常用API方法如下:

  • 应用启动
//adb 命令行启动微信 
cmd = 'adb shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI'
  • 连接设备
//依赖包名
from uiautomator import Device
//通过设备id,连接设备
androidDriver = Device('SJE5T17821003335')
  • 控件获取/点击
from uiautomator import Device
androidDriver = Device('SJE5T17821003335')
self.driver=androidDriver

#文本获取控件
self.driver(text='控件文案').click()              //控件点击
content=self.driver(text='控件文案').text    //控件文案获取

#resourceId获取控件+点击
self.driver(resourceId='resourceId').click()              //控件点击
content=self.driver(resourceId='resourceId').text   //控件文案获取

#className获取控件+点击
self.driver(className='className').click()              //控件点击
content=self.driver(className='className').text    //控件文案获取

H5 UI API介绍

FautoTest提供API来实现H5页面的获取及操作,一般微信公众号常用操作行为大致为如下三类:点击,文案输入,页面滑动。从应用场景出发简单这三类操作模拟:

  • 控件点击
    def clickElementByXpath(self, xpath, visibleItemXpath =None, duration=50, tapCount=1)
    接口说明: 点击指定xpath的控件当控件不可见时,会自动滑动到该控件可见时,再进行点击当container为空时,默认滑动点为整个屏幕中间
    参数说明: xpath:要点击控件的xpath
    visibleItemXpath:当有container时,传入container中任意一个当前可见item的xpath,之后将目标滑到该可见item的位置
    duration:两次点击的间隔时间
    tapCount:点击次数

  • 控件文案输入
    def textElementByXpath(self, xpath, text)
    接口说明:先获取输入框的焦点,再使用Chrome debug协议的输入api,输入文字内容
    参数说明: xpath:输入框的xpath
    text:要输入的文字

  • 屏幕滑动
    def scrollWindow(self, x, y, xDistance, yDistance, speed=80)
    接口说明:通过坐标来滑动(屏幕的左上角为(0,0),向下和向右坐标逐渐增大)
    参数说明: x: 滑动的起始X点坐标
    y: 滑动的起始Y点坐标
    xDistance: X方向滑动的距离
    yDistance: Y方向滑动的距离
    speed: 滑动的速度

  • 返回上一页
    def returnLastPage(self)
    接口说明:返回上一页

  • 获取控件
    def getElementClassNameByXpath(self, xpath)
    接口说明: 获取目标的className
    参数说明: xpath:目标的xpath

  • 控件是否存在
    def isElementExist(self, xpath)
    接口说明: 返回一个boolean,判断该element是否存在
    参数说明: xpath: 目标的xpath

脚本demo

# coding=utf-8
import sys
import os
#添加运行环境描述,便于命令行启动
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)


from fastAutoTest.core.h5.h5Engine import H5Driver
import  unittest
from uiautomator import Device as d
from uiautomator import Device
from time import sleep

class wechatPublicTest(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        # cmd = 'adb shell am force-stop com.tencent.mm'
        #使用adb命令调起微信
        cmd = 'adb shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI'
        os.system(cmd)
        #对应设备的deviceName,对应多台设备
        androidDriver = Device('SJE5T17821003335')
        #对应pc只连接一台设备,执行用户暂时用这种方式,通用性好
        # androidDriver = d
        self.driver=androidDriver
        #休眠一下,等待微信主页面加载完毕
        sleep(2)

    #微信原生界面流程测试(uiautomator框架),进度小说分站首页
    def test_case0_public_native(self):
        #找到微信主页面的“通讯录” 并点击
        self.driver(text='通讯录').click()
        #点击公众号
        self.driver(text='公众号').click()
        #上下滑动去找测试公众号
        self.driver(scrollable=True).scroll.to(text="测试公众号")

        self.driver(text='测试公众号').click()
        sleep(1)
        self.driver(text='阅读记录').click()
        sleep(1)
        self.driver(text='最爱小说').click()
        sleep(3)


    #书籍搜索
    def test_case1_public_Search(self):
        #初始化driver
        h5Driver = H5Driver()
        h5Driver.initDriver()

        # 进入书城首页
        h5Driver.clickFirstElementByText('首页')

        sleep(2)
        h5Driver.clickElementByXpath('//*[@class="icon icon-search"]')

        sleep(2)
        h5Driver.textElementByXpath('//*[@id="search-input"]', "民国奇人")

        sleep(2)
        h5Driver.clickElementByXpath('//*[@class="btn f-fr"]')

        sleep(2)
        bookName=h5Driver.getElementByXpath('//*[@class="bookDesc"]/h3').text

        self.assertTrue((bookName == "民国奇人"), '搜索异常,无目标书籍《民国奇人》')

        sleep(1)
        h5Driver.clickElementByXpath('//*[@class="bookDesc"]')

        sleep(1)

        #书籍中文校验
        print "begin"
        content = h5Driver.getElementByXpath('//*[@class="m-content"]/p[1]').text
        print len(content)
        # 考虑到书籍文字会根据
        self.assertTrue(len(content) > 1, "书籍中文加载失败")


        #书籍章节名获取
        articleTitle = h5Driver.getElementByXpath('//*[@class="m-content"]/h1[1]/span[1]').text
        # print articleTitle
        flag = (articleTitle=='第二章 鲁班教中师与徒')

        #书籍中文滑动到底部
        h5Driver.scrollWindow(0, 0, 0, 1000,160)

        sleep(1)
        h5Driver.clickFirstElementByText('目录')

        #根据flag,选择目标章节的目录点击
        sleep(1)
        if flag:
            h5Driver.clickFirstElementByText('第一章 三道坎镇有邪事')
        else:
            h5Driver.clickFirstElementByText('第二章 鲁班教中师与徒')
        sleep(3)

        title = h5Driver.getElementByXpath('//*[@class="m-content"]/h1[1]/span[1]').text

        targetTitle="第二章 鲁班教中师与徒"
        if flag:
            targetTitle="第一章 三道坎镇有邪事"

        print  "targetTitle:" + targetTitle
        print  "title:" + title
        self.assertTrue(title==targetTitle)

Jenkins持续继承

  • 1.命令行启动测试脚本
cd /Users/jc/Documents/pythonWorkSpace/AndroidUI/FAutoTest/sample
python BookDemo.py 
  • 2.新建Jenkins测试任务,将上述命令行脚本输入构建shell中,如下图


  • 3.设置Jenkins持续运行参数,如运行时间,结果抄送邮件

相关文章

网友评论

      本文标题:微信公众号UI自动化回归

      本文链接:https://www.haomeiwen.com/subject/gqwzqctx.html