pytest全局变量的使用

news2024/12/23 17:19:59

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

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

这里直接提供代码:

全局变量

conftest.py

"""
conftest.py 全局变量,主要实现以下功能:
1、添加命令行参数broswer, 用于切换不用浏览器
2、全局参数driver调用
"""

import pytest
from selenium import webdriver

def 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 time

from 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 webdriver
    driver = 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, time


class Test_login():
    url = loginpage.url
    username_data = loginpage.username
    paw_data = loginpage.password
    print("调用信息   账号: %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.coloradmin.cn/o/1181774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+LayUI仓库管理系统

一.项目介绍 本项目是使用JavaSpringBoot开发,可以实现仓库的注册、登录,登录后可进入系统,进行客户管理、供应商管理、商品管理、商品退货查询管理、登录日志及退出等几大模块。系统界面采用传统的后台管理界面,界面简单、直观。…

2023年“走红军走过的路”徒步穿越系列活动(大通湖站)盛大开赛!

“蟹”逅红色大通湖 徒步秋色水波中 ——“中国体育彩票” 2023年“走红军走过的路”徒步穿越系列活动(大通湖站)暨大通湖半程马拉松盛大开赛! 11月5日上午8:30,2023年“走红军走过的路”徒步穿越系列活动(大通湖站&…

数据结构-Prim算法构造无向图的最小生成树

引子: 无向图如果是一个网,那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的,我们称 这颗权值和最小的树为:“最小生成树”(MST)。 其中,一棵树的代价就是树中所有权值之和。 而…

幂等最佳实践

1、什么是幂等? 根据百度百科解释: “幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数&…

删除word最后一页之后的空白页

最近编辑word比较多,有时最后一页(最后一页内容还有可能是表格)之后,还有一页空白页,单独按下backspace、del都删不掉,很让人着急。 经过查询有几种方法: (1)点击选中空…

kubernetes(5) 续4

目录 volumes emptyDir卷 hostpath卷 nfs卷 持久卷 storageclass statefulset控制器 mysql主从部署 volumes emptyDir卷 [rootk8s2 volumes]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata:name: vol1 spec:containers:- image: busyboxplusname: vm1command: ["…

pyqt5的组合式部件制作(一)

以多选一的选择器为例,来实践一下工程实用级别的组合式部件设计。自己之前做的自定义的组合式部件,结构不够简单优化,在实际的工程里面,使用部件的过程比较繁琐。所以,这里来做一个优化的实验。 之所以做这个组合部件&…

DevChat:开源AI编程助手的全面解析

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【场景方案】前端如何结合GPT提升我们的开发效率,个人经验总结,不定期更新~

文章目录 AI模型的选择提问的方式很重要心里建设提问方法论设立角色从总体到局部步骤拆分,循序渐进举例子说明主动让他联系上文不要太纠结提问的方式 网址推荐尾巴 不说废话,没有铺垫,直接开始讲重点 AI模型的选择 首先咱们要选择一个适合的…

3-知识补充-HTTP协议

3-知识补充-HTTP协议 文章目录 3-知识补充-HTTP协议HTTP协议基础什么是HTTP?HTTP协议的会话方式HTTP1.0和HTTP1.1的区别 请求和响应报文报文的格式报文解析实例-请求百度官网请求报文-GET请求请求报文-POST请求-学习用-非请求百度官网响应报文 响应状态码有代表性的…

第八章认识Express框架

目录 Express模块化路由 基本概述 基本使用 基本构建 案例项目 Express接收请求参数 基本概述 基本类别 Express接收GET请求参数 Express接收POST请求参数 Express接收路由参数 Express模块化路由 基本概述 在Express中,路由是指确定应用程序如何响应对…

功率放大器的工作原理及选购技巧

功率放大器是电子设备中非常重要的组成部分之一,它的主要功能是将输入信号的功率进行放大,以驱动高功率负载。在各种应用领域中,如音频放大器、无线电频率放大器、射频功率放大器等,功率放大器都发挥着非常重要的作用。下面将介绍…

Kubernetes二进制搭建

目录 一、K8S的架构 二、K8S创建Pod资源的工作流程 三、K8S资源对象和资源配置信息 K8S资源对象 K8S资源配置信息 四、K8S的的三种网络和三种接口 三种网络: 三种节点: 五、etcd 集群 etcd 的特点: 六、flannel flannel方案 K8S …

指令手册术语缩写

指令手册术语缩写 1 指令汇总表中的操作码列(不带VEX前缀的指令)2 指令汇总表中的操作码列(带有VEX前缀的指令)3 操作码汇总表中的指令列 本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。 1 指令汇总表中的操作码列(不带VEX前缀的指令) 2 指令汇总表中的…

阿里云安全恶意程序检测(速通三)

阿里云安全恶意程序检测 特征工程进阶与方案优化pivot特征构建pivot特征pivot特征构建时间pivot特征构建细节特点 业务理解和结果分析结合模型理解业务多分类问题预测结果分析 特征工程进阶基于LightGBM模型验证模型结果分析模型测试 优化技巧与解决方案升级内存管理控制加速数…

【配置】如何在打包Spring Boot项目时按需使用日常、测试、预发、正式环境的配置文件

文章目录 前言1. 创建5个配置文件2. 在pom.xml文件中如下配置3. 在application.properties中加入环境变量 前言 在我们开发项目的时候,一般有四套环境:日常、测试、预发、正式。日常环境作为我们开发环境;测试环境给测试同学测试功能&#x…

基于厨师算法的无人机航迹规划-附代码

基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …

Canal同步Mysql数据到ES以及Springboot项目查询ES数据

1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…

C++进阶篇4---番外-AVL树

一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一…

Microsoft Dynamics 365 CE 扩展定制 - 8. DevOps

在本章中,我们将介绍以下内容: 使用PowerShell导出Dynamics 365解决方案使用PowerShell部署解决方案构建解决方案层次结构修补解决方案暂存解决方案使用SolutionPackager在源代码管理中保存解决方案使用PackageDeployer将您的解决方案与配置数据打包基于解决方案版本增量触发…