pythonui自动化测试脚本实战_第一个Pytest UI自动化测试实战实例

本文介绍了使用Python进行UI自动化测试的实战案例,详细讲解了如何利用pytest、selenium等工具设计和实现126电子邮箱的登录、联系人添加、邮件发送等功能的自动化测试脚本。包括环境配置、测试数据存储、PageObject设计模式、键盘和剪切板操作模拟、报告生成、邮件发送等关键步骤。通过项目实战,读者可以深入理解UI自动化测试的实施过程。
摘要由CSDN通过智能技术生成

前言

明天就放假了,4天小长假,是不是很开心!也许很多人要回老家帮家里种地,干农活。其实能陪陪家里人,帮忙干点农活还是挺开心的,希望大家有个愉快的假期!废话不多说哈,今天再来说说pytest吧,经过几周的时间学习,有收获也有疑惑,总之最后还是搞个小项目出来证明自己的努力不没有白费

环境准备

序号

库/插件/工具

安装命令

1

确保您已经安装了python3.x

2

配置python3+pycharm+selenium2开发环境

3

安装pytest库

pip install pytest

4

安装pytest -html 报告插件

pip install pytest-html

5

安装pypiwin32库(用来模拟按键)

pip install pypiwin32

6

安装openpyxl解析excel文件库

pip install openpyxl

7

安装yagmail发送报告库

pip install yagmail

8

确保已配置火狐或谷歌浏览器及对应驱动

9

确保已经正确配置好发送邮件的邮箱

项目简介

测试地址

测试范围

1.126电子邮箱登录功能测试-验证正确帐号密码登录成功-验证错误用户名密码登录失败(有很多情况,用例里面做了充分的校验)

2.126电子邮箱添加联系人功能测试-验证正确填写必填项数据添加联系人成功-验证缺省必填项数据添加联系人失败-验证必填项字段数据格式错误添加联系人失败

3.126电子邮箱发送邮件功能测试-验证普通邮件发送成功-验证带附件邮件发送成功

项目设计

1.python编程语言设计测试脚本

2.webdriver驱动浏览器并操作页面元素

3.二次封装webdriver Api 操作方法

4.采用PageObject设计模式,设计测试业务流程

5.通过UI对象库存储页面操作元素

6.通过数据文件存储数据,读取数据,参数化测试用例并驱动测试执行

7.通过第三方插件pytest-html生成测试报告

8.通过yagmail第三方库,编写发送报告接口,测试工作完成后自动发送测试报告

代码分析

目录结构

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 PytestAutoTestFrameWork2 |—|config3 |——|__init__.py4 |——|conf.py5 |——|config.ini6 |—|data7 |——|__init__.py8 |——|tcData.xlsx9 |—Page10 |——|PageObject.py11 |———|__init__.py12 |———|ContactPage.py13 |———|HomePage.py14 |———|LoginPage.py15 |———|SendMailPage.py16 |——|__init__.py17 |——|BasePage.py18 |—|report19 |—|TestCases20 |——|__init__.py21 |——|conftest.py22 |——|test_confactCase.py23 |——|test_loginCase.py24 |——|test_sendMailCase.py25 |—|util26 |——|__init__.py27 |——|clipboard.py28 |——|keyboard.py29 |——|parseConFile.py30 |——|parseExcelFile.py31 |——|sendMailForReport.py32 |—|conftest.py33 |—|pytest.ini34 |—|RunTestCase.py

目录结构

代码实现

通过126邮箱测试范围分析,我们需要通过设计剪切板,模拟键盘完成附件上传操作,因此我们首先来编写这两个方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 """

2 ------------------------------------3 @Time : 2019/4/15 12:044 @Auth : linux超5 @File : clipboard.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """

10 importwin32con11 importwin32clipboard as WC12

13

14 classClipBoard(object):15 '''设置剪切板内容和获取剪切板内容'''

16

17 @staticmethod18 defgetText():19 '''获取剪切板的内容'''

20 WC.OpenClipboard()21 value =WC.GetClipboardData(win32con.CF_TEXT)22 WC.CloseClipboard()23 returnvalue24

25 @staticmethod26 defsetText(value):27 '''设置剪切板的内容'''

28 WC.OpenClipboard()29 WC.EmptyClipboard()30 WC.SetClipboardData(win32con.CF_UNICODETEXT, value)31 WC.CloseClipboard()32

33

34 if __name__ == '__main__':35 from selenium importwebdriver36

37 value = 'python'

38 driver =webdriver.Firefox()39 driver.get('http://www.baidu.com')40 query = driver.find_element_by_id('kw')41 ClipBoard.setText(value)42 clValue =ClipBoard.getText()43 query.send_keys(clValue.decode('utf-8'))

clipboard.py-操作剪切板

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 """

2 ------------------------------------3 @Time : 2019/4/15 12:054 @Auth : linux超5 @File : keyboard.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """

10

11 #模拟按键

12 importwin32api13 importwin32con14 importtime15

16

17 classKeyBoard(object):18 """模拟按键"""

19 #键盘码

20 vk_code ={21 'enter' : 0x0D,22 'tab' : 0x09,23 'ctrl' : 0x11,24 'v' : 0x56,25 'a' : 0x41,26 'x' : 0x58

27 }28

