游戏攻略网
当前位置: 首页 游戏攻略

常用的自动化测试工具有哪些(一篇文章快速教你如何搭建数据驱动自动化测试框架)

时间:2023-06-10 作者: 小编 阅读量: 2 栏目名: 游戏攻略

前言说到数据驱动自动化测试,你会不会有这样的疑问:数据怎么管理?数据怎么才能驱动测试用例执行?那么本篇文章就教你如何进行数据驱动测试,相信你一定能对数据驱动的自动化测试有一个不一样的理解,希望这篇文章能帮助还在懵懵懂懂的你了解数据驱动测试,如何来做数据驱动测试?这时候我们需要封装一套无论何种定位方式都可以使用的通用的查找方法。

前言

说到数据驱动自动化测试,你会不会有这样的疑问:数据怎么管理?数据怎么才能驱动测试用例执行?到底怎么样才算数据驱动?那么本篇文章就教你如何进行数据驱动测试,相信你一定能对数据驱动的自动化测试有一个不一样的理解,希望这篇文章能帮助还在懵懵懂懂的你了解数据驱动测试,如何来做数据驱动测试?那么就跟上我的脚步吧^_^

一、项目介绍

地址:http://www.126.com/

1.实现126邮箱登录功能的验证

2.实现126邮箱添加新联系人功能的验证

二、目录结构三、项目源码

1.新建config目录存放和业务无关的数据文件,比如PageElementLocator.ini 用来存放我们每个页面的定位元素表达式。

[126mail_login]loginPage.frame=xpath>//div[@id='loginDiv']/iframeloginPage.username=xpath>//input[@name='email']loginPage.password=xpath>//input[@name='password']loginPage.loginBtn=xpath>//a[@id='dologin'][126mail_homePage]HomePage.addressbook=id>_mail_tabitem_1_4text[126mail_addContactPage]addContactPage.newContact=xpath>//span[text()='新建联系人']addContactPage.newName=id>input_NaddContactPage.newMail=xpath>//div[@id='iaddress_MAIL_wrap']//input[@class='nui-ipt-input']addContactPage.newMark=xpath>//span[@class='nui-chk-text']/preceding-sibling::span/baddContactPage.newPhone=xpath>//div[@id='iaddress_TEL_wrap']//input[@class='nui-ipt-input']addContactPage.newComment=id>input_DETAILaddContactPage.newCommit=xpath>//span[text()='确 定']

2.有了上面元素的表达式我们又该如何查找我们的元素呢?这时候我们需要封装一套无论何种定位方式都可以使用的通用的查找方法。新建util目录(util目录主要存放和我们业务无关的公共方法),此目录下新建ObjectMap.py文件

from selenium.webdriver.support.wait import WebDriverWaitdef getElement(driver, by, locate):'''查找单一个元素:param driver: 浏览器驱动:param by: 定位方式,id, name, class, xpath...:param locate: 定位表达式:return: 元素'''try:element = WebDriverWait(driver, 30).until(lambda x :x.find_element(by, locate))except Exception as e:raise eelse:return element def getElelments(driver, by, locate):'''查找一组元素:param driver: 浏览器驱动:param by: 定位方式:param locate: 定位表达式:return: 一组元祖组成的列表'''try:elements = WebDriverWait(driver, 30).until(lambda x :x.find_elements(by, locate))except Exception as e:raise eelse:return elements if __name__=='__main__':from selenium import webdriverdriver = webdriver.Firefox()driver.get('http://www.baidu.com')inputBaidu = getElement(driver, 'id', 'kw')inputBaidu.send_keys('python')

3.定位表达式有了,查找元素的方法封装好了,下面我们需要解析配置文件,获取配置文件中我们需要的定位方式和定位表达式。同样在util目下新建ParseConfigurationFile.py文件用来解析配置文件

