pytest全局变量的使用

这里重新阐述下PageObject设计模式:

PageObject设计模式是selenium自动化最成熟,最受欢迎的一种模式,这里用pytest同样适用

这里直接提供代码:

全局变量

conftest.py

"""
conftest.py 全局变量,主要实现以下功能:
1、添加命令行参数broswer, 用于切换不用浏览器
2、全局参数driver调用
"""import pytest
from selenium import webdriverdef pytest_addoption(parser):'''添加命令行参数 --browser'''parser.addoption("--browser", action="store", default="firefox", help="browser option: firefox or chrome")@pytest.fixture(scope='session')   # 以实现多个.py跨文件使用一个session来完成多个用例
def driver(request):'''定义全局driver参数'''name = request.config.getoption("--browser")if name == "firefox":driver = webdriver.Firefox()elif name == "chrome":driver = webdriver.Chrome()else:driver = webdriver.Chrome()print("正在启动浏览器名称: %s" % name)# 需要登陆就调用登陆函数def fn():print("当全部用例执行完之后: teardown driver!")driver.quit()request.addfinalizer(fn)return driver

loginpage.py

'''
作者:Caric_lee
日期:2018
'''
import timefrom autoTest.pytest_selenium.common.basepage import BasePage
from autoTest.pytest_selenium.common.logging import Log
from autoTest.pytest_selenium.page.mysql_python import Mysql# 获取数据库数据
mysql_test = Mysql('localhost','3306','root','123456','test')
dataAll = mysql_test.query('select * from auto_test')
username = dataAll[0]['username']
password = dataAll[0]['password']
url = dataAll[0]['url']
print("查询数据库信息   账号: %s,  密码: %s, url: %s" % (username, password, url))class Login(BasePage):log = Log()# 断言登录页,提示文本hint_text_element = ('xpath', "//*[@class='crm-login1-header']/h1")hint_text = '登录销售易'# 断言忘记密码forget_paw_elemet = ('xpath', "//*[text()='忘记密码?']")forget_paw = '忘记密码'# 断言免费注册Free_registration_element = ('xpath', "//*[text()='免费注册']")Free_registration_text = '免费'# 断言'欢迎登录销售易'tenant_interface = ('xpath', "//*[text()='欢迎登录销售易']")tenant_interface_text = '欢迎登录'# 元素定位input_username_element = ('xpath', "//*[@name='loginName']")input_paw_element = ('xpath', "//*[@placeholder='请输入密码']")click_enter_element = ('xpath', "//*[text()='登     录']")clikc_tenant_element = ('xpath', "//span[text()='自动化测试_0202_1109_正式' and @class='crm-company-name']")def assert_title(self):result = self.is_text_in_element(self.hint_text_element, self.hint_text)self.log.info("assert: 断言登录页,提示文本: %s" % result)def assert_forget_paw(self):result = self.is_text_in_element(self.forget_paw_elemet, self.forget_paw)self.log.info("assert: 断言忘记密码: %s" % result)def assert_Free_registration(self):result = self.is_text_in_element(self.Free_registration_element, self.Free_registration_text)self.log.info("assert: 断言免费注册: %s" % result)def input_username(self, username):self.send_keys(self.input_username_element, username)def input_paw(self, paw):self.send_keys(self.input_paw_element, paw)def click_enter(self):self.click(self.click_enter_element)def assert_tenant_interface(self):result = self.is_text_in_element(self.tenant_interface, self.tenant_interface_text)self.log.info("assert: 欢迎登录销售易: %s" % result)def move_scroll_end(self):time.sleep(3)self.js_focus_element(self.clikc_tenant_element) # 这里已经可以实现滚动了self.log.info("聚焦滚动结束!")def click_tenant(self):  # 选择租户self.click(self.clikc_tenant_element)self.log.info("选择租户成功!")def login(self, username=username, paw=password):'''登录流程'''self.assert_title()     # 断言登录页,提示文本self.assert_forget_paw()    # 断言忘记密码self.assert_Free_registration() # 断言免费注册self.input_username(username)self.input_paw(paw)self.click_enter()time.sleep(3)self.assert_tenant_interface()  # 断言'欢迎登录销售易'print("---------------------->>>>>>>>>>>>>")self.move_scroll_end()self.click_tenant()if __name__=='__main__':from selenium import webdriverdriver = webdriver.Chrome()base = Login(driver)driver.get(url)driver.maximize_window()driver.implicitly_wait(10)base.login()# 学习备注!# 调试某个功能的时候,就只写这个功能点的代码去调# 加载转圈是js报错了,前端的问题,是bug  (滚动条)

test_login.py

