美文网首页
前端UI自动化puppeteer实践

前端UI自动化puppeteer实践

作者: 海的那一边 | 来源:发表于2020-09-10 17:55 被阅读0次

背景
在表单(web页面)测试过程中,要经常对表单基本功能进行回归,曾经考虑过使用webUI自动化工具,减少重复性的操作,但是因为之前用过appium,对UI自动化的体验不是很好,所以有些纠结,但是,再仔细想一下,有可能存在比较好用又确实能提升效率的工具,也不妨去尝试一下。
上网查询了一下,puppeteer具有可以使用录制脚本的工具puppeteer-recorder、截图等功能,找了个demo开始试了一下,发现坑较少,安装方便,使用比较流畅。
puppeteer介绍
Puppeteer 是一个Node库, 它提供高级API,通过DevTools Protocol 来控制Chrome 或 Chromium。 Puppeteer 默认运行为headless ,但是可以配置为运行为non-headless。详见文末参考链接。
效果展示
目录结构
cases:用例脚本
config:配置文件,可区分测试、线上环境
screenshot_outputs:输出的截图文件
utils:用到的通用方法

image.png
运行结果截图:
image.png image.png image.png

测试思路
1、在脚本中写入测试执行步骤
2、运行脚本
3、查看执行结果(截图),查看是否符合预期。
这样操作会使简单很测试很多。就拿表单人工审核为例,全部人工操作的话,需要填写并提交表单,登录表单运营后台,找到对应的目录及表单,对表单进行审核,再重新打开表单并进行查看,而自动化的话,在写好脚本(在脚本中可进行接口请求)之后,就可以直接运行脚本,查看结果。

image.png

环境搭建
1、安装puppeteer:npm install puppeteer(前提是安装了node、npm)
2、安装chrome插件puppeteer-recorder(可自行百度,比较简单)
3、npm init,初始化一个项目
脚本编写

const puppeteer = require('puppeteer');
const config = require('../configs/constants');
const request = require('../utils/request');

/*
用例步骤:
1.医生提交表单
2.设置人工审核失败
3.修改表单
4.设置人工审核成功
5.点击编辑字段,预期不可编辑
*/

(async () => {
  const templateId = config.manulTemplate
  console.log('templateId: ', templateId)
  const urlPrefix = config.urlPrefix
  const url = `${urlPrefix}${templateId}/edit`
  console.log('submitUrl:', url)
  const cookies = config.cookies
  const auditUrlPrefix = config.auditUrlPrefix
  
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto(url)
  await page.setViewport({ width: 600, height: 1500 })

  // 设置Cookie
  await page.setCookie(...cookies)
  const cookiesSet = await page.cookies(url)
  // console.log(JSON.stringify(cookiesSet))

  // 医生填写并提交表单
  await page.goto(url)
  let input_area = await page.waitForSelector('div > div > .base > .text > .text__input')
  await input_area.type("hello world")

  // 多行文本
  const input_area_multi = await page.waitForSelector('div > div > .base > .textarea > .textarea__input')
  await input_area_multi.type("hello world02")
  await page.screenshot({path: '../screenshot_outputs/manul/01_before_subimit.png'})

  // 提交
  await page.click('.page > div > .content > .footer--btm > .operator--right')
  await page.waitForSelector('body > .mask > .prompt > .prompt__footer > .prompt__btn--primary')
  await page.click('body > .mask > .prompt > .prompt__footer > .prompt__btn--primary')
  await page.waitFor(3000)

  // 获取表单content_Uid
  let res = await request.get(`${config.getTemplateUrlPrifix}templateUid=${templateId}`)
  // console.log(res);
  const contentUid = res.data.list[0].contentUid
  console.log('url: ', `${urlPrefix}${templateId}/edit/${contentUid}`);
  await page.goto(`${urlPrefix}${templateId}/edit/${contentUid}`)
  await page.screenshot({path: '../screenshot_outputs/manul/02_afterSubmit_edit.png'})

  // 设置人工审核失败
  res = await request.put(`${auditUrlPrefix}${contentUid}`, {
       test: "test"
  })
  console.log(res);
  await page.goto(`${urlPrefix}${templateId}/edit/${contentUid}`)
  await page.screenshot({path: '../screenshot_outputs/manul/03_auditFailed.png'})

  // 修改单行文本
  input_area = await page.waitForSelector('div > div > .base > .text > .text__input')
  await input_area.type(" edit")
  await page.waitFor(3000)
  await page.screenshot({path: '../screenshot_outputs/manul/04_secondEdit.png'})
  // 提交
  await page.click('.page > div > .content > .footer--btm > .operator--right')
  await page.waitForSelector('body > .mask > .prompt > .prompt__footer > .prompt__btn--primary')
  await page.click('body > .mask > .prompt > .prompt__footer > .prompt__btn--primary')
  await page.waitFor(3000)
  
  // 设置人工审核成功
  res = await request.put(`${auditUrlPrefix}${contentUid}`, {
      test: "test"
  })
  console.log(res);
  await page.goto(`${urlPrefix}${templateId}/edit/${contentUid}`)
  await page.screenshot({path: '../screenshot_outputs/manul/05_auditSuccessful.png'})

  // 点击编辑字段
  await page.click('div > div > .base > .text > .text__input')
  await page.screenshot({path: '../screenshot_outputs/manul/06_auditSuccessful_edit.png'})
  await browser.close()
})()

遇到问题
1、puppeteer-recorder只能录制获取元素、点击元素操作,没有获取到填写文本的操作,需要修改或添加已录制好的脚本
2、有些地方例如截图前,接口请求结束后,需要使用等待方法。await page.waitFor(3000)
3、使用await进行接口请求,不然会出现同步异步问题,后面的语句开始执行(但是要用到的参数还没有获取到)
参考:
https://zhuanlan.zhihu.com/p/76237595
https://www.jianshu.com/p/679f07ba474b

相关文章

网友评论

      本文标题:前端UI自动化puppeteer实践

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