from config.varCondig import pageElementLocatorPath 2 import configparser 34 class ParseConfigFile(object): 5''' 6解析ini配置文件 7''' 8def __init__(self): 9try:10self.cf = configparser.ConfigParser() # 获取配置文件对象11self.cf.read(pageElementLocatorPath, encoding='utf-8') # 加载配置文件到内存中12except Exception as e:13raise e14 15def getItemsSection(self, sectionName):16'''17获取section下面所有section的键值18:param sectionName:19:return:20'''21try:22vlaues = dict(self.cf.items(sectionName))23except Exception as e:24raise e25else:26return vlaues27 28def getElementValue(self, sectionName, optionName):29try:30locator = self.cf.get(sectionName, optionName).split('>')31except Exception as e:32raise e33else:34return locator # 获取option键对应的value35 36def getAllSections(self):37try:38allsections = self.cf.sections()39except Exception as e:40raise e41else:42return allsections # 所有的sections返回值是个列表43 44def getAllOptions(self, section):45try:46options = self.cf.options(section)47except Exception as e:48raise e49else:50return options # 某个section下面的键51 52 if __name__=='__main__':53cf = ParseConfigFile()54locator = cf.getElementValue('126mail_login','loginPage.username')55# print(locator)56print(cf.getItemsSection('126mail_login'))57print(cf.getAllSections())58print(cf.getAllOptions('126mail_addContactPage'))

4.我们获取到了每一个元素的定位方式和定位表达式,接下来我们又该如何查找到我们的元素对象呢?这时候我们会想到PO(pageObject)设计模式,把我们每一个page页面的元素保存到对应页面的文件中。

新建pageObjects目录,在此目录下分别创建HomePage.py LoginPage.py NewContact.py 三个页面文件

LoginPage.py文件存放我们登录页面所需要的元素, HomePage.py 存放登录成功后首页所需要的页面元素, NewContact.py文件存放我们添加联系人页面所需要的元素。

