web自动化实现登录的几种方式

news2025/2/23 22:52:08

目录

前言

一、python+unittest框架实现登录功能

二、python+selenium实现登录功能

三、python+requests库实现登录功能


前言

今天主要想介绍python语言+不同的自动化测试框架的结合方式来模拟登录功能。想了解自动化测试框架的同学不要错过哦!


一、python+unittest框架实现登录功能

1.封装公共方法

在common目录下封装方法,具体代码如下:

import requests
class RequestHandler:
    def __init__(self):
        """session管理器"""
        self.session = requests.session()

    def visit(self,method,url,params = None,data=None,json=None,headers=None):
        result = self.session.request(method,url,params=params,data=data,json=json,headers=headers,verify=False)
        try:
            #返回json结果
            print(result)
            return result.json()
        except Exception:
            return 'not json'
    def close_session(self):
        self.session.close()

2.调用

创建文件:test_login.py,在文件中可结合allure报告实现登录的不同场景。具体代码如下:

import unittest
import allure
import os
import pytest
from common.requests_handler import RequestHandler

@allure.epic("web自动化")
@allure.feature("登录功能")

class TestLogin(unittest.TestCase):
    def setUp(self):
        #请求类实例化
        self.req = RequestHandler()

    def tearDown(self):
        self.req.close_session()


    @allure.severity("critical")
    @allure.title("正确的用户名、密码登录")
    def test_login_success(self):
        """
        正确的用户名、密码
        """
        with allure.step("step1:输入正确的用户名、密码"):
            print("输入正确的用户名、密码")
        with allure.step("step2:校验登录结果:登录成功"):
            print("登录成功")
        login_url = 'https://example.com/login'
        body = {
            "name":"test",
            "password":"test1234"
        }

        res = self.req.visit('post',login_url,json=body)
        #根据请求结果中的code进行断言
        print(res)
        self.assertEqual(0,res['code'])


    @allure.title("错误的用户名、正确的密码登录")
    def test_login_wrong_name(self):
        """
        错误的用户名、正确的密码
        """

        with allure.step("step1:输入错误的用户名、正确的密码"):
            print("输入错误的用户名、正确的密码")
        with allure.step("step2:校验登录结果:登录失败,报错提示:用户不存在"):
            print("登录失败")

         login_url = 'https://example.com/login'
         body = {
             "name":"test1",
             "password":"test1234"
         }


        res = self.req.visit('post', login_url, json=body)
        # 根据请求结果中的code进行断言
        self.assertEqual(16020, res['code'])
        #根据请求结果中的message进行断言
        self.assertEqual("用户不存在",res['message'])


    @allure.title("正确的用户名、错误的密码登录")
    def test_login_wrong_pwd(self):
        """
        正确的用户名、错误的密码
        """

        with allure.step("step1:输入正确的用户名、错误的密码"):
            print("输入正确的用户名、错误的密码")
        with allure.step("step2:校验登录结果:登录失败,报错提示:账号有误,登录失败"):
            print("登录失败")

         login_url = 'https://example.com/login'
         body = {
             "name":"test",
             "password":"test12"
         }


        res = self.req.visit('post', login_url, json=body)
        # 根据请求结果中的code进行断言
        self.assertEqual(16002, res['code'])
        #根据请求结果中的message进行断言
        self.assertEqual("账号有误,登录失败",res['message'])


if __name__ == '__main__':
    pytest.main(['-vs', 'test_login.py', '--clean-alluredir', '--alluredir=allure-results'])
    os.system(r"allure generate -c -o allure-report")

二、python+selenium实现登录功能

1.selenium自动化

创建文件test_login.py文件,结合allure+selenium实现登录并获取cookies传递给后面的请求。具体代码如下:

import allure
import pytest
import os,time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
timestamp = time.time()



