pytest全局变量的使用

这里重新阐述下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小时,全程实战!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)

1.拓扑图 2.过程如下 2.1 首先PC1和PC2配置好IP地址 2.2 在SW1上配置虚拟网关及VLAN <Huawei>system-view [Huawei]sysname SW1 [SW1]undo info-center enable [SW1] [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet 0/0/1 [SW1-GigabitEthernet0/0/1]port li…

docker.service配置docker镜像加速

加速器配置方法很多&#xff0c;小白我用的是docker.service文件&#xff0c;所以直接在里面配置啊 配置以后&#xff0c;要systemctl daemon-reload下 &#xff0c;然后docker info 下看下镜像地址是否是自己已配置的 docker run --privilegedtrue --name mytomcat -p 8080…

利用QT画图像的直方图

1.什么是直方图 直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间&#xff0c;统计每个区间内数据所占比例或数量&#xff0c;并用矩形条形图表现出来。直方图可以反映样本数据的分布情况&#xff0c;例如它们的集中趋势、对称性和离散程度等。 …

2011年03月17日 Go生态洞察:探索Go与C的交互——Cgo

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【深度学习】手写数字识别

文章目录 一、步骤1.导包2.查看数据集图片3.多层感知器4.结果 总结 一、步骤 1.导包 #导入需要的包 import numpy as np import paddle as paddle import paddle.fluid as fluid from PIL import Image import matplotlib.pyplot as plt import os from paddle.fluid.dygraph…

Linux awk命令

除了使用 sed 命令&#xff0c;Linux 系统中还有一个功能更加强大的文本数据处理工具&#xff0c;就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然&#xff0c;此命令的设计者有 3 位&#xff0c;他们的姓分别是 Aho、Weingberger 和 Kernighan&#x…

第十八章Swing程序设计总结

例题18.1&#xff1a;第一个窗体程序 例题18.2&#xff1a;在窗体中弹出对话框 例题18.3&#xff1a;弹出会话框&#xff0c;问用户准备好了吗&#xff1f; 例题18.4&#xff1a;弹出会话框&#xff0c;询问用户是否离开 例题18.5&#xff1a;弹出会话框&#xff0c;让用户输入…

[LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II

目录 160.相交链表 题目 思路 代码 141.环形链表 题目 思路 代码 142.环形链表II 题目 思路 代码 160.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 给你两个…

开源七轴myArm协作机械臂正逆运动学技术讲解

引言&#xff1a; 在本文中&#xff0c;我们将深入探讨机器人学的两个核心概念&#xff1a;正运动学和逆运动学。这两个概念是理解和控制机械臂运动的基础。通过一个具体的7轴机械臂实例&#xff0c;我们将详细介绍如何计算机械臂的正运动学和逆运动学。我们首先会解释正运动学…

[设计模式] 建造者模式

一、引言 起因是学习okhttp过程中遇到的这段代码 Request request original.newBuilder().url(original.url()).header("Authorization", "Bearer " BearerTokenUtils.getToken(configuration.getApiKey(), configuration.getApiSecret())).header(&quo…

《第三期(先导课)》之《Python 开发环境搭建》

文章目录 《第 1 节 初始Python》《第 6 节 pip包管理工具》 《第 1 节 初始Python》 。。。 《第 6 节 pip包管理工具》 pip是Python的包管理工具,用于安装、升级和管理Python包。 pip是Python标准库之外的一个第三方工具,可以从Python Package Index(PyPI)下载和安装各种P…

在PostgreSQL中创建和管理数据库

PostgreSQL是一个强大、开源的关系型数据库管理系统&#xff0c;它提供了丰富的功能和灵活的配置选项&#xff0c;使得它成为许多开发者和组织的首选数据库之一&#xff0c;接下来我会介绍如何在PostgreSQL中创建和管理数据库。 一、安装和配置PostgreSQL 第一步&#xff0c;…

嵌软工程师要掌握的硬件知识2:一文看懂什么是开漏和推挽电路(open-drain / push-pull)

文 / 黑猫学长 本文根据笔者个人工作/学习经验整理而成,如有错误请留言。 文章为付费内容,已加入原创侵权保护,禁止私自转载及抄袭。 文章所在专栏: 嵌软工程师要掌握的硬件知识 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管…

【mysql】CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常&#xff1a;通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

先看看实现的最终效果 前言 之前的对话系统因为存在一些错误和原作者不允许我分享&#xff0c;所以被我下架了&#xff0c;而且之前对话系统确实少了一些功能&#xff0c;比如最基本的逐字打印功能&#xff0c;原本来是打算后面补充的。 对话系统在游戏中实现太常见了&#x…

基于 Python 的课程助教智能聊天机器人

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 课程助教是高校中一种常见的教学模式,其在学生理论知识的掌握与实践能力的提高方面起到关键性的作用,已经成为高校日常教育环节中不可或缺的一环。然而,传统的人力助教有若干关键问题亟待…

Leangoo领歌免费Scrum管理工具中如何看到关于自己的所有任务?

个人工作台 个人工作台是个人最新待办工作的展示区域&#xff0c;它展示了个人所有的待办任务&#xff0c;最新访问的项目和工作动态&#xff0c;当一个人在多个项目和看板上工作时&#xff0c;它可以帮助个人快速看到个人在各个项目的工作&#xff0c;快速进入任务看板处理任…

Flink集群的搭建

1、Flink独立集群模式 1、首先Flink的独立集群模式是不依赖于Hadoop集群。 2、上传压缩包&#xff0c;配置环境&#xff1a; 1、解压&#xff1a; tar -zxvf flink-1.15.2-bin-scala_2.12.tgz2、配置环境变量&#xff1a;vim /etc/profileexport FLINK_HOME/usr/local/soft/fl…

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat&#xff1a;用于…

【理解链表指针赋值】链表中cur->next = cur->next->next->next与cur =cur->next->next的区别

最近在做链表的题目的时候&#xff0c;对于所定义的cur链表指针产生了一些疑惑&#xff0c;查阅资料后整理一下我的理解&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(n…