from util.ObjectMap import * 2 from util.ParseConfigurationFile import ParseConfigFile 3 class LoginPage(object): 4''' 5登录页面所有的操作元素对象 6''' 7def __init__(self, driver): 8self.driver = driver 9self.cf = ParseConfigFile()10 11def switchToFrame(self):12'''13切换到frame中14:return:15'''16by, locator = self.cf.getElementValue('126mail_login', 'loginPage.frame')17try:18self.driver.switch_to.frame(getElement(self.driver, by,locator))19except Exception as e:20raise e21 22def switchToDefaultFrame(self):23'''24跳出frame25:return:26'''27try:28self.driver.switch_to.default_content()29except Exception as e:30raise e31 32def userNameObj(self): # 用户名输入框33by, locator = self.cf.getElementValue('126mail_login', 'loginPage.username')34 35username = getElement(self.driver, by, locator)36return username37 38def passwordObj(self): # 密码输入框39by, locator = self.cf.getElementValue('126mail_login', 'loginPage.password')40 41password = getElement(self.driver, by, locator)42return password43 44def loginBtnObj(self): # 登录按钮45by, locator = self.cf.getElementValue('126mail_login', 'loginPage.loginBtn')46 47loginbtn = getElement(self.driver, by, locator)48return loginbtn49 50 if __name__=='__main__':51from selenium import webdriver52import time53driver = webdriver.Firefox()54driver.get('http://mail.126.com')55login = LoginPage(driver)56time.sleep(5)57login.switchToFrame()58login.userNameObj().send_keys('linuxxiaochao')59login.passwordObj().send_keys('xiaochao11520')60login.loginBtnObj().click()61login.switchToDefaultFrame()62driver.quit()from util.ObjectMap import * #查找元素的模块 2 from util.ParseConfigurationFile import ParseConfigFile 34 class HomePage(object): 56def __init__(self, driver): 7self.driver = driver 8self.cf = ParseConfigFile() 9 10def addressLink(self):11'''12通讯录菜单对象13:return:14'''15by, locator = self.cf.getElementValue('126mail_homePage','homePage.addressbook')16 17elementObj = getElement(self.driver, by, locator)18return elementObj19 20 if __name__=='__main__':21from selenium import webdriver22from pageObjects.LoginPage import LoginPage23import time24driver = webdriver.Firefox()25driver.get('http://mail.126.com')26login = LoginPage(driver)27homePage = HomePage(driver)28time.sleep(5)29login.switchToFrame()30login.userNameObj().send_keys('linuxxiaochao')31login.passwordObj().send_keys('xiaochao11520')32login.loginBtnObj().click()33login.switchToDefaultFrame()34time.sleep(3)35homePage.addressLink().click()36time.sleep(10)37driver.quit()from util.ParseConfigurationFile import ParseConfigFile 2 from util.ObjectMap import * 34 class AddContactPage(object): 5''' 6添加联系人页面所有操作元素对象 7''' 8def __init__(self, driver): 9self.driver = driver10self.cf = ParseConfigFile()11 12def newContact(self): # 新建联系人13by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newContact')14 15element = getElement(self.driver, by, locator)16return element17 18def addName(self): # 姓名输入框19by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newName')20 21element = getElement(self.driver, by, locator)22return element23 24def addMail(self): # 电子邮件输入框25by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newMail')26 27element = getElement(self.driver, by, locator)28return element29 30def markStar(self): # 设为星际联系人31by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newMark')32 33element = getElement(self.driver, by, locator)34return element35 36def addPhone(self): # 手机号码输入框37by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newPhone')38 39element = getElement(self.driver, by, locator)40return element41 42def addContent(self): # 备注43by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newComment')44 45element = getElement(self.driver, by, locator)46return element47 48def clickCommitBtn(self): # 确定按钮49by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newCommit')50 51element = getElement(self.driver, by, locator)52return element53 54 if __name__=='__main__':55from selenium import webdriver56import time57from pageObjects.HomePage import HomePage58from appModules.LoginAction import LoginAction59 60driver = webdriver.Firefox()61driver.get('http://mail.126.com')62time.sleep(3)63# 登录64LoginAction.login(driver,'linuxxiaochao', 'xiaochao11520')65# 主页面66homepage = HomePage(driver)67homepage.addressLink().click()68time.sleep(5)69# 添加联系人页面70addcontact = AddContactPage(driver)71addcontact.newContact().click()72time.sleep(2)73addcontact.addName().send_keys('test')74addcontact.addMail().send_keys('13691579846@qq.com')75addcontact.addPhone().send_keys('13691579846')76addcontact.addContent().send_keys('ceshi')77addcontact.markStar().click()78time.sleep(3)79addcontact.clickCommitBtn().click()

5.接下来考虑,我们的框架需要数据驱动?那么我们该怎么用数据驱动我们测试呢?是不是应该通过修改测试数据能够控制我们用例的执行还是不执行呢?没错,大概就是这个样子,那我们又该如何来设计我们的数据呢?大概最好的办法就是使用excel文件来存储或者如果你有能力可以考虑使用数据库来存储,看下我们的表格是什么样子。

新建testData目录存放我们测试过程中所有和业务数据相关的数据文件,并新建126MailContact.xlsx 文件,文件中分两个sheet 126account 和 126contact 分别存放登录和联系人数据

6.通过上面的表我们可以看到两列数据“是否执行”,没错了我们就是通过这来控制数据是否驱动用例执行的,用例执行后写入测试是否通过和测试执行时间(代码中我没加写入时间,感兴趣的自己在用例只加就行了)

7.有了这些数据我们又该如何读取到这些数据应用到我们的用例中呢?在util目录下新建ParseExcel.py 用来解析excel文件