@allure.feature("web自动化测试")
@allure.title("登录")
def test_login():

    """
    采用selenium框架登录获取cookie成功
    """

    driver = webdriver.Chrome()
    # 窗口最大化
    driver.maximize_window()
    # 打开网页
    driver.get("https://example.com")
    time.sleep(2)

    #刷新页面
    driver.refresh()
    #截屏
    driver.get_screenshot_as_file("D:\\test\\1.jpg")
    # 实例化 By 类的对象
    by_xpath = By.XPATH
    # 元素获取及点击
    # 使用by_xpath 对象调用 xpath 方法
    driver.find_element(by=by_xpath, value="//input[@id = 'identifier']").send_keys("填具体的用户名")
    driver.find_element(by=by_xpath, value="//input[@id = 'password']").send_keys("填密码")
    driver.find_element(by=by_xpath, value=("//button[@class = 'ant-btn ant-btn-primary sc-htpNat guSfSS']")).click()
    time.sleep(5)

    #获取cookies
    cookies = driver.get_cookies()
    for cookie in cookies:
        print("%s -> %s" %(cookie['name'],cookie['value']))

    #cookies做拼接
    cookies_list = [cookie["name"] + "=" + cookie["value"] for cookie in driver.get_cookies()]
    cookies = ';'.join(it for it in cookies_list)
    print(cookies)


    """新建文件夹"""

    createDir_url = '具体新建文件url'
    body = {
        "bucket": "common",
        "project_id": project_id,
        "path": "test-mkdir",
        "zone": zone
    }
    headers = {
        'Cookie': f'{cookies}',
        'X-Box-Fe-Token': Token
    }
    res = requests.post(createDir_url, headers=headers, json=body)
    resp = res.json()
    print(resp)
    assert (0,resp['code'])

     """删除文件夹"""
    deleteDir_url = '具体删除url'
    body = {
        "bucket": "common",
        "project_id": project_id,
        "path": "test-mkdir",
        "zone": zone
    }
    headers = {
        'Cookie': f'{cookies}',
        'X-Box-Fe-Token': Token
    }
    res = requests.delete(deleteDir_url, headers=headers, json=body)
    data = res.json()
    print(data)
    assert (0,data['code'])

    #关闭浏览器
    driver.quit()

if  __name__ == '__main__':
    pytest.main(['-vs', 'test_login.py', '--clean-alluredir', '--alluredir=allure-results'])
    os.system(r"allure generate -c -o allure-report")

三、python+requests库实现登录功能

1.封装公共方法

首先在common文件夹下封装公共方法,具体代码如下:

#!/usr/bin/env python
# _*_coding:utf-8_*_
import requests

from log.log_record import log_print


def post_main(url, data, header):
    """
     post请求
     :param url:
     :param data:
     :param header:
     :return:
    """
    try:
        res = requests.post(url=url, json=data, headers=header)
        return res.json()
    except Exception as e:
        log_print().error(f"接口请求错误,请求参数:{data},请求Url:{url},请求结果:{res.json()}")


def get_main(url, header):
    """
    get请求
    :param url:
    :param header:
    :param param:
    :return:
    """
    try:
        res = requests.get(url=url, headers=header)
        return res.json()
    except Exception as e:
        log_print().info(f"接口请求错误,请求Url:{url},请求结果:{res.json()}")


def run_main(method, url, header, data=None):
    """
    被调用主request
    :param method:
    :param url:
    :param header:
    :param data:
    :param file:
    :return:
    """
    try:
        res = None
        if method == 'post' or method == 'POST' or method == 'Post':
            res = post_main(url, data, header)
        elif method == 'get' or method == 'GET' or method == 'Get':
            res = get_main(url, header)
        else:
            log_print().error(f"请求方法:{method}格式错误")
        return res
    except Exception as e:
        log_print().error(f"请求方法报错{e}")


if __name__ == '__main__':
    pass

2.调用

创建test_login.py文件,调用requests库方法实现登录。具体代码如下:

import requests
 
url = 'https://example.com/login'
data = {
    'username': 'admin',
    'password': '123456',
}

response = requests.post(url, data=data)
print(response.content.decode("utf-8"))
headers = response.headers
print(headers.get('Set-Cookie'))

介绍了上述内容,你学废了吗?

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

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

相关文章

MT6761芯片参数规格_MTK联发科4G智能模块

联发科MT6761平台采用12nm制程内建主频达 2.0 GHz 的 4 核 ARM Cortex–A53 处理器,IMG PowerVR GE 等级图形处理器,以及高速的 LPDDR4x 低功耗存储或是成本效益较高的 LPDDR3 内存。 内置微型化超低功耗的传感器中枢组件,适用于支持如计步器…

Python进程池multiprocessing.Pool

环境: 鲲鹏920:192核心 内存:756G python:3.9 python单进程的耗时 在做单纯的cpu计算的场景,使用单进程核多进程的耗时做如下测试: 单进程情况下cpu的占用了如下,占用一半的核心数: 每一步…

微服务实战项目_天机学堂01_初识项目

文章目录 一.项目简述二.Jenkins三.模拟真实业务:紧急bug修复和代码阅读四.测试和部署五.代码阅读-获取登录用户 一.项目简述 Q:天机学堂是什么? A:天机学堂是一个基于微服务架构的生产级在线教育项目 主要有两个端(项目已上线,可以点击查看): 管理后台: https://tjxt-admi…

