本篇主要应用Django搭建学生管理平台,使用Python + Selenium 模拟用户注册登录场景简单实例。Django实战部分往后可能和大家见面,目前还在学习,对于一些异常处理和业务模型还在摸索。
Django学生管理平台仓库地址:
https://github.com/A-HUAN/Django-courseSelectionSystem
实际项目中用python脚本简单实现UI测试的步骤:
1.被测环境测试数据预清理 -> 2.访问网页-> 3.定位元素 -> 4.模拟人工操作 -> 5.对比数据是否与预期一致 -> 6.测试数据清理
一.分析
打开学生管理平台,浏览登录&注册页面查看其源代码,定位想要的元素 —— 导航栏,输入框,按钮。
然后我们通过定位的元素对于人工操作流程进行还原,模拟学生注册场景。
二.实现from selenium import webdriver
import time
import pymysql
1.被测环境测试数据预清理&测试后数据清理
首先,因为UI脚本一般都是定期执行的,以注册情景来说,重复测试数据会影响测试的结果,所以就需要先对测试环境的测试数据进行清理 。def dbClear(username):
# --- 环境清理 ---#
# 打开数据库连接
db = pymysql.connect("127.0.0.1","courseSelectionSystem","123456789","courseSelectionSystem")
# 创建游标对象
cursor = db.cursor()
# SQL
sql_1 = "select * from sjjh_channel.system_user WHERE name = %s"
sql_2 = "select * from sjjh_channel.system_student WHERE studentName = %s"
sql_3 = "delete from sjjh_channel.system_student WHERE studentName = %s"
sql_4 = "delete from sjjh_channel.system_user WHERE name = %s"
try:
# 执行SQL语句
cursor.execute(sql_2,username)
data2 = cursor.fetchone()
if data2 == None:
print('学生表测试数据为空', data2)
else:
print('学生表测试数据存在', data2)
cursor.execute(sql_3,username) # 执行删除SQL语句
# 执行SQL语句
cursor.execute(sql_1,username)
# 获取单条查询数据
data = cursor.fetchone()
if data == None:
print('用户表测试数据为空',data)
else:
print('用户表测试数据存在',data)
cursor.execute(sql_4,username) # 执行删除SQL语句
# 提交事务
db.commit()
print('测试数据清理成功')
except:
# 发生错误回滚
db.rollback()
print("测试数据清理失败")
db.close()
2.访问网页定位元素,模拟人工操作,对比生成数据是否与预期一致。
接下来开始设计流程模拟用户注册&登录场景def workFlow(url_1,username,password,real_name,user_id):
# 设置浏览器的驱动
driver = webdriver.Chrome()
# 打开URL
driver.get(url_1)
# 点击注册
driver.find_element_by_xpath('//*[@id="my-nav"]/ul[2]/li[2]/a').click()
# --- 重置注册场景 ---#
# 填写信息
driver.find_element_by_id('id_username').send_keys('111111')
driver.find_element_by_id('id_password1').send_keys('111111')
driver.find_element_by_id('id_password2').send_keys('111111')
driver.find_element_by_id('id_real_name').send_keys('111111')
driver.find_element_by_id('id_id').send_keys('111111')
time.sleep(1)
# 先定位到下拉框
temp = driver.find_element_by_id('id_kind')
# 再点击下拉框下的选项
temp.find_element_by_xpath('//*[@id="id_kind"]/option[2]').click()
time.sleep(2)
# 点击重置
driver.find_element_by_xpath('/html/body/div/div/form/button[1]').click()
# --- 正常注册场景 ---#
# 二次填写信息
driver.find_element_by_id('id_username').send_keys(username)
driver.find_element_by_id('id_password1').send_keys(password)
driver.find_element_by_id('id_password2').send_keys(password)
driver.find_element_by_id('id_real_name').send_keys(real_name)
driver.find_element_by_id('id_id').send_keys(user_id)
time.sleep(1)
# 先定位到下拉框
temp = driver.find_element_by_id('id_kind')
# 再点击下拉框下的选项
temp.find_element_by_xpath('//*[@id="id_kind"]/option[2]').click()
time.sleep(2)
# 点击提交按钮
driver.find_element_by_xpath('/html/body/div/div/form/button[2]').click()
# 点击登录导航
driver.find_element_by_xpath('//*[@id="my-nav"]/ul[2]/li[1]/a').click()
# --- 错误密码场景 ---#
# 输入账户名/密码
driver.find_element_by_id("id_username").send_keys(username)
driver.find_element_by_id("id_password").send_keys('123')
time.sleep(2)
# 点击登录按钮
driver.find_element_by_xpath('/html/body/div/div/form/button[2]').click()
time.sleep(2)
driver.get_screenshot_as_file("E:\\Python Study\\1.png") #截图
err_1 = driver.find_element_by_xpath("/html/body/div/div/form/div[1]").text
print('获取错误提示文本信息',err_1) #打印信息
time.sleep(1)
driver.find_element_by_id("id_username").clear()
driver.find_element_by_id("id_password").clear()
# --- 错误用户场景 ---#
# 输入账户名/密码
driver.find_element_by_id("id_username").send_keys('abc')
driver.find_element_by_id("id_password").send_keys(password)
time.sleep(2)
# 点击登录按钮
driver.find_element_by_xpath('/html/body/div/div/form/button[2]').click()
time.sleep(2)
driver.get_screenshot_as_file("E:\\Python Study\\2.png") #截图
err_2 = driver.find_element_by_xpath("/html/body/div/div/form/div[1]").text
print('获取错误提示文本信息',err_2) #打印信息
time.sleep(1)
driver.find_element_by_id("id_username").clear()
driver.find_element_by_id("id_password").clear()
# --- 正确登录场景 ---#
# 输入账户名/密码
driver.find_element_by_id("id_username").send_keys(username)
driver.find_element_by_id("id_password").send_keys(password)
time.sleep(2)
# 点击登录按钮
driver.find_element_by_xpath('/html/body/div/div/form/button[2]').click()
time.sleep(2)
driver.get_screenshot_as_file("E:\\Python Study\\3.png") #截图
# --- 账号登出场景 ---#
cookie = driver.get_cookies()
print('登录状态获取sessionid',cookie)
driver.find_element_by_xpath('//*[@id="my-nav"]/ul[2]/li[2]/a').click()
time.sleep(1)
driver.refresh()
cookie_2 = driver.get_cookies()
print('登出状态获取sessioid',cookie_2)
driver.get_screenshot_as_file("E:\\Python Study\\4.png") #截图
driver.quit()
3.执行if __name__ == '__main__':
username = 'Alon'
password = '123456'
real_name = 'Alon'
user_id = '0001'
url_1 = "http://127.0.0.1:8000/index/"
dbClear(username)
workFlow(url_1,username,password,real_name,user_id)
dbClear(username)
4.日志输出C:\Python37\python.exe "E:/Python Study/20190909.py"
学生表测试数据为空 None
用户表测试数据为空 None
测试数据清理成功
获取错误提示文本信息 密码不正确!
获取错误提示文本信息 用户不存在!
登录状态获取sessionid [{'domain': '127.0.0.1', 'expiry': 1599450092.979737, 'httpOnly': False, 'name': 'csrftoken', 'path': '/', 'secure': False, 'value': 'Vb29UxKCEVaMhPSkps7gGzVGVcgopIUW7u51v95ZnYeIYAUEiOqlH4sKEZ96jNQ6'}, {'domain': '127.0.0.1', 'expiry': 1569210100.862583, 'httpOnly': True, 'name': 'sessionid', 'path': '/', 'secure': False, 'value': '7uhp2y6wpx3vq1s778uvdclapkptr29w'}]
登出状态获取sessioid [{'domain': '127.0.0.1', 'expiry': 1599450092.979737, 'httpOnly': False, 'name': 'csrftoken', 'path': '/', 'secure': False, 'value': 'Vb29UxKCEVaMhPSkps7gGzVGVcgopIUW7u51v95ZnYeIYAUEiOqlH4sKEZ96jNQ6'}]
学生表测试数据存在 (16, '0001', 'Alon', None, None)
用户表测试数据存在 (16, 'Alon', '123456', 'student', datetime.datetime(2019, 9, 9, 11, 41, 21, 337193))
测试数据清理成功
5.场景截图