'''
作者:Caric_lee
日期:2018
'''
from autoTest.pytest_selenium.page import loginpage
from autoTest.pytest_selenium.page.loginpage import Login
import pytest, timeclass Test_login():url = loginpage.urlusername_data = loginpage.usernamepaw_data = loginpage.passwordprint("调用信息   账号: %s,  密码: %s, url: %s" % (username_data, paw_data, url))@pytest.fixture(scope="function",  autouse=True)   # function 默认参数传递,autouse=True 自动调用fixture功能def test_01(self, driver):driver.get(self.url)driver.maximize_window()driver.implicitly_wait(10)self.login = Login(driver)def test_02(self):'''登录'''# 1、断言登录页,提示文本self.login.assert_title()# 2、断言忘记密码self.login.assert_forget_paw()# 3、断言免费注册self.login.assert_Free_registration()# 4、输入账号self.login.input_username(self.username_data)# 5、输入密码self.login.input_paw(self.paw_data)# 6、点击登录self.login.click_enter()time.sleep(3)# 7、断言'欢迎登录销售易'self.login.assert_tenant_interface()# 8、滚动到底部self.login.move_scroll_end()# 9、点击租户self.login.click_tenant()time.sleep(5)def test_03(self, driver):time.sleep(5)driver.quit()if __name__ == '__main__':# 选择测试浏览器pytest.main(["-s", "--browser=chrome", "test_login.py"])

这里直接指向test_login.py文件就OK了,

还可以在优化,把loginpage中的读取数据库信息,单独写个方法,放在page里面,直接读取。

数据结构还需要在调整

这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/189360.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统,系统采用mvc模式(BLLDALENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为mysql,使用c#语…

【Unity之UI编程】玩法面板的实现

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:UI_…

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案,它们各有优势和不足,选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架,它提供了一套完整的微服务解决方案&#xff0…

OpenMMlab导出yolov3的onnx模型并推理

手动导出 直接使用脚本 import torch from mmdet.apis import init_detector, inference_detectorconfig_file ./configs/yolo/yolov3_mobilenetv2_8xb24-ms-416-300e_coco.py checkpoint_file yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth mod…

Django(复习篇)

项目创建 1. 虚拟环境 python -m venv my_env ​ cd my_env activate/deactivate ​ pip install django ​2. 项目和app创建 cd mypros django-admin startproject Pro1 django-admin startapp app1 ​3. settings配置INSTALLED_APPS【app1"】TEMPLATES【 DIRS: [os.pat…

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…

数据结构-双向链表

目录 1.带头双向循环链表: 2. 带头双向循环链表的实现: 双向链表初始化: 双向链表打印: 开辟节点函数: 双向链表头插: 双向链表尾插: 双向链表头删: 双向链表尾删&#xff…

指标体系:洞察变化的原因

一、指标概述 指标体系是指根据运营目标,整理出可以正确和准确反映业务运营特点的多个指标,并根据指标间的联系形成有机组合。 指标体系业务意义极强,所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图,试求: (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树?是否为完全二叉树? (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…

算法之双指针

双指针算法的作用 双指针算法是一种使用2个变量对线性结构(逻辑线性/物理线性),进行操作的算法,双指针可以对线性结构进行时间复杂度优化,可以对空间进行记忆。 双指针算法的分类 1.快慢指针 2.滑动窗口 3.左右指针 4.前后指针 双指针OJ题目…

docker可视化

什么是portainer? portainer就是docker图形化界面的管理工具,提供一个后台面板供我们操作 目前先用portainer(先用这个),以后还会用到Rancher(CI/CD在用) 1.下载portainer 9000是内网端口,8088是外网访问端口 docker run…

Linux文件系统(1)

Linux文件系统(1) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容从系统层面重新认识我们的文件系统 文…

每日一题(LeetCode)----数组--长度最小的子数组

每日一题(LeetCode)----数组–长度最小的子数组 1.题目( 209.长度最小的子数组) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &…

【入门Flink】- 10基于时间的双流联合(join)

统计固定时间内两条流数据的匹配情况,需要自定义来实现——可以用窗口(window)来表示。为了更方便地实现基于时间的合流操作,Flink 的 DataStrema API 提供了内置的 join 算子。 窗口联结(Window Join) 一…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

SOME/IP 协议介绍(四)RPC协议规范

RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息&#xff0c;可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释&#xff0c;而第[SIP_RPC_450页&#xff0c;第36页]节讨论了选择哪种传输协议。…

【Go入门】面向对象

【Go入门】面向对象 前面两章我们介绍了函数和struct&#xff0c;那你是否想过函数当作struct的字段一样来处理呢&#xff1f;今天我们就讲解一下函数的另一种形态&#xff0c;带有接收者的函数&#xff0c;我们称为method method 现在假设有这么一个场景&#xff0c;你定义…

Linux驱动开发——PCI设备驱动

目录 一、 PCI协议简介 二、PCI和PCI-e 三、Linux PCI驱动 四、 PCI设备驱动实例 五、 总线类设备驱动开发习题 一、 PCI协议简介 PCI (Peripheral Component Interconnect&#xff0c;外设部件互联) 局部总线是由Intel 公司联合其他几家公司一起开发的一种总线标准&#…

前端开发引入element plus与windi css

背景 前端开发有很多流行框架&#xff0c;像React 、angular、vue等等&#xff0c;本文主要讲vue 给新手用的教程&#xff0c;其实官网已经写的很清楚&#xff0c;这里再啰嗦只是为了给新手提供一个更加简单明了的参考手册。 一、打开element plus官网选则如图所示模块安装命令…