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

目录

前言

一、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'))

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

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

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

相关文章

软件测试|selenium 元素无法选择异常的原因及解决

简介 在进行 Web 自动化测试时,使用 Selenium 可能会遇到各种异常情况。其中之一就是 ElementNotSelectableException 异常,该异常通常意味着在尝试选择一个不可选元素时出现了问题。本文将详细介绍这个异常的原因、可能的解决方法,并提供示…

十四.变量、异常处理

变量、异常处理 1.变量1.1系统变量1.1.1系统变量分类1.1.2查看系统变量 1.2用户变量1.2.1用户变量分类1.2.2会话用户变量1.2.3局部变量1.2.4对比会话用户变量与局部变量 补充:MySQL 8.0的新特性—全局变量的持久化 2.定义条件与处理程序2.1案例分析2.2定义条件2.3定义处理程序2…

vector扩容机制

在学习了vector的时候,总说linux下是以二倍扩容的,VS是以1.5倍扩容的。 但是想一想为什么扩容是这样的呢,为什么不能是3倍或者其他倍数呢? 所以带着这些疑问,接着往下看。 首先,我们要知道vector的扩容机…

SpringBoot新手入门完整教程和项目示例

文章目录 SpringBoot新手入门完整教程和项目示例1、SpringBoot简介2、Spring Boot的核心功能?(优点)3、SpringBoot与SpringMVC 的区别?4、构建SpringBoot项目4.1、在官网自动生成下载spring boot项目4.2、手动使用maven创建Spring…

中国社科院与新加坡社科大联合培养博士——单证还是双证?

有关博士学位,我想不用多说相信很多人都清楚,博士是我国学位等级中目前为止的最高学位,拥有了博士学位就相当于拥有了最高荣誉,但是,我国教育形式另开设了学历教育,对于学历教育的形式,在职博士…

软件测试|如何使用selenium处理下拉框?

简介 下拉框是网页表单中常见的元素之一,通常用于选择不同的选项。对于我们的自动化测试工作来说,操作下拉框是我们经常需要处理的元素,selenium作为我们最常使用的web自动化测试框架,也是支持我们对下拉框进行操作的。本文我们就…

SpringBoot介绍

1.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其中“Boot”的意思就是“引导”,Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速开发 Spring应用的方式。 1.1.Spring Boot 特点 • 嵌入的 Tomcat&#xff…

案例128:基于微信小程序的在线视频教育系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

2024年【北京市安全员-C3证】复审考试及北京市安全员-C3证证考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-C3证复审考试考前必练!安全生产模拟考试一点通每个月更新北京市安全员-C3证证考试题目及答案!多做几遍,其实通过北京市安全员-C3证模拟考试题很简单。 1、【多选题】《…

视频剪辑实例:探索画中画视频剪辑,创意无限可能,批量制作视频

随着社交媒体和视频平台的迅速发展,视频剪辑,作为视频创作的核心环节,对于呈现内容、传达情感和提升体验具有至关重要的作用。现在来看云炫AI智剪的视频剪辑实例,如何批量制作视频,提升工作效率。 画中画视频合并成功…

yolov8n 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 因为之前写了几篇yolov8模型部署的博文,存在两个问题&…

openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题

文章目录 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题198.1 分析查询效率异常降低的问题198.1.1 问题现象198.1.2 处理办法 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题 198.1 分…

【计算机网络】--集线器,路由器,交换机对比

🎵1.集线器 🌈1.1集线器概念 集线器是一种网络设备,广泛应用于计算机局域网环境中。它通常具有多个以太网接口,用于将多个计算机或其他网络设备连接在一起,形成一个网络拓扑结构。 🌈2.集线器的作用 集线器…

市场复盘总结 20240115

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 昨日主题投资 连板进级率 0% 失效 二进三: 进级率 中位数50% 最常用的二种方法: 方…

网络编程day2

TCP的基本通信 服务器端 #include <head.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.125.193" //服务器客户端int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket(AF_INET, …

一篇文章搞懂Jenkins持续集成解决的是什么问题

01 持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

@Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求&#xff0c;需要开发一个注解&#xff0c;放在controller层的类或者方法上&#xff0c;用以校验请求参数中(不管是url还是body体内&#xff0c;都要检查&#xff0c;有token参数&#xff0c;且符合校验规则就放行)是否传了一个token的参数&am…

从零学Java 线程池

Java 线程池 文章目录 Java 线程池1 线程池概念1.1 现有问题1.2 线程池 2 线程池原理3 如何使用线程池3.1 获取线程池 4 创建线程的第四种方式 1 线程池概念 1.1 现有问题 线程是宝贵的内存资源、单个线程约占1MB空间&#xff0c;过多分配易造成内存溢出。频繁的创建及销毁线…