from openpyxl import load_workbook 2 from config.varCondig import * 3 class ParseExcel(object): 4''' 5解析excel文件的封装 6''' 7def __init__(self): 8# 加载excel文件到内存 9self.wb = load_workbook(testExcelValuePath)10 11def getRowValue(self, sheetName, rawNo):12'''13获取某一行的数据14:param sheetName:15:param rawNo:16:return: 列表17'''18sh = self.wb[sheetName]19rowValueList = []20for y in range(2, sh.max_column 1):21value = sh.cell(rawNo,y).value22rowValueList.append(value)23return rowValueList24def getColumnValue(self, sheetName, colNo):25'''26获取某一列的数据27:param sheetName:28:param colNo:29:return: 列表30'''31sh = self.wb[sheetName]32colValueList = []33for x in range(2, sh.max_row1):34value = sh.cell(x, colNo).value35colValueList.append(value)36return colValueList37 38def getCellOfValue(self, sheetName, rowNo, colNo):39'''40获取某一个单元格的数据41:param sheetName:42:param rowNo:43:param colNo:44:return: 字符串45'''46sh = self.wb[sheetName]47value = sh.cell(rowNo, colNo).value48return value49def writeCell(self, sheetName, rowNo, colNo, value):50'''51向某个单元格写入数据52:param rowNo: 行号53:param colNo: 列号54:param value:55:return: 无56'''57sh = self.wb[sheetName]58sh.cell(rowNo, colNo).value = value59self.wb.save(testExcelValuePath)60 if __name__=='__main__':61p = ParseExcel()62print(p.getRowValue('126account',2))63print(p.getColumnValue('126account',3))64print(p.getCellOfValue('126account', 2, 3))

8.在config目录下新建varConfig.py文件来存储一些目录信息和数据表对应的列号

1import os 23 # print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 4 # 项目目录 5 parentDirPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 6 # init文件路径 7 pageElementLocatorPath = parentDirPath r'\config\PageElementLocator.ini' 8 # excel文件路径 9 testExcelValuePath = parentDirPath r'\testData\126MailContact.xlsx'10 # 日志文件存放路径11 logPath = parentDirPathr'\log'12 13 # 126username 表,每列对用的序号14 account_userName = 215 account_passWord = 316 account_dataBook = 417 account_isExecute = 518 account_testResult = 619 20 # 126联系人表,每列对应的序号21 contact_contactName = 222 contact_contactMail = 323 contact_contactStar = 424 contact_contactPhone = 525 contact_contactComment = 626 contact_contactKeyWords = 727 contact_contactIsExcute = 828 contact_contactExcuteTime = 929 contact_contactTestResult = 1030 31 if __name__=='__main__':32 33print(pageElementLocatorPath)34print(testExcelValuePath)35print(logPath)

9.所有的数据已经准备完全,我们可以编写用例了把?等等! 我们是不是要考虑把业务功能封装一下呢?这样也方便以后依赖这些功能的用例直接调用!新建目录appModules 此目录用来存放业务功能代码,

目录下新建LoginAction.py 和 AddContact.py 文件

# 封装登录方法 23 from pageObjects.LoginPage import LoginPage 4 class LoginAction(object): 5def __init__(self): 6pass 78@staticmethod # 9def login(driver, username, password):10'''11登录场景12:param driver:13:param username:14:param password:15:return:16'''17login = LoginPage(driver)18login.switchToFrame()19login.userNameObj().send_keys(username)20login.passwordObj().send_keys(password)21login.loginBtnObj().click()22login.switchToDefaultFrame()23 24 if __name__=='__main__':25from selenium import webdriver26driver = webdriver.Firefox()27driver.get('http://mail.126.com')28LoginAction.login(driver, 'linux', 'chao')from pageObjects.HomePage import HomePage 2 from pageObjects.NewContact import AddContactPage 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 from util.ParseConfigurationFile import ParseConfigFile 67 class NewContactPersonAction(object): 8def __init__(self): 9pass10 11@staticmethod12def addressLink(driver):13'''14点击通讯录按钮15:param driver:16:return:17'''18homePage = HomePage(driver)19# 点击通讯录20homePage.addressLink().click()21@staticmethod22def addContact(driver, contactName, contactMail, isSatr, contactPhone, contactComment):23'''24添加联系人场景25:param driver:26:param contactName:27:param contactMail:28:param isSatr:29:param contactPhone:30:param contactComment:31:return:32'''33# 点击新建联系人34addContact = AddContactPage(driver)35# 调试的时候这边有时候会报错。点击不到[新建联系人]这个按钮,所以加了一个显示等待36by, locator = ParseConfigFile().getElementValue('126mail_addContactPage', 'addContactPage.newContact')37WebDriverWait(driver, 30).until(EC.element_to_be_clickable((by, locator)))38addContact.newContact().click()39if contactName:40# 非必填项41addContact.addName().send_keys(contactName)42# 必填项43addContact.addMail().send_keys(contactMail)44if isSatr == '是':45addContact.markStar().click()46if contactPhone:47addContact.addPhone().send_keys(contactPhone)48if contactComment:49addContact.addContent().send_keys(contactComment)50addContact.clickCommitBtn().click()51 52 if __name__=='__main__':53from appModules.LoginAction import LoginAction54import time55from selenium import webdriver56driver = webdriver.Firefox()57driver.get('http://mail.126.com')58time.sleep(5)59LoginAction.login(driver, 'linux', 'chao')60NewContactPersonAction.addressLink(driver)61NewContactPersonAction.addContact(driver, '','123456@qq.com', '是', '','')62time.sleep(5)63driver.quit()

