在软件开发过程中,登录功能是一个非常重要且常见的功能。为了确保登录功能的稳定性和正确性,我们可以利用UI自动化测试来自动验证登录流程。本文将介绍如何编写一个登录功能的UI自动化测试脚本,并通过使用Selenium和pytest库实现自动化测试。
技术栈
- Python编程语言
- Selenium库
- pytest测试框架
准备工作
在编写自动化测试脚本之前,我们需要进行一些准备工作。以下是准备工作的步骤:
- 安装Python:访问Python官方网站(https://www.python.org/),下载并安装最新版本的Python解释器。
- 安装依赖库:使用pip命令安装Selenium和pytest库。
Copy code
pip install selenium pytest
- 下载浏览器驱动程序:根据你使用的浏览器类型,下载相应的浏览器驱动程序,并将其添加到系统的环境变量中。
自动化项目录
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:错误截图存放地址
这是我项目目录
编写测试脚本
这里自动胡脚本使用PO设计思想:
即:
- 以web页面为对象,页面里面的操作为方法
- 页面属性+页面行为组成page_object
分析页面
以“柠檬班”商城为例
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:表示输入详细的测试结果信息
"""