当前位置: 首页 > news >正文

第二种:夹具(脚手架)的抽取和使用

1.因为登录功能的用例只需要打开和关闭一次游览器,故可将webdriver步骤创建在一个fixture(脚手架)中
.共享夹具的使用
1.conftest.py为pytest的共享夹具,pytest自动发现并执行
2.在test_cases文件夹中新建conftest.py模块
importpytestfromseleniumimportwebdriver ​@pytest.fixture(scope='class')defdriver():withwebdriver.Chrome()aswd:# 最大化游览器wd.maximize_window()# 返回游览器对象,不能使用return,return返回之后会关闭游览器,无法进行后续操作yieldwd
3.登录模块使用共享夹具,修改test_cases文件夹下test_login.py文件,修改后内容
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC ​importsettings ​classTestLogin:# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(settings.PROJECT_HOST+settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
4.混合夹具的使用
4.1.在pytest中,可以使用不同风格的夹具4.2.当需要在一个测试类的测试执行前后输出日志时,使用pytest风格的夹具难以实现该功能,可以通过unittest或者xunit风格实现
4.3.登录模块混合夹具的使用:修改test_cases文件夹下test_login.py文件,将常用模块绑定到类属性,定义前后置内容,通过对象方法调用常用模块
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC ​importsettingsfromcommonimportlogger ​classTestLogin:name='登录功能'logger=logger settings=settings ​# xunit风格的前置后置@classmethoddefsetup_class(cls):cls.logger.info('======={}测试开始======'.format(cls.name))@classmethoddefteardown_class(cls):cls.logger.info('======={}测试结束======'.format(cls.name))# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(self.settings.PROJECT_HOST+self.settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(self.settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(self.settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
5.测试用例基类的抽取:可以将公用代码抽取到基类中,并将公共模块绑定到类属性中
6.测试用例基类的编写:测试模块前后置打印内容一致,故在test_cases文件夹下新建base_case.py文件
importsettingsfromcommonimportloggerclassBaseCase:''' 测试用例基类 '''# 测试套名称name=Nonelogger=logger settings=settings# xunit风格的前置后置@classmethoddefsetup_class(cls):cls.logger.info('======={}测试开始======'.format(cls.name))@classmethoddefteardown_class(cls):cls.logger.info('======={}测试结束======'.format(cls.name))
7.测试用例基类的使用:使测试用例继承BaseCase类实现公共模块的复用,修改test_cases文件夹下的test_login.py文件
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromtest_cases.base_caseimportBaseCase# 继承基类classTestLogin(BaseCase):name='登录功能'# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(self.settings.PROJECT_HOST+self.settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(self.settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(self.settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
7.1.通过运行main.py入口文件可执行用例7.2.至此,简单的ui自动化框架搭建完成,后续对框架进行优化
http://www.cnnetsun.cn/news/2909875.html

相关文章:

  • 飞思卡尔56F80x DSP中断与系统寄存器实战配置指南
  • 5分钟掌握YimMenu:GTA5最强免费安全辅助工具实战指南
  • (十)多UnitId模拟:一个网关下面挂多个从站怎么测
  • Redis 从入门到精通:Redis Sentinel 哨兵
  • 星露谷物语SMAPI终极指南:5分钟学会安全安装模组框架
  • 英雄联盟自动化工具终极指南:如何通过智能助手提升60%游戏效率
  • 5分钟快速上手:使用Scrapy-pinduoduo构建专业级拼多多数据采集系统
  • 别再手动删点了!用Python的RDP算法5分钟搞定轨迹/轮廓简化(附Shapely避坑指南)
  • 从地图App的流畅缩放,到游戏模型的轻量加载:聊聊Ramer-Douglas-Peucker算法背后的工程智慧
  • MC68341芯片选与RTC配置实战:从寄存器原理到嵌入式系统稳定设计
  • 别被坑了!2026实测好用的AI论文写作工具|实测必入避坑版
  • 别再手动维护字典了!用Python装饰器实现一个自己的Registry注册器(附完整代码)
  • 抖音内容下载终极指南:从零搭建自动采集系统的完整方案
  • 深入解析NXP KE1x系列PCC外设时钟控制器:原理、配置与低功耗实践
  • 实战指南:用Python的巴特沃斯滤波器,给你的传感器数据(比如Arduino或树莓派采集的)降降噪
  • 从你家墙上的220V到手机充电器:RMS电压到底是怎么影响我们日常用电的?
  • 终端与IDE形态的vibe coding实测:两款AI编程工具迭代能力对比
  • 从“表面相似“到“语义匹配“:BERTScore如何重塑你的文本评估体验?
  • 中国大模型价格战背后的AI基础设施重构
  • 高层次综合设计乒乓buffer(double-buffer/pingpong-buffer)
  • MC68349串口驱动与JTAG边界扫描实战:嵌入式通信与硬件调试核心技术解析
  • NSK双滑块定位承载装置技术手册
  • APK Installer:在Windows电脑上运行安卓应用的终极指南
  • 手把手复现:用Python仿真验证电容容抗公式1/(j*2*pi*f*C),附代码与波形分析
  • 豆包暴跌610万用户的真相:AI产品免费模式的死亡螺旋与破局路径
  • “泄露了windows12“
  • 从PCL/VTK迁移到C#/Halcon?手把手教你用ActiViz.NET实现三维点云可视化(避坑指南)
  • DSGE模型终极指南:如何从零开始掌握宏观经济建模的40个经典案例
  • FUXA工业可视化平台实战指南:快速构建专业级SCADA监控系统
  • Cursor Free VIP:破解AI编程助手限制的技术实现与深度应用指南