10.我们的大体框架就已经搭建完成了,貌似还少了个执行日志,我们在util目录下新建log.py封装日志模块, 加入到我们想加入的任何地方(用例中我就加了几条,可以自己任意加在想加的位置)

import logging 2 import time 3 from config.varCondig import * 45 class Logger(object): 6''' 7封装的日志模块 8''' 9def __init__(self, logger, CmdLevel=logging.INFO, FileLevel=logging.INFO):10"""11 12:param logger:13:param CmdLevel:14:param FileLevel:15"""16self.logger = logging.getLogger(logger)17self.logger.setLevel(logging.DEBUG)# 设置日志输出的默认级别18# 日志输出格式19fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')20# 日志文件名称21# self.LogFileName = os.path.join(conf.log_path, "{0}.log.txt".format(time.strftime("%Y-%m-%d")))# %H_%M_%S22currTime = time.strftime("%Y-%m-%d")23self.LogFileName = logPath r'\log' currTime '.txt'24# 设置控制台输出25# sh = logging.StreamHandler()26# sh.setFormatter(fmt)27# sh.setLevel(CmdLevel)# 日志级别28 29# 设置文件输出30fh = logging.FileHandler(self.LogFileName)31fh.setFormatter(fmt)32fh.setLevel(FileLevel)# 日志级别33 34# self.logger.addHandler(sh)35self.logger.addHandler(fh)36 37 if __name__ == '__main__':38logger = Logger("fox",CmdLevel=logging.DEBUG, FileLevel=logging.DEBUG)39logger.logger.debug("debug")40logger.logger.log(logging.ERROR,'%(module)s %(info)s',{'module':'log日志','info':'error'}) #ERROR,log日志 error

11.目前为止我们的框架就算已经搭建完成了,接下来就是编写我们的测试用例了^_^,新建testCases目录存放测试用例,并新建TestMail126.py编写用例