29 @staticmethod30 defkeyDown(key_name):31 """按下键"""

32 key_name =key_name.lower()33 try:34 win32api.keybd_event(KeyBoard.vk_code[key_name], 0, 0, 0)35 exceptException as e:36 print('未按下enter键')37 print(e)38

39 @staticmethod40 defkeyUp(key_name):41 """抬起键"""

42 key_name =key_name.lower()43 win32api.keybd_event(KeyBoard.vk_code[key_name], 0, win32con.KEYEVENTF_KEYUP, 0)44

45 @staticmethod46 defoneKey(key):47 """模拟单个按键"""

48 key =key.lower()49 KeyBoard.keyDown(key)50 time.sleep(2)51 KeyBoard.keyUp(key)52

53 @staticmethod54 deftwoKeys(key1, key2):55 """模拟组合按键"""

56 key1 =key1.lower()57 key2 =key2.lower()58 KeyBoard.keyDown(key1)59 KeyBoard.keyDown(key2)60 KeyBoard.keyUp(key1)61 KeyBoard.keyUp(key2)62

63

64 if __name__ == '__main__':65 from selenium importwebdriver66 driver =webdriver.Firefox()67 driver.get('http://www.baidu.com')68 driver.find_element_by_id('kw').send_keys('python')69 KeyBoard.twoKeys('ctrl', 'a')70 KeyBoard.twoKeys('ctrl', 'x')

keyboard.py-模拟键盘

通过测试项目设计,我们需要把测试数据存放在Excel文件中,把页面操作元素存在UI对象库中也就是一个配置文件,那么我们需要对Excel 和 ini文件解析,因此我们开始编写这两个方法,设计UI对象库和测试数据文件

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 """

2 ------------------------------------3 @Time : 2019/4/22 16:124 @Auth : linux超5 @File : parseExcelFile.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """

10 from openpyxl importload_workbook11 from config.conf importexcelPath12

13

14 classParseExcel(object):15

16 def __init__(self):17 self.wk =load_workbook(excelPath)18 self.excelFile =excelPath19

20 defgetSheetByName(self, sheetName):21 """获取sheet对象"""

22 sheet =self.wk[sheetName]23 returnsheet24

25 defgetRowNum(self, sheet):26 """获取有效数据的最大行号"""

27 returnsheet.max_row28

29 defgetColsNum(self, sheet):30 """获取有效数据的最大列号"""

31 returnsheet.max_column32

33 defgetRowValues(self, sheet, rowNum):34 """获取某一行的数据"""

35 maxColsNum =self.getColsNum(sheet)36 rowValues =[]37 for colsNum in range(1, maxColsNum + 1):38 value =sheet.cell(rowNum, colsNum).value39 if value isNone:40 value = ''

41 rowValues.append(value)42 returntuple(rowValues)43

44 defgetColumnValues(self, sheet, columnNum):45 """获取某一列的数据"""

46 maxRowNum =self.getRowNum(sheet)47 columnValues =[]48 for rowNum in range(2, maxRowNum + 1):49 value =sheet.cell(rowNum, columnNum).value50 if value isNone:51 value = ''

52 columnValues.append(value)53 returntuple(columnValues)54

55 defgetValueOfCell(self, sheet, rowNum, columnNum):56 """获取某一个单元格的数据"""

57 value =sheet.cell(rowNum, columnNum).value58 if value isNone:59 value = ''

60 returnvalue61

62 defgetAllValuesOfSheet(self, sheet):63 """获取某一个sheet页的所有测试数据,返回一个元祖组成的列表"""

64 maxRowNum =self.getRowNum(sheet)65 columnNum =self.getColsNum(sheet)66 allValues =[]67 for row in range(2, maxRowNum + 1):68 rowValues =[]69 for column in range(1, columnNum + 1):70 value =sheet.cell(row, column).value71 if value isNone:72 value = ''

73 rowValues.append(value)74 allValues.append(tuple(rowValues))75 returnallValues76

77

78 if __name__ == '__main__':79 #excel = ParseExcel()

80 #sheet = excel.getSheetByName('login')

81 #print('行号:', excel.getRowNum(sheet))

82 #print('列号:', excel.getColsNum(sheet))

83 #84 #rowvalues = excel.getRowValues(sheet, 1)

85 #columnvalues = excel.getColumnValues(sheet, 2)

86 #valueofcell = excel.getValueOfCell(sheet, 1, 2)

87 #allvalues = excel.getAllValuesOfSheet(sheet)

88 #89 #print('第{}行数据{}'.format(1, rowvalues))

90 #print('第{}列数据{}'.format(2, columnvalues))

91 #print('{}{}单元格的内容{}'.format(1, 2, valueofcell))

92 #print('login{}'.format(allvalues))

93

94 excel =ParseExcel()95 sheet = excel.getSheetByName('mail')96 print('行号:', excel.getRowNum(sheet))97 print('列号:', excel.getColsNum(sheet))98

99 allvalues =excel.getAllValuesOfSheet(sheet)100

101 print('sendmail{}'.format(allvalues))

parseExcelFile.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值