【控制篇 / 分流】(7.4) ❀ 02. 对不同运营商IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带用来上网,一条电信,一条联通,访问常用的某些网站速度时快时慢。领导要求,根据上网流量的目标运营商IP归属,将流量送到相应的运营商出口去,避免跨运营商上网。那么应该怎么做&#xf…

分销商城多端uniapp 可编译5端 - 等级提现额度

等级提现额度 等级提现额度是一种常见的财务管理策略,通常用于在线平台、金融服务或游戏中,用于控制不同等级用户的提现限额。这样的机制有助于平台管理资金流动性,防范欺诈,并鼓励用户提升他们的活跃度或忠诚度。以下是一个简单的…

HTML--JavaScript--语法基础

变量与常量 这个基本上没啥问题 变量命名规则: 变量由字母、数字、下划线、$组成,且变量第一个字符不能为数字 变量不能是系统关键字和保留字 语法: var 变量名 值;所有Javacript变量都由var声明 定义赋值字符串: …

大数据与人工智能赋能精益生产:掀起工业革命的浪潮!

随着科技的飞速发展,大数据和人工智能已经成为当今社会的热门话题。在这场科技革命中,大数据和人工智能如何赋能精益生产,引领工业革命的浪潮呢? 一、大数据:精益生产的智慧源泉 在精益生产中,大数据的应用…

力扣刷MySQL-第一弹(详细解析)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出…

【数据结构】常见八大排序算法总结

目录 前言 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1Hoare版本 6.2挖坑法 6.3前后指针法 6.4快速排序的递归实现 6.5快速排序的非递归实现 7.归并排序 8.计数排序(非比较排序) 9.补充:基数排序 10.总结…

LLaMa2 Chat gpt 大模型本地部署初体验

一直想在自己电脑或者测试环境随便找台服务器尝试部署一下“大模型”,但“大模型”对于内存和GPU的要求令人望而却步,层出不穷的各种术语也令人困惑,有点难以下手。 经过一段时间,在百度千帆大模型平台、讯飞星火大模型平台、魔搭…

k8s源码阅读:Informer源码解析

写在之前 Kubernetes的Informer机制是一种用于监控资源对象变化的机制。它提供了一种简化开发者编写控制器的方式,允许控制器能够及时感知并响应 Kubernetes 集群中资源对象的变化。Informer通过与Kubernetes API服务器进行交互,通过监听API服务器上资源…

【sqlserver】已成功与服务器建立链接,但是在登录过程中发生错误。(provider:TCP提供程序,error:0 - 指定的网络名不再可用。)

问题现象: 处理方式: 配置管理器,mssqlserver的协议 Named Pipes 启用,重新sqlserver服务试一下,我是自己摸索这样解决的,不行的话,可以看下下面链接建议 error:0 - 指定的网络名不可用

网络安全中的“三高一弱”和“两高一弱”是什么?

大家在一些网络安全检查中,可能经常会遇到“三高一弱”这个说法。那么,三高一弱指的是什么呢? 三高:高危漏洞、高危端口、高风险外连 一弱:弱口令 一共是4个网络安全风险,其中的“高危漏洞、高危端口、弱…

[New Tech] Compute Express Link 101

SDC2020: CXL 1.1 Protocol Extensions: Review of the cache and memory protocols in CXL

【Java】十年老司机转开发语言,新小白从学习路线图开始

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

OpenCV-Python(43):姿势估计

目标 学习了解calib3D 模块学习在图像中创建3D效果 calib3D模块 OpenCV-Python的calib3D模块是OpenCV库中的一个重要模块,用于摄像头标定和三维重建等计算机视觉任务。该模块提供了一些函数和类,用于摄像头标定、立体视觉和三维重建等方面的操作。 下…

利用Lambda表达式实现vector中pair/结构体的排序

众所周知&#xff0c;对于vector<pair<int, int> >若直接使用sort排序&#xff0c;会默认按照pair的第一个关键字从小到大进行排序&#xff1a; #include <bits/stdc.h>using namespace std;int main() {vector<pair<int, int> > p;p.push_back…

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的微…

编写RedisUtil来操作Redis

目录 ​编辑 Redis中文网 第一步&#xff1a;建springboot项目 第二步&#xff1a;导依赖 第三步&#xff1a;启动类 第四步&#xff1a;yml 第五步&#xff1a;Redis配置类 第六步&#xff1a;测试类 第七步&#xff1a;编写工具类 RedisUtil 第八步&#xff1a;编写…

C++核心编程——文件操作

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…