1 from selenium import webdriver 2 import time 3 from appModules.LoginAction import LoginAction 4 from appModules.AddContact import NewContactPersonAction 5 from config.varCondig import * 6 from util.ParseExcel import ParseExcel 7 from util.Log import Logger 8 import logging 9 import traceback10 11 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)12 p = ParseExcel()13 sheetName = p.wb.sheetnames # 获取所有的sheetname 是个列表14 15 # print(sheetName)16 def bDriver():17try:18driver = webdriver.Firefox()19driver.get('http://mail.126.com')20driver.implicitly_wait(30)21except Exception as e:22raise e23else:24return driver25 26 def testMailLogin(driver):27'''28测试用例29:return:30'''31# 是否执行列数据32isExcute = p.getColumnValue(sheetName=sheetName[0], colNo=account_isExecute)33# print(isExcute)34for idx,value in enumerate(isExcute[:]):35# print(idx, value) # 获取是否执行列数据列表的索引和数据36if value.lower() == 'y':37userRowValue = p.getRowValue(sheetName[0], idx 2) # 获取执行状态为y所在行的数据38userName = userRowValue[account_userName-2]39passWord = userRowValue[account_passWord-2]40# driver = bDriver()41# 登录42LoginAction.login(driver,userName, passWord)43time.sleep(10) # 足够的时间加载登录成功的页面44try:45assert '通讯录' in driver.page_source46except Exception as e:47log.logger.info('断言"通讯录"失败,错误信息{}'.format(traceback.format_exc()))48p.writeCell(sheetName[0], idx2, account_testResult, 'failed')49# raise e50else:51log.logger.info('{},{}登录成功, 断言”通讯录“成功'.format(userName, passWord))52p.writeCell(sheetName[0], idx2, account_testResult, 'pass')53# 获取联系人数据表中是否执行列的数据54isExcute = p.getColumnValue(sheetName=sheetName[1], colNo=contact_contactIsExcute)55for idx, value in enumerate(isExcute):56 if value.lower() == 'y':57# 获取y表示行的数据58contactPersonValue = p.getRowValue(sheetName[1], idx 2)59# 获取添加联系人所需的数据60# 联系人姓名61contactPersonName = contactPersonValue[contact_contactName-2]62# 联系人邮箱63contactPersonMail = contactPersonValue[contact_contactMail-2]64# 是否为星级联系人65contactPersonStar = contactPersonValue[contact_contactStar-2]66# 联系人手机号67contactPersonPhone = contactPersonValue[contact_contactPhone-2]68# 联系人备注69contactPersonComment = contactPersonValue[contact_contactComment-2]70# 验证页面包含的关键字71contactAssert = contactPersonValue[contact_contactKeyWords-2]72NewContactPersonAction.addressLink(driver)73NewContactPersonAction.addContact(driver, contactPersonName, contactPersonMail74, contactPersonStar, contactPersonPhone, contactPersonComment)75try:76assert contactAssert in driver.page_source77except Exception as e:78p.writeCell(sheetName[1], idx2, contact_contactTestResult, 'failed')79raise e80else:81p.writeCell(sheetName[1], idx 2, contact_contactTestResult, 'pass')82# 设置足够长的时间 让添加联系人成功后的提示框自动消失,当然可以自己写代码关闭83time.sleep(10)84driver.quit()85 86 if __name__=='__main__':87driver = bDriver()88testMailLogin(driver)

12.用例编写完成,我们再来编写一个统一执行用例的入口文件,在项目根目录下新建RunTest.py

