01. 实现登录功能的UI自动化测试脚本

2023-11-12

在软件开发过程中,登录功能是一个非常重要且常见的功能。为了确保登录功能的稳定性和正确性,我们可以利用UI自动化测试来自动验证登录流程。本文将介绍如何编写一个登录功能的UI自动化测试脚本,并通过使用Selenium和pytest库实现自动化测试。

技术栈

  • Python编程语言
  • Selenium库
  • pytest测试框架

准备工作

在编写自动化测试脚本之前,我们需要进行一些准备工作。以下是准备工作的步骤:

  1. 安装Python:访问Python官方网站(https://www.python.org/),下载并安装最新版本的Python解释器。
  2. 安装依赖库:使用pip命令安装Selenium和pytest库。
Copy code
pip install selenium pytest
  1. 下载浏览器驱动程序:根据你使用的浏览器类型,下载相应的浏览器驱动程序,并将其添加到系统的环境变量中。

自动化项目录

ui_project/
  |-- tests/
  |     |-- test_module1.py
  |     |-- test_module2.py
  |     |-- ...
  |
  |-- pages/
  |     |-- page_module1.py
  |     |-- page_module2.py
  |     |-- ...
  |
  |-- utils/
  |     |-- utility_module1.py
  |     |-- utility_module2.py
  |     |-- ...
  |
  |-- data/
  |     |-- test_data1.json
  |     |-- test_data2.csv
  |     |-- ...
  |
  |-- reports/
  |     |-- report1.html
  |     |-- report2.html
  |     |-- ...
  |
  |-- config/
  |     |-- config.py
  |
	|-- error_images
	|     |--1.png
      	|--2.png
  |-- conftest.py
  |-- requirements.txt

简要说明:

  • tests/: 这个目录用于存放测试代码,每个测试模块(或测试套件)对应一个测试文件。
  • pages/: 这个目录包含了页面对象模式(Page Object Pattern)的实现,每个页面对象对应一个模块文件,用于封装页面的元素定位和操作。
  • utils/: 这个目录用于存放测试过程中使用的实用工具、辅助函数或自定义的测试工具库。
  • data/: 这个目录包含测试所需的数据文件,如测试数据、配置文件等。
  • reports/: 这个目录用于存放测试报告,可以是HTML报告、JUnit XML报告或其他格式的报告文件。
  • config/: 这个目录包含测试配置文件,如URL、数据库连接信息、日志级别等。
  • conftest.py 文件在测试运行过程中会被自动识别并加载,因此可以在其中定义多个 fixture,这些 fixture 可以被测试用例或其他文件引用和共享。通过定义 fixture,可以实现一些常见的测试准备和清理操作,例如创建和销毁测试环境、初始化和清理测试数据等。
  • requirements.txt: 这个文件列出了项目所依赖的外部库和版本号,用于创建和管理虚拟环境。
  • error_images:错误截图存放地址

这是我项目目录
image.png

编写测试脚本

这里自动胡脚本使用PO设计思想:
即:

  1. 以web页面为对象,页面里面的操作为方法
  2. 页面属性+页面行为组成page_object
分析页面

以“柠檬班”商城为例
image.png

1. 用户名输入框
find_element_by_xpath('//input[@placeholder="用户名"]')
2. 密码输入框
find_element_by_xpath('//input[@placeholder="密码"]')
3. 验证码输入框
find_element_by_xpath('//input[@placeholder="验证码"]')
4.登录按钮
find_element_by_xpath('//input[@value="登录"]')
编写登录页面
import time

from selenium import webdriver


class LoginPage():
    def __init__(self,driver):
        self.driver=driver

    def manage_login(self, username, password):
        # 1. 用户名输入框
        self.driver.find_element_by_xpath('//input[@placeholder="用户名"]').send_keys(username)
        # 2. 密码输入框
        self.driver.find_element_by_xpath('//input[@placeholder="密码"]').send_keys(password)
        # 3. 验证码输入框
        code = self.driver.find_element_by_xpath('//input[@placeholder="验证码"]')
        code.send_keys('lemon')
        # 4. 登录按钮
        login_btn = self.driver.find_element_by_xpath('//input[@value="登录"]')
        login_btn.click()
        self.driver.implicitly_wait(5)
        user = self.driver.find_element_by_xpath('//div[@class="el-dropdown"]/span[text()="student"]')
        assert user.text == username
        print(user.text)


if __name__ == '__main__':
    dr = webdriver.Chrome()#创建了一个 Chrome WebDriver 实例,用于控制 Chrome 浏览器。
    dr.get("http://mall.lemonban.com/admin/#/login")#打开了指定的网页
    cl = LoginPage(dr)#创建了一个 LoginPage 的实例,将之前创建的 WebDriver 实例传递给它。
    cl.manage_login("student",'123456a')
    time.sleep(3)
    dr.quit()#关闭了 WebDriver 实例,即关闭 Chrome 浏览器。

通过上述代码,我们就可以实现UI登录了

编写测试用例
import pytest
from selenium import webdriver

from page.manage.page3_add_product import LoginPage
class TestManageLogin:
    @pytest.mark.usefixtures('setup_tear_down')
    def test_manage_login(self,setup_tear_down):
        driver=setup_tear_down
        cl=LoginPage(driver)
        cl.manage_login(username='student',password='123456a')

定义了一个测试类 TestManageLogin,并在其中定义了一个测试方法 test_manage_login。该方法使用 @pytest.mark.usefixtures 装饰器指定了前面定义的 setup_tear_down fixture。
在测试方法中,首先通过参数 setup_tear_down 获取了 WebDriver 实例,并将其传递给 LoginPage 的构造函数来创建一个 LoginPage 对象。然后调用 manage_login 方法,传递了用户名 “student” 和密码 “123456a”,执行登录操作。

使用conftest.py文件来存放fixture前后置条件
定义了一个 fixture,用于创建和关闭 WebDriver 实例,而 test1_manage_login.py 文件包含了测试类和测试方法,通过使用 fixture 获取 WebDriver

@pytest.fixture(scope='class')
def setup_tear_down():
    driver = webdriver.Chrome()
    driver.get('http://mall.lemonban.com/admin/#/login')
    yield driver
    driver.quit()
执行测试用例
import pytest

if __name__ == '__main__':
    pytest.main(["-sv", "tests/test1_manage_login.py"]
)

"""
-s:表示输入出所有的print语句
-v:表示输入详细的测试结果信息

"""
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

01. 实现登录功能的UI自动化测试脚本 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 【Linux_】环境变量

    Linux 环境变量 心有所向 日复一日 必有精进 专栏 Linux 作者 沂沐沐 目录 Linux 环境变量 什么是环境变量 常见变量 查看环境变量方法 环境变量相关的命令 通过系统调用获取或设置环境变量 环境变量通常是具有全局属性的 导
  • Javascript设计模式-17-装饰者模式

    Javascript 设计模式 17 装饰者模式 简介 装饰者模式可以动态的给某个对象添加一些额外的职责 而不会影响从这个类中派生出的其他对象 优势 传统的面向对象语言中 给对象添加功能常常使用继承的方式 但是继承的方式并不灵活 还会带来许
  • C语言 操作符详解 上

    C语言中操作符介绍 表达式求值 操作符分类 1 算数操作符 2 移位操作符 lt lt gt gt 3 位操作符 4 赋值操作符 5 单目操作符 sizeof 6 关系操作符 gt lt gt lt 7 逻辑操作符 8 条件操作符 9 逗号
  • Swagger与Knife4j学习笔记

    Swagger 介绍 在前后端分离开发的过程中 前端和后端需要进行 API 对接进行交互 就需要一个 API 规范文档 方便前后端的交互 但 API 文档不能根据代码的变化发生实时动态的改变 这样后端修改了接口 前端不能及时获取最新的接口
  • 百度搜索自动补全(百度搜索常见api)

    一 百度搜索常用api 百度搜索常用api 一 搜索关键字自动补全 一 数据源 https sp0 baidu com 5a1Fazu8AA54nxGko9WTAnF6hhy su wd 关键词 json 1 二 代码 可以使用前端插件 B
  • DDT数据驱动+yaml/csv(自动化测试,接口测试)

    目录 1 ddt读取yaml文件 2 ddt读取csv文件 3 ddt式测试报告怎么填用例描述 背景 对于输入框来言 使用等价类边界值 场景法等进行数据输入 接口相同 输入的内容都非常相似 却有不同的响应结果 如果我们对于每次输入都编写一条
  • Linux中的$0、$1、$@、$?、$*等特殊变量介绍

    特殊变量 是传给脚本的参数个数 0 是脚本本身的名字 1 是传递给该shell脚本的第一个参数 2 是传递给该shell脚本的第二个参数 是传给脚本的所有参数的列表 是以一个单字符串显示所有向脚本传递的参数 与位置变量不同 参数可超过9个
  • Invalid prop: type check failed for prop “data“. Expected Array, got Object[已解决]

    Vue warn Invalid prop type check failed for prop data Expected Array got Object 要处理这个bug就必须先明白这个bug到底是什么类型是怎么一回事 那字面意思就是
  • Mirai环境搭建

    20200805 引言 关于Mirai的环境搭建 我记得能搜到很多结果 不过我当时并没有想要启动mirai的所有功能 毕竟其实他的代码也有缺陷 现在想扫出来结果也有点难了 后面可能还是需要这些功能来辅助扫描结果 其他功能还是要开启 这里先记
  • C语言基础_文件操作-1

    目录 写在前面 学习目标 学习总结 正文 1 文件打开 关闭 2 getc putc 3 fprintf fscanf gets不安全 用fgets 4 fgets gputs 5 文件光标操作 a fseek ftell long范围内操
  • C++语言分号的使用

    C 语言中 表达式的一部分能够组成独立的语句 所以必须加分号分割 c a b 成立 c a b 也成立 if 1 1 do something 成立 if 1 1 do something 也成立 class foo bar 成立 含义为独
  • c++能不能给类的成员变量在声明的时候初始化?

    能 可能早先的版本不能 但是c 11标准下能 有人说在声明的时候初始化相当于在构造函数中初始化 其实不是的 成员变量初始化的顺序为 先进行声明时初始化 然后进行初始化列表初始化 最后进行构造函数初始化 如下代码 另外初始化列表中初始化的顺序
  • STM32启动BOOT0 BOOT1设置方法

    转载自 https www jianshu com p 38c4a90bac19 不同的下载方式对应STM32启动方式也不同 如下图是STM32三种启动方式 第一种启动方式是最常用的用户FLASH启动 正常工作就在这种模式下 STM32的F
  • webpack4 sideEffects实战轻松搞懂

    sideEffects 译作副作用 函数副作用是指函数在正常工作任务之外对外部环境所施加的影响 具体地说 函数副作用是指函数被调用 完成了函数既定的计算任务 但同时因为访问了外部数据 尤其是因为对外部数据进行了写操作 从而一定程度地改变了系
  • Vue的过渡

    目录 单元素过渡 1 css过渡 2 过渡的类名介绍 3 CSS动画 4 自定义过渡的类名 5 元素过渡使用JavaScript钩子函数 多元素过渡 1 基础用法 2 key属性 3 过渡模式 多组件过渡 列表过渡 单元素过渡 1 css过
  • Android Zebra斑马打印机 打印面单不清楚 解决方法

    刚开始的效果 字体模糊 分析原因 1 打印机的打印浓度太低 2 文本字体不对 3 bitmap的问题 因为这个面单是通过view 获取到bitmap再喂给打印机打印的 下载打印机的驱动 设置打印机打印浓度 没有效果 调整字体类型没有效果 分
  • Java 加解密技术系列之 SHA

    序 上一篇文章中介绍了基本的单向加密算法 MD5 也大致的说了说它实现的原理 这篇文章继续之前提到的单向加密 主要讲的是 SHA 同 MD5 一样 SHA 同样也是一个系列 它包括 SHA 1 SHA 224 SHA 256 SHA 384
  • 服务器怎么开虚拟用户,Linux文件服务器实战详解(虚拟用户)

    vsftpd基于系统用户访问ftp服务器 系统用户越多越不利于管理 不利于系统安全 这样就以vsftp虚拟防护的方式来解决 虚拟用户没有实际的真实系统用户 而是通过映射到其中一个真实用户以及设置相应权限来访问验证 虚拟用户不能登陆系统 1
  • android项目迁移到androidX:类映射(android.support.design*)

    支持库类 AndroidX 类 android support design animation AnimationUtils com google android material animation AnimationUtils and
  • 01. 实现登录功能的UI自动化测试脚本

    在软件开发过程中 登录功能是一个非常重要且常见的功能 为了确保登录功能的稳定性和正确性 我们可以利用UI自动化测试来自动验证登录流程 本文将介绍如何编写一个登录功能的UI自动化测试脚本 并通过使用Selenium和pytest库实现自动化测