1 from selenium import webdriver 2 import time 3 from appModules.LoginAction import LoginAction 4 from appModules.AddContact import NewContactPersonAction 5 from config.varCondig import * 6 from util.ParseExcel import ParseExcel 7 from util.Log import Logger 8 import logging 9 import traceback10 11 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)12 p = ParseExcel()13 sheetName = p.wb.sheetnames # 获取所有的sheetname 是个列表14 15 # print(sheetName)16 def bDriver():17try:18driver = webdriver.Firefox()19driver.get('http://mail.126.com')20driver.implicitly_wait(30)21except Exception as e:22raise e23else:24return driver25 26 def testMailLogin(driver):27'''28测试用例29:return:30'''31# 是否执行列数据32isExcute = p.getColumnValue(sheetName=sheetName[0], colNo=account_isExecute)33# print(isExcute)34for idx,value in enumerate(isExcute[:]):35# print(idx, value) # 获取是否执行列数据列表的索引和数据36if value.lower() == 'y':37userRowValue = p.getRowValue(sheetName[0], idx 2) # 获取执行状态为y所在行的数据38userName = userRowValue[account_userName-2]39passWord = userRowValue[account_passWord-2]40# driver = bDriver()41# 登录42LoginAction.login(driver,userName, passWord)43time.sleep(10) # 足够的时间加载登录成功的页面44try:45assert '通讯录' in driver.page_source46except Exception as e:47log.logger.info('断言"通讯录"失败,错误信息{}'.format(traceback.format_exc()))48p.writeCell(sheetName[0], idx2, account_testResult, 'failed')49# raise e50else:51log.logger.info('{},{}登录成功, 断言”通讯录“成功'.format(userName, passWord))52p.writeCell(sheetName[0], idx2, account_testResult, 'pass')53# 获取联系人数据表中是否执行列的数据54isExcute = p.getColumnValue(sheetName=sheetName[1], colNo=contact_contactIsExcute)55for idx, value in enumerate(isExcute):56 if value.lower() == 'y':57# 获取y表示行的数据58contactPersonValue = p.getRowValue(sheetName[1], idx 2)59# 获取添加联系人所需的数据60# 联系人姓名61contactPersonName = contactPersonValue[contact_contactName-2]62# 联系人邮箱63contactPersonMail = contactPersonValue[contact_contactMail-2]64# 是否为星级联系人65contactPersonStar = contactPersonValue[contact_contactStar-2]66# 联系人手机号67contactPersonPhone = contactPersonValue[contact_contactPhone-2]68# 联系人备注69contactPersonComment = contactPersonValue[contact_contactComment-2]70# 验证页面包含的关键字71contactAssert = contactPersonValue[contact_contactKeyWords-2]72NewContactPersonAction.addressLink(driver)73NewContactPersonAction.addContact(driver, contactPersonName, contactPersonMail74, contactPersonStar, contactPersonPhone, contactPersonComment)75try:76assert contactAssert in driver.page_source77except Exception as e:78p.writeCell(sheetName[1], idx2, contact_contactTestResult, 'failed')79raise e80else:81p.writeCell(sheetName[1], idx 2, contact_contactTestResult, 'pass')82# 设置足够长的时间 让添加联系人成功后的提示框自动消失,当然可以自己写代码关闭83time.sleep(10)84driver.quit()85 86 if __name__=='__main__':87driver = bDriver()88testMailLogin(driver)

总结

以上就是整个数据驱动测试框架的完整代码,希望可以帮助到大家,喜欢的小伙伴可以点赞收藏评论加关注。

    推荐阅读
  • steam棋牌游戏推荐(幸运之夜新版本亮相TGC)

    steam棋牌游戏推荐12月1日,2017腾讯游戏嘉年华正式在成都开幕,腾讯的VR社交游戏《幸运之夜》在现场发布了最新版本。VR《幸运之夜》在TGC2017上惊艳亮相《幸运之夜》新版本发布邀请好友一起游戏今年7月底,《幸运之夜》正式在Steam发布,并推出了首款游戏作品“德州扑克”。今年的TGC2017现场,《幸运之夜》全新版本便带来了对互动性方面的提升。

  • 儿童睡前故事卖火柴的小女孩大全(卖火柴的小女孩)

    在长发公主的故事里,兔子小姐变成了手持宝剑的骑士,穿过了山川和河流,战胜了地狱恶犬,最终救出了长着一头金黄色长发的熊猫先生。随着一阵空间的波动,熊猫先生和兔子小姐来到了冰天雪地的圣诞节。小女孩被这突如其来的变化惊呆了。熊猫先生没有回答,轻轻摸了摸小女孩的头。小女孩点燃了第二根火柴。熊猫先生和兔子小姐则来到壁炉前,商量起小女孩最后一个愿望。熊猫先生蹲下来,握起小女孩的手。

  • 怎样做ppr管快一点(PPR管安装方法及技巧)

    怎样做ppr管快一点PPR管安装方法及技巧首先准备好需要的材料:热熔机,小剪刀,ppr管,管件,手巾。一定要根据自己热熔ppr管的口径,准备相应的热熔头。清洁:清洁管材与管件的焊接段部位,建议用95%浓度酒精擦净。在熔接时间内迅速的将管材无旋转的垂直插入管件中,并维持5秒以上,然后按相应冷却时间冷却。热熔后做到横平竖直,美观大方。

  • 大托特包搭配技巧(大托特包搭配技巧简述)

    西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄搭配撞色托特包,优雅而不失俏皮,让气场变得灵动起来内搭白色连帽卫衣,减龄又可爱,接下来我们就来聊聊关于大托特包搭配技巧?大托特包搭配技巧西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄。衬衫+托特包白色的衬衫休闲慵懒,给人一种空灵的感觉以及干净纯粹的气质。

  • 刘涛电视剧口碑(电视剧景气指数第一)

    还记得3月份刘涛在和周渝民主演的《大宋宫词》中扮嫩出演少妇被很多观众吐槽。万万没想到时隔数月,刘涛带着她的新剧《星辰大海》杀回来了。目前主要的剧情线在刘涛饰演的女主简爱身上。因为小时候意外发现母亲出轨的事,得知真相的父亲激愤之下杀死母亲并自杀,简爱因此成为了一个孤女。逃出傻子家的简爱在与姑姑的争执中误伤姑姑,从此开启逃命生涯。简爱从面馆辞职走投无路,误打误撞进入大公司之后面临着同事的故意刁难。

  • 外墙装修材料有哪些 外墙装修材料有哪些类型

    外墙涂料具有装饰性良好、耐污染耐老化以及施工维修容易和价格合理的特点。一般来说釉面外墙砖有亚光面与无光面两大类。它的装饰的效果也不错,有柚木色、深灰色等等可供选择。由于它的表面的肌理很清晰,所以色泽漂亮且装饰性极强。本站,中国知名大型装修平台,装修领导品牌。

  • 世界上有哪些花(世界上有哪些花 名字)

    瓜叶菊、香豌豆、夏兰、石竹、石蒜、荷花、翠菊、睡莲、福禄考、晚香玉、万寿菊、千日红、建兰、铃兰、报岁兰、香堇、大岩桐、水仙、小草兰、瓜叶菊、蒲包花、免子花、入腊红、三色堇、百日草、鸡冠花、一串红。孔雀草、大波斯菊、金盏菊、非洲凤仙花、菊花、非洲菊、观赏凤梨类、射干、非洲紫罗兰、天堂鸟、炮竹红、菊花、康乃馨、红掌、满天星、星辰花、三角梅、虞美人。

  • 长歌行李长歌母亲是谁杀的(长歌行李长歌的简介)

    下面更多详细答案一起来看看吧!长歌行李长歌母亲是谁杀的《长歌行》李长歌母亲是自杀的。李长歌,太子李建成之女,生母则是回纥王族。父母手足均死于玄武门之变,满怀愤恨的长歌凭高超武艺逃出皇宫,并在追捕过程中制造“坠崖假死”而逃生,其后女扮男装隐瞒身份流落民间,一心只想为父母复仇,在家和国的利害冲突中,最后放弃复仇,和阿诗勒隼一起成为了民族和解的使者。

  • 什么时候喝蛋白粉增肌效果最好(什么时候喝蛋白粉增肌效果最好)

    从长远来看,这种方法被证明可以促使肌肉明显增长。如果摄入量超过一定的阈值,蛋白质的合成就会受限。如果是以乳清饮料的形式摄入乳清蛋白,运动者可以在运动结束后立即饮用。按每公斤体重1克的标准,在健身前后立即摄入以及在运动后1小时内摄入可快速吸收的碳水化合物,可以明显抑制肌肉分解,并大大促进肌肉快速和明显的增长。在这种情况下,大量分泌的胰岛素促进了氨基酸向工作中的肌肉运输,为蛋白质合成奠定基础。

  • 窦骁周冬雨山楂树之恋结局(周冬雨18岁第一次出演)

    周冬雨18岁第一次出演要说最近最火的电影,非《少年的你》莫属,上映14天,已经收获了12.45亿的票房成绩,成为现阶段最强的票房黑马而作为该片主演的周冬雨和易烊千玺,也凭借在该片中的精彩演出,演技得到大众的进一步认可作为“。