
🔥个人主页:K 旺仔小馒头
🍉学习方向:C/C++方向学习者
📖个人专栏:《C语言》《数据结构与算法》《C++知识分享》《C语言实战编程》《算法题从优选到贪心的解题技巧》《测试报告》
⭐️人生格言:"何时葡萄先熟透,你要静候再静候"

目录
[一. 项目背景](#一. 项目背景)
[二. 项目简介](#二. 项目简介)
[三. 测试环境](#三. 测试环境)
[四. 测试用例](#四. 测试用例)
[五. 手动测试](#五. 手动测试)
[5.1 注册页面](#5.1 注册页面)
[5.2 登录页面](#5.2 登录页面)
[5.3 商城首页](#5.3 商城首页)
[5.4 商品详情页](#5.4 商品详情页)
[5.5 商品分类](#5.5 商品分类)
[5.6 个人中心页](#5.6 个人中心页)
[5.7 购物车](#5.7 购物车)
[5.8 安全设置](#5.8 安全设置)
[5.9 订单确认](#5.9 订单确认)
[六. 兼容性测试](#六. 兼容性测试)
[七. 自动化测试](#七. 自动化测试)
[7.1 创建公共模块 -- Utils.py](#7.1 创建公共模块 -- Utils.py)
[7.2 注册模块 - MallRegister.py](#7.2 注册模块 - MallRegister.py)
[7.3 登录模块 - MallLogin.py](#7.3 登录模块 - MallLogin.py)
[7.4 商城首页模块 - MallList.py](#7.4 商城首页模块 - MallList.py)
[7.5 商品详情模块 - MallDetail.py](#7.5 商品详情模块 - MallDetail.py)
[7.6 商品分类模块 - MallCategory.py](#7.6 商品分类模块 - MallCategory.py)
[7.7 个人中心模块 - MallAccount.py](#7.7 个人中心模块 - MallAccount.py)
[7.8 购物车模块 - MallCart.py](#7.8 购物车模块 - MallCart.py)
[7.9 订单确认模块 - MallOrderReview.py](#7.9 订单确认模块 - MallOrderReview.py)
[7.10 整体运行 - RunTest.py](#7.10 整体运行 - RunTest.py)
[八. 项目测试bug描述](#八. 项目测试bug描述)
[8.1 登录注册页面](#8.1 登录注册页面)
[8.2 商城首页页面](#8.2 商城首页页面)
[8.3 商品详情页面](#8.3 商品详情页面)
[8.4 商品分类页面](#8.4 商品分类页面)
[8.5 安全设置页面](#8.5 安全设置页面)
[8.6 购物车页面](#8.6 购物车页面)
[8.7 订单确认页面](#8.7 订单确认页面)
[九. 测试结论](#九. 测试结论)
前言:
本次测试旨在验证商城系统用户端的功能完整性,重点覆盖用户登录注册、商城首页展示、商品分类浏览、商品详情查看、购物车管理、订单确认,以及个人中心和安全设置等核心业务模块。通过系统性自动化测试识别潜在缺陷,本报告将记录测试详情与评估结果,为系统优化及正式上线使用提供专业的数据支撑。
一. 项目背景
本商城系统核心用于电商业务的商品展示与在线交易管理。依托登录注册模块保障用户数据安全;通过商品分类与详情页实现商品的高效检索与展示;借助购物车与订单确认模块完成下单流程;再经由个人中心与安全设置模块实现地址与账户的统一管理。该系统解决了传统购物信息不对称、流程繁琐及数据难追溯的问题,提升了用户购物体验,方便平台进行长期的业务沉淀与运营管理。
二. 项目简介
该商城系统主要实现了用户登录注册、商城首页展示、商品分类浏览、商品详情查看、购物车管理、订单确认与提交、个人中心及地址管理等核心功能。
1. 登录与注册功能
系统支持用户注册新账号,并使用预先注册好的账号和密码进行登录。输入正确的用户名和密码,登录成功后跳转到商城首页。同时支持退出登录,保障用户账户安全。
2. 商城首页
登录后进入商城首页,页面展示商品分类导航栏(如运动健康、汽车用品等)、全局搜索框,以及各品类商品的聚合列表。页面右上角有商城首页、个人中心、我的商城、我的收藏、购物车(显示数量)、消息等快捷入口,方便用户快速跳转。
3. 商品分类与详情页
用户可以通过首页的分类导航进入"商品分类页",按品类筛选商品。点击具体商品后,进入"商品详情页",可查看商品的完整图片、详细规格参数、价格及库存等信息,并支持加入购物车或直接收藏。
4. 购物车管理功能
在登录状态下,用户可进入购物车页面,查看已加入的商品列表。支持修改购买数量、删除商品,并点击"去结算"进入订单确认流程。
5. 订单确认与提交功能
在购物车点击"去结算"后,进入订单确认页。用户可以在此页面选择配送方式(如快递、同城、自提),确认收货地址,选择合适的支付方式,完成订单的最终提交。
6. 个人中心与地址管理功能
在登录状态下,用户可进入"个人中心"页面,查看和管理个人资料。通过"我的地址"模块,用户可以新增、编辑、删除收货地址,并可以设置默认地址,确保订单配送信息的准确性。此外,还包含安全设置等基础账户维护功能。
三. 测试环境
1. 硬件环境
- 设备类型: 本地 PC 机
2. 软件环境
-
**操作系统:**Windows 11
-
浏览器类型及版本: Google Chrome 153.0.8010.37(正式版本) (64 位)
3. 测试工具
- Chrome + F12:手工功能测试
- Selenium:UI自动化回归测试
- XMind / Excel:测试用例设计与思路梳理
四. 测试用例
功能测试:
登录注册模块:

商城首页:
商品详情页:
商品分类页:

个人中心页:

购物车:

安全设置:

订单确认:

兼容性测试:

易用性测试:

安全测试:

性能测试:

界面测试:

网络测试:

五. 手动测试
5.1 注册页面

- 输入正确的用户名和密码:

进入首页:

- 若输入错误的用户名和正确的密码:

- 若输入正确的用户名和错误的密码:

- 若输入错误的用户名和错误的密码:

- 若输入用户名和密码为空:

- 若输入用户名已注册:

5.2 登录页面

- 输入正确的账号和密码:

进入首页:

- 若输入错误的账号和正确的密码:

- 若输入正确的账号和错误的密码:

- 若输入错误的账号和错误的密码:

- 若输入账号和密码为空:

- 若输入账号未注册:

5.3 商城首页
1)在未登录状态下:
①点击"个人中心",弹出登录弹窗

②点击"我的商城 --> 我的订单",弹出登录弹窗

③点击"我的收藏 --> 商品收藏",弹出登录弹窗

④点击"更多入口 --> 订单",跳转到登录页面

⑤点击"购物车",弹出登录弹窗

⑥点击"消息",弹出登录弹窗

2)在登录状态下:
①点击"个人中心",跳转到"个人中心页面"

②点击"我的商城 --> 我的订单",跳转到"我的订单页面"

③点击"我的收藏 --> 商品收藏",跳转到"商品收藏页面"

④点击"更多入口 --> 订单",跳转到"我的订单页面"

⑤点击"购物车",跳转到"购物车页面"

⑥点击"消息",跳转到"我的消息页面"

5.4 商品详情页
1)在未登录状态下:
①点击"立即购买",弹出登录弹窗

②点击"加入购物车",弹出登录弹窗


③点击"收藏",弹出登录弹窗

④点击"详情",显示商品的详情信息

⑤点击"评价",显示商品的评价信息

2)在登录状态下:
①点击"立即购买",跳转到"订单确认页面"


②点击"加入购物车",弹出"商品已成功加入购物车!"

③点击"收藏",弹出"收藏成功"

④点击"详情",显示商品的详情信息

⑤点击"评价",显示商品的评价信息

5.5 商品分类
1)在未登录状态下:
①点击"加入购物车",弹出登录弹窗


2)在登录状态下:
①点击"数码办公",点击"全部" --> 展示该类型所有商品

②点击"数码办公",点击"手机通讯" --> 筛选出相应的商品

③点击"数码办公",点击"电脑整机" --> 筛选出相应的商品

④点击"时尚服饰",点击"全部" --> 展示该类型所有商品

⑤点击"时尚服饰",点击"女装" --> 筛选出相应的商品

⑥点击"时尚服饰",点击"男装" --> 筛选出相应的商品

⑦点击"名品潮包",点击"全部" --> 展示该类型所有商品

⑧点击"名品潮包",点击"潮流女包" --> 筛选出相应的商品

⑩点击"加入购物车",弹出"加入成功"
测试场景1:

测试场景2:

⑪查看商品详情信息(点击任意一个商品 --> 跳转到商品详情页)


⑫分页
设置每页条数 --> 页面展示的商品数量更新

跳转到的页数 --> 展示该页的商品

点击"<<"按钮 --> 跳转到该页,展示页面数据


点击">>"按钮 --> 跳转到该页,展示页面数据


5.6 个人中心页
1)在未登录状态下:
①点击"个人中心",弹出登录弹窗


2)在登录状态下:
①点击"个人中心",跳转到"个人中心页面"

②点击"修改头像" --> 点击选择图片,并选择上传一张照片 --> 点击确认上传 --> 弹出上传成功


③点击"修改资料" --> 点击编辑按钮,填入信息 --> 点击保存--> 弹出修改成功并返回个人资料



④点击"我的地址" --> 新增地址 --> 点击新增,按要求填写资料并保存 --> 弹出操作成功


⑤点击"我的地址" --> 编辑地址 --> 点击编辑按钮,按要求填写资料并保存 --> 弹出操作成功

⑥点击"我的地址" --> 删除地址 --> 点击删除按钮,并点击确认 --> 弹出删除成功


⑦点击"我的地址" --> 设为默认
测试场景1:在地址栏上直接点击"设为默认"按钮 --> 点击确认,弹出设置成功


测试场景2:点击编辑按钮,然后打开"是否默认"开关 --> 点击保存,弹出操作成功

⑧商品收藏

⑴分页
设置每页条数 --> 页面展示的商品数量更新

跳转到的页数 --> 展示该页的商品

点击"<<"按钮 --> 跳转到该页,展示页面数据


点击"<"按钮 --> 跳转到该页,展示页面数据


点击">"按钮 --> 跳转到该页,展示页面数据


点击">>"按钮 --> 跳转到该页,展示页面数据


⑵清除搜索条件 --> 点击"清除搜索条件"按钮,清空所有输入的搜索信息,商品收藏页面恢复原始状态


⑶删除商品收藏
测试场景1:点击操作中的"删除"按钮,再点击"确认"按钮 --> 弹出删除成功


测试场景2:勾选想要删除商品信息前的方框,点击删除按钮,再点击确认按钮 --> 弹出删除成功


⑷搜索商品收藏
测试场景1:在商品信息输入框中输入商品名称/简述/SEO信息,点击搜索按钮 --> 列表中显示相关商品信息


测试场景2:输入想要搜索销售价格的区间范围,点击搜索按钮 --> 列表中显示这个区间的商品信息


测试场景3:输入想要搜索原价的区间范围,点击搜索按钮 --> 列表中显示这个区间的商品信息


测试场景4:输入想要搜索创建时间的区间范围,点击搜索按钮 --> 列表中显示这个区间的商品信息


⑸详情 --> 点击详情按钮,跳出弹窗,点击"商品信息"框 --> 跳转到商品的详情页面

⑹设置
勾选要展示的收藏商品信息(商品信息,销售价格,原价,创建时间),未勾选信息将不会展示


⑨我的积分 --> 查看可用积分和当前锁定积分

⑩我的足迹

⑪安全退出 --> 点击"安全退出"按钮 --> 弹出"退出成功",返回到网站首页


5.7 购物车
1)在未登录状态下:
①点击"购物车",弹出登录弹窗

2)在登录状态下:
①修改商品数量
点击"+"或"-"按钮 --> 弹出更新成功


在输入框里输入商品数量 --> 弹出更新成功

②购物车商品的收藏
点击"收藏"按钮 --> 弹出收藏成功,显示已收藏

勾选想要收藏商品信息前的方框,点击"收藏"按钮 --> 弹出收藏成功,显示已收藏

点击"全选"按钮,再点击"收藏"按钮 --> 弹出收藏成功,显示已收藏

③结算
勾选想要结算的商品(单选/多选),点击"结算"按钮 --> 跳转到"订单确认"页面


④删除购物车商品
点击"删除"按钮,再点击"确认"按钮 --> 弹出删除成功


勾选想要删除商品信息前的方框,点击"删除"按钮,再点击"确认"按钮 --> 弹出删除成功


点击"全选"按钮,再点击"删除"按钮,再点击"确认"按钮 --> 弹出删除成功



5.8 安全设置
1)在未登录状态下:
①输入安全设置URL,跳转到登录页面

2)在登录状态下:
①绑定手机号码

②绑定电子邮箱

③账号注销 --> 点击注销按钮,跳转到账号注销页面,点击"确认注销"按钮,再点击"确认"按钮 --> 弹出注销成功


5.9 订单确认
1)在未登录状态下:
①输入订单确认URL,跳转到登录页面

2)在登录状态下:
①确认收货地址
❶快递
选择收货地址

新建地址

❷同城
选择收货地址

新建地址

❸自提
选择合适的自提点

②买家留言 --> 填写相应的备注信息

③提交订单

六. 兼容性测试
测试场景1:在Chrome浏览器下进入商城系统
预期结果:无异常且一切布局显示功能等与其一致



测试场景2:在Edge浏览器下进入商城系统
预期结果:无异常且一切布局显示功能等与其一致



测试场景三:在联想浏览器下进入商城系统
预期结果:无异常且一切布局显示功能等与其一致



七. 自动化测试
7.1 创建公共模块 -- Utils.py
python
#创建一个浏览器对象
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service=Service("D:\\chromedriver-win64\\chromedriver.exe"),options=options)
self.driver.implicitly_wait(2) # 隐式等待
# 窗⼝最⼤化
self.driver.maximize_window()
def getScreeShot(self):
# 创建屏幕截图
# 图片文件名称:./2026-03-25-133256.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
# 判断dirname文件夹是否已经存在,若不存在则创建文件夹
# ../images/2026-03-25
if not os.path.exists("../images/" + dirname):
os.mkdir("../images/" + dirname)
# 2026-03-25-133256.png
# 图片路径:../images/2026-03-25/调用方法-2026-03-25-133256.png
# 图片路径:../images/2026-03-25/LoginSucTest-2026-03-25-133256.png
# 图片路径:../images/2026-03-25/LoginFailTest-2026-03-25-133256.png
filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime(
"%Y-%m-%d-%H%M%S") + ".png"
self.driver.save_screenshot("../images/" + dirname + "/" + filename)
MallDriver = Driver()
7.2 注册模块 - MallRegister.py
python
import time
import ddddocr
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
#测试商城注册页面
class MallRegister:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122//?s=user/regInfo.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
self.ocr = ddddocr.DdddOcr(show_ad=False)
self.wait = WebDriverWait(self.driver, 2)
def captcha(self):
# 全局等待器,self.wait = WebDriverWait(self.driver, 15) 在__init__提前定义
wait = self.wait
# 1. 等待验证码图片可见
img_xpath = '//*[@id="form-verify-img"]'
ele = wait.until(EC.visibility_of_element_located((By.XPATH, img_xpath)))
# 2. 获取图片二进制
ele_bytes = ele.screenshot_as_png
# 3. 复用初始化好的ocr实例,删掉重复创建
text = self.ocr.classification(ele_bytes)
print(f"识别到验证码:{text}") # 打印识别结果方便调试
# 4. 等待验证码输入框可点击再填入
input_xpath = '//*[@type="text" and @name="verify"]'
verify_input = wait.until(EC.element_to_be_clickable((By.XPATH, input_xpath)))
verify_input.clear() # 清空原有内容防止叠加
verify_input.send_keys(text)
# 检查页面元素
def RegisterCheckTest(self):
# 检查"欢迎注册"
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/p[1]")
# 检查"账号注册"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/ul/li[1]/a")
# 检查"用户名输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input")
# 检查"登录密码输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input")
# 检查"验证码输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input")
# 检查"注册按钮"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button")
# 检查"立即登录"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[2]/div[2]/div/a")
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册成功的测试用例
def RegisterSucTest(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
#注册失败的测试用例1(用户名格式有误)
def RegisterFailTest1(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名(格式有误)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("k")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册失败的测试用例2(登录密码格式有误)
def RegisterFailTest2(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码(格式有误)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("00")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册失败的测试用例3(验证码未填写)
def RegisterFailTest3(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
# self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册失败的测试用例4(用户名未填写)
def RegisterFailTest4(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册失败的测试用例5(登录密码未填写)
def RegisterFailTest5(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 注册失败的测试用例6(未点击阅读并同意《服务协议》)
def RegisterFailTest6(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 用户名
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("kun")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击阅读并同意《服务协议》
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[4]/label/span/i[2]").click()
# 点击注册
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
7.3 登录模块 - MallLogin.py
python
import time
import ddddocr
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
#测试商城登录页面
class MallLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122/?s=user/logininfo.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
self.ocr = ddddocr.DdddOcr(show_ad=False)
self.wait = WebDriverWait(self.driver, 2)
def captcha(self):
# 全局等待器,self.wait = WebDriverWait(self.driver, 15) 在__init__提前定义
wait = self.wait
# 1. 等待验证码图片可见
img_xpath = '//*[@id="form-verify-img"]'
ele = wait.until(EC.visibility_of_element_located((By.XPATH, img_xpath)))
# 2. 获取图片二进制
ele_bytes = ele.screenshot_as_png
# 3. 复用初始化好的ocr实例,删掉重复创建
text = self.ocr.classification(ele_bytes)
print(f"识别到验证码:{text}") # 打印识别结果方便调试
# 4. 等待验证码输入框可点击再填入
input_xpath = '//*[@type="text" and @name="verify"]'
verify_input = wait.until(EC.element_to_be_clickable((By.XPATH, input_xpath)))
verify_input.clear() # 清空原有内容防止叠加
verify_input.send_keys(text)
#检查页面元素
def LoginCheckTest(self):
# 检查"欢迎登录"
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/p[1]")
# 检查"账号密码"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/ul/li[1]/a")
# 检查"登录账号输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input")
# 检查"登录密码输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input")
# 检查"验证码输入框"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input")
# 检查"登录按钮"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[4]/button")
# 检查"找回密码"
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div/a")
# 添加屏幕截图
MallDriver.getScreeShot()
#登录成功的测试用例
def LoginSucTest(self):
#清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
# self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
#登录账号
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhangsan")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
#验证码
# self.captcha()
#点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/button").click()
#能够找到用户的昵称,说明登录成功,否则登录失败
# wait = WebDriverWait(self.driver, 1)
# wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[1]/div/span")))
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/div[1]/div[1]/div/span")
# 添加屏幕截图
MallDriver.getScreeShot()
#登录失败的测试用例1(账号错误)
def LoginFailTest1(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 登录账号(错误)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhanghhh")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
# self.captcha()
# 点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 登录失败的测试用例2(密码错误)
def LoginFailTest2(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 登录账号
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhangsan")
# 登录密码(错误)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("123456")
# 验证码
self.captcha()
# 点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[4]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 登录失败的测试用例3(未写验证码)
def LoginFailTest3(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 登录账号
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhangsan")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
# self.captcha()
# 点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[4]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 登录失败的测试用例4(未写账号)
def LoginFailTest4(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 登录账号
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhangsan")
# 登录密码
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[4]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 登录失败的测试用例5(未写密码)
def LoginFailTest5(self):
# 清除
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/input").clear()
# 登录账号
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[1]/input").send_keys("zhangsan")
# 登录密码
# self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[2]/input").send_keys("000000")
# 验证码
self.captcha()
# 点击登录
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[4]/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# login = MallLogin()
# login.LoginSucTest()
7.4 商城首页模块 - MallList.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
#商城首页测试用例
class MallList:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122/"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素
def ListCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH,"//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH, "//*[@id='ai-topsearch']")
# 检查全部分类是否存在
self.driver.find_element(By.XPATH, "//*[@id='goods-category']/div/a/div")
# 检查数码办公是否存在
self.driver.find_element(By.XPATH, "//*[@id='floor1']/div[1]/div/p[1]")
# 检查头像是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[6]/div/div[1]/div[1]/a/img")
# 检查资讯头条是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[6]/div/div[2]/p")
# 检查网站LOGO是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[1]/a/img")
# 测试首页(登录情况下)
def ListSucTestByLogin(self):
# time.sleep(2)
# 点击个人中心 -- 跳转到个人中心页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[1]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[1]/div/span")
self.driver.back()
# 点击我的商城->我的订单 -- 跳转到我的订单页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[2]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[2]/div/ul/li/a/p").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1")
self.driver.back()
# 点击我的收藏->商品收藏 -- 跳转到商品收藏页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[3]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[3]/div/ul/li/a/p").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1")
self.driver.back()
# 点击更多入口 -- 点击分类 -- 跳转到商品分类页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/ul/li[1]/a").click()
self.driver.find_element(By.XPATH,'//*[@id="goods-category"]/div/a/div/span')
self.driver.back()
# 点击更多入口 -- 点击订单 -- 跳转到我的订单页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/ul/li[3]/a").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1")
self.driver.back()
# 点击购物车 -- 跳转到购物车页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[5]/div/a/span").click()
self.driver.find_element(By.XPATH,'//*[@id="goods-category"]/div/a/div/span')
self.driver.back()
# 点击消息 -- 跳转到我的消息页面
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[6]/div/a/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1")
self.driver.back()
# 点击网站LOGO -- 回到商城首页
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div[1]/a/img").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[6]/div/div[1]/div[1]/div/a")
# self.driver.back()
# 添加屏幕截图
MallDriver.getScreeShot()
# 测试首页(未登录情况下)
def ListFailTestByLogin(self):
# 点击个人中心 -- 弹出登录框
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[1]/div/a/span").click()
# 强制删除弹窗+灰色遮罩(必加)
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击我的商城->我的订单 -- 弹出登录框
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[2]/div/a/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[2]/div/ul/li/a/p").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击我的收藏->商品收藏 -- 弹出登录框
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[3]/div/a/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[3]/div/ul/li/a/p").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击更多入口 -- 点击分类 -- 跳转到商品分类页面
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/a/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/ul/li[1]/a").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/header/div/a/div/span")
self.driver.back()
# 点击更多入口 -- 点击订单 -- 跳转到登录页面
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/a/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[4]/div/ul/li[3]/a").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/p[1]")
self.driver.back()
# 点击购物车 -- 弹出登录框
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[5]/div/a/span").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击消息 -- 弹出登录框
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[6]/div/a/span").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击网站LOGO -- 回到商城首页
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[1]/a/img").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[6]/div/div[1]/div[1]/a/img")
# 添加屏幕截图
MallDriver.getScreeShot()
# 搜索框
def ListSearchTestByLogin(self):
# 清除
self.driver.find_element(By.XPATH, "//*[@id='search-input']").clear()
self.driver.find_element(By.XPATH,"//*[@id='search-input']").send_keys("连衣裙")
self.driver.find_element(By.XPATH,"//*[@id='ai-topsearch']").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div/ul/li[2]")
7.5 商品详情模块 - MallDetail.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
# 商品详情页测试用例
class MallDetail:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122/?s=goods/index/id/32.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素
def DetailCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH,"//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH,"//*[@id='ai-topsearch']")
# 检查图片是否存在
self.driver.find_element(By.XPATH,"//*[@id='clearcontent']/div[1]/div[1]/img")
# 检查数量"-"/"+"是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[2]/dl/dd/div[2]/div[3]/form/div[1]/div[2]/div")
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[2]/dl/dd/div[2]/div[3]/form/div[1]/div[2]/dd/div/button[1]")
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[2]/dl/dd/div[2]/div[3]/form/div[1]/div[2]/dd/div/button[2]")
# 检查立即购买是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[1]")
# 检查加入购物车是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[2]")
# 检查收藏是否存在
self.driver.find_element(By.XPATH, "//*[@id='clearcontent']/div[2]/span/em")
# 检查详情是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[1]/a")
# 检查评价是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[2]/a")
# 测试详情页(登录情况下)
def DetailSucTestByLogin(self):
# 点击立即购买
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[1]").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div/div[3]/div[3]/div/form/div/button")
self.driver.back()
# 点击加入购物车
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[2]").click()
# time.sleep(1)
self.driver.find_element(By.XPATH,"//*[@id='common-user-cart-success-modal']/div/div[2]/div[1]/span")
self.driver.find_element(By.XPATH,"//*[@id='common-user-cart-success-modal']/div/div[2]/div[3]/button").click()
# time.sleep(3)
# 点击收藏
self.driver.find_element(By.XPATH,"//*[@id='clearcontent']/div[2]/span").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 点击详情
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[1]/a").click()
self.driver.find_element(By.XPATH, "//*[@id='goods-middle-tabs-nav-detail']/div/div/p[5]/img")
# 点击评价
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[2]/a").click()
self.driver.find_element(By.XPATH, "//*[@id='goods-middle-tabs-nav-comments']/div[2]/div")
# 添加屏幕截图
MallDriver.getScreeShot()
# 测试详情页(未登录情况下)
def DetailFailTestByLogin(self):
# 点击立即购买
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[1]").click()
# 强制删除弹窗+灰色遮罩(必加)
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击加入购物车
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div[2]/div[2]/div/div[3]/div[2]/button[2]").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击收藏
self.driver.find_element(By.XPATH,"//*[@id='clearcontent']/div[2]/span/em").click()
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 点击详情
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[1]/a").click()
self.driver.find_element(By.XPATH,"//*[@id='goods-middle-tabs-nav-detail']/div/div/p[5]/img")
# 点击评价
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[3]/div[2]/div/div[1]/ul/li[2]/a").click()
self.driver.find_element(By.XPATH,"//*[@id='goods-middle-tabs-nav-comments']/div[2]/div")
# 添加屏幕截图
MallDriver.getScreeShot()
7.6 商品分类模块 - MallCategory.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
# 商品分类测试用例
class MallCategory:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122//?s=category/index.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素
def CategoryCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH, "//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH, "//*[@id='ai-topsearch']")
# 检查数码办公是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[1]/div/p")
# 检查时尚服饰是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[2]/div/p")
# 检查名品潮包是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[3]/div/p")
# 检查全部分类是否存在
self.driver.find_element(By.XPATH, "//*[@id='goods-category']/div/a/div/span")
# 检查加入购物车是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[2]/div/div/div[2]/i")
# 检查分页是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[3]/ul")
# 测试商品分类(登录情况下)
def CategorySucTestByLogin(self):
# 点击数码办公
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[1]/div/p").click()
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[9]/div/div/div[1]/p/a").text
# 断言检测一下是否符合预期
assert actual == "商品"
# 点击时尚服饰
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[2]/div/p").click()
time.sleep(3)
actual1 = self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[4]/div/div/div[1]/p[1]/a").text
assert actual1 == "敲显瘦温柔长款羊毛连衣裙Polo领一片式系带针织长裙"
# 点击名品潮包
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[3]/div/p").click()
time.sleep(3)
actual2 = self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[6]/div/div/div[1]/p[1]/a").text
assert actual2 == "PRADA/普拉达【七夕礼物】女士Saffiano 皮革迷你Hobo手袋腋下包 黑色"
# 点击全部分类
self.driver.find_element(By.XPATH, "//*[@id='goods-category']/div/a/div/span").click()
# time.sleep(3)
actual3 = self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[8]/div/div/div[1]/p[1]/a").text
assert actual3 == "Apple iPhone 14 Pro Max (A2896) 256GB 暗紫色 支持移动联通电信5G 双卡双待手机"
# 点击加入购物车
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[1]/div/div/div[2]/i").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 测试商品分类(未登录情况下)
def CategoryFailTestByLogin(self):
# 点击数码办公
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[1]/div/p").click()
actual = self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[9]/div/div/div[1]/p/a").text
# 断言检测一下是否符合预期
assert actual == "商品"
# 点击时尚服饰
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[2]/div/p").click()
time.sleep(3)
actual1 = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[4]/div/div/div[1]/p[1]/a").text
assert actual1 == "敲显瘦温柔长款羊毛连衣裙Polo领一片式系带针织长裙"
# 点击名品潮包
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[1]/div/div/div/div/ul/li[3]/div/p").click()
time.sleep(3)
actual2 = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[6]/div/div/div[1]/p[1]/a").text
assert actual2 == "PRADA/普拉达【七夕礼物】女士Saffiano 皮革迷你Hobo手袋腋下包 黑色"
# 点击全部分类
self.driver.find_element(By.XPATH, "//*[@id='goods-category']/div/a/div/span").click()
# time.sleep(3)
actual3 = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[8]/div/div/div[1]/p[1]/a").text
assert actual3 == "Apple iPhone 14 Pro Max (A2896) 256GB 暗紫色 支持移动联通电信5G 双卡双待手机"
# 点击加入购物车
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div/div[3]/div/div[2]/div/ul/li[1]/div/div/div[2]/i").click()
# 强制删除弹窗+灰色遮罩(必加)
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 添加屏幕截图
MallDriver.getScreeShot()
7.7 个人中心模块 - MallAccount.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
#个人中心页测试用例
class MallAccount:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122/?s=user/index.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素(在登录情况下)
def AccountCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH,"//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH,"//*[@id='ai-topsearch']")
# 检查修改头像是否存在
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[1]/span")
# 检查修改资料是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[2]/span")
# 检查我的地址是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[3]/span")
# 检查我的积分是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/ul/li[4]/a/p[2]")
# 检查安全退出是否存在
self.driver.find_element(By.XPATH, "//*[@id='user-offcanvas']/div/ul/li[5]/a")
# 检查我的订单是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[2]/div[1]/a[1]/span")
# 检查购物车是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/span")
# 检查商品收藏是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[2]/div[2]/div[3]/div/div[1]/span")
# 检查我的足迹是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div[3]/div/div[2]/div[2]/div[4]/div/div[1]/span")
# 测试个人中心页(登录情况下)
def AccountSucTestByLogin(self):
# 修改头像
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[1]/span").click()
self.driver.find_element(By.XPATH,"//*[@id='user-avatar-popup']/div/div[2]/form/div[2]/div/input") #查看是否有选择图片
self.driver.find_element(By.XPATH,"//*[@id='user-avatar-popup']/div/div[2]/form/div[4]/button[2]") #查看是否有确认上传
self.driver.find_element(By.XPATH,"//*[@id='user-avatar-popup']/div/div[2]/form/div[4]/button[1]").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# ------------------------------------------------------------------------------------------------------------------
# 修改资料
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[2]/span").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div/a").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/form/div[1]/div[1]/input").clear()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/form/div[1]/div[1]/input").send_keys("yan")
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/form/div[2]/button").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[1]/div/ul[2]/div[2]/div/a/span").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# ------------------------------------------------------------------------------------------------------------------
# 我的地址
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div[3]/div/div[1]/div[1]/div[2]/a[3]/span").click()
# 新增地址
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[2]/button").click()
# 切换到弹窗 frame
iframe = self.driver.find_element(By.XPATH,"//iframe[contains(@src, 'http://49.235.61.184/?s=useraddress/saveinfo&system_type=default')]")
self.driver.switch_to.frame(iframe)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div/form/div[1]/input").clear()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div/form/div[1]/input").send_keys("公司")
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div/form/div[3]/input").clear()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div/form/div[3]/input").send_keys("12345678910")
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div/form/div[4]/div/div[1]/div[1]/div").click()
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div/form/div[4]/div/div[1]/div[2]/div[1]/div[1]/div/ul/li[1]/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div/form/div[4]/div/div[1]/div[2]/div[1]/div[2]/div/ul/li/span").click()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div/form/div[4]/div/div[1]/div[2]/div[1]/div[3]/div/ul/li[3]/span").click()
self.driver.find_element(By.XPATH, "//*[@id='form-address']").clear()
self.driver.find_element(By.XPATH, "//*[@id='form-address']").send_keys("菜鸟驿站")
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div/form/div[7]/button[2]").click()
# 切回主文档
self.driver.switch_to.default_content()
# 刷新当前页面
self.driver.refresh()
# ------------------------------------------------------------------------------------------------------------------
# 我的积分
self.driver.find_element(By.XPATH,"//*[@id='collapse-nav-property']/li/a").click()
# 跳转到"我的积分"页面
actual = self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1").text
# print(actual)
assert actual == "我的积分"
# ------------------------------------------------------------------------------------------------------------------
# 我的足迹
self.driver.find_element(By.XPATH, "//*[@id='collapse-nav-base']/li[5]/a").click()
# 跳转到"我的足迹"页面
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1").text
# print(actual)
assert actual == "我的足迹"
# ------------------------------------------------------------------------------------------------------------------
# 安全设置
self.driver.find_element(By.XPATH, "//*[@id='collapse-nav-base']/li[3]/a").click()
# 跳转到"安全设置"页面
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div/h1").text
# print(actual)
assert actual == "安全设置"
# ------------------------------------------------------------------------------------------------------------------
# 商品收藏
self.driver.find_element(By.XPATH,"//*[@id='collapse-nav-business']/li[3]/a").click()
# 跳转到"商品收藏"页面
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div[1]/h1").text
# print(actual)
assert actual == "商品收藏"
# 查找收藏的商品
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div[3]/div/div[3]/form/div[3]/table/thead/tr/th[2]/div/input").clear()
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div[3]/form/div[3]/table/thead/tr/th[2]/div/input").send_keys("FILA")
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div[3]/form/div[2]/div/div/button[1]").click()
actual = self.driver.find_element(By.XPATH, "//*[@id='data-list-1536']/td[2]/div/a[2]").text
# print(actual)
assert actual == "FILA 斐乐官方女子连衣裙2023夏季新款简约V领网球运动短袖连身裙 RD宝蓝-NV 165/84A/M"
# 清除搜索条件
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div[3]/div/div[3]/form/div[2]/div/div/a").click()
# 点击"详情"
self.driver.find_element(By.XPATH,"//*[@id='data-list-1619']/td[6]/button[1]/span").click()
# 切换到弹窗
iframe = self.driver.find_element(By.XPATH,"//iframe[contains(@src, 'http://49.235.61.184/?s=usergoodsfavor/detail/id/1619&system_type=default')]")
self.driver.switch_to.frame(iframe)
# 万能公式:遇到弹窗找不到元素 -> 切 iframe -> 不知道 iframe 长什么样 -> 在代码里加 print(self.driver.page_source) 把源码打出来看一眼 -> 找到那个 <iframe> 标签 -> 复制它的 src 或 id 来做定位
# print(self.driver.page_source)
# 查看商品信息
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div/dl/dt[1]/strong").text
# print(actual)
assert actual == "商品信息"
# 切回主文档
self.driver.switch_to.default_content()
# 刷新当前页面
self.driver.refresh()
# ------------------------------------------------------------------------------------------------------------------
# 安全退出
self.driver.find_element(By.XPATH,"//*[@id='user-offcanvas']/div/ul/li[5]/a").click()
# time.sleep(1)
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[6]/div/div[1]/div[2]")
# 添加屏幕截图
MallDriver.getScreeShot()
# 测试个人中心页(未登录情况下)
def AccountFailTestByLogin(self):
# 点击个人中心
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[1]/div/ul[2]/div[2]/div/a/span").click()
# 强制删除弹窗+灰色遮罩(必加)
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 添加屏幕截图
MallDriver.getScreeShot()
7.8 购物车模块 - MallCart.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
# 购物车测试用例
class MallCart:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122//?s=cart/index.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素(在登录情况下)
def CartCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH,"//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH, "//*[@id='ai-topsearch']")
# 检查删除按钮是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div/div[1]/a[1]")
# 检查收藏按钮是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div/div[1]/a[2]")
# 检查结算按钮是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div/div[2]/form/button")
# 检查商品信息是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[1]/table/thead/tr/th[1]")
# 测试购物车(登录情况下)
def CartSucTestByLogin(self):
# 点击购物车
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[2]/div/ul[2]/div[6]/div/a/span").click()
# 结算
# 任选一个商品
self.driver.find_element(By.XPATH, "//*[@id='data-list-352']/td[1]/label").click()
# 点击"结算"按钮
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[5]/div[2]/div/div[2]/form/button").click()
# 跳转到"订单确认"页面
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div/div[2]/h3").text
# print(actual)
assert actual == "订单信息"
self.driver.back()
# 删除
# 点击"删除"
self.driver.find_element(By.CSS_SELECTOR,"#data-list-374 > td.operation > div > a.am-color-grey-dark.submit-delete").click()
# 点击"取消"
self.driver.find_element(By.CSS_SELECTOR,".am-modal-footer > span.am-modal-btn.am-text-danger").click()
# 收藏
# 点击"收藏/已收藏"
self.driver.find_element(By.XPATH,"//*[@id='data-list-374']/td[5]/div/a[2]").click()
# 提示:"收藏成功/取消成功"
MallDriver.getScreeShot()
# 测试购物车(未登录情况下)
def CartFailTestByLogin(self):
# 点击购物车
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[1]/div/ul[2]/div[6]/div/a/span").click()
# 强制删除弹窗+灰色遮罩(必加)
self.driver.execute_script("document.querySelectorAll('div[class*=am-popup],div[class*=am-dimmer]').forEach(el=>el.remove())")
# 添加屏幕截图
MallDriver.getScreeShot()
7.9 订单确认模块 - MallOrderReview.py
python
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from common.Utils import MallDriver
# 订单确认测试用例
class MallOrderReview:
url = ""
driver = ""
def __init__(self):
self.url = "http://121.43.128.122/?s=buy/index.html"
self.driver = MallDriver.driver
self.driver.get(self.url)
# 检查页面元素(在登录情况下)
def OrderReviewCheckTestByLogin(self):
# 检查搜索框是否存在
self.driver.find_element(By.XPATH,"//*[@id='search-input']")
# 检查搜索按钮是否存在
self.driver.find_element(By.XPATH,"//*[@id='ai-topsearch']")
# 检查快递是否存在
self.driver.find_element(By.XPATH,"//*[@id='buy-items-tabs']/ul/li[1]/a")
# 检查同城是否存在
self.driver.find_element(By.XPATH,"//*[@id='buy-items-tabs']/ul/li[2]/a")
# 检查自提是否存在
self.driver.find_element(By.XPATH,"//*[@id='buy-items-tabs']/ul/li[3]/a")
# 检查订单信息是否存在
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[4]/div/div[2]/h3")
# 检查选择支付是否存在
self.driver.find_element(By.XPATH,"//*[@id='buy-items-payment']/h3")
# 检查提交订单是否存在
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[4]/div/div[3]/div[3]/div/form/div/button")
# 测试订单确认(登录情况下)
def OrderReviewSucTestByLogin(self):
# 点击"快递"
self.driver.find_element(By.XPATH,"//*[@id='buy-items-tabs']/ul/li[1]/a").click()
# 点击"确认收货地址"
self.driver.find_element(By.XPATH, "//*[@id='data-list-26']/div").click()
# 点击"同城"
self.driver.find_element(By.XPATH, "//*[@id='buy-items-tabs']/ul/li[2]/a").click()
# 点击"确认收货地址"
self.driver.find_element(By.XPATH, "//*[@id='data-list-26']/div").click()
# 点击"自提"
self.driver.find_element(By.XPATH, "//*[@id='buy-items-tabs']/ul/li[3]/a").click()
# 点击"选择取货地址"
self.driver.find_element(By.XPATH, "//*[@id='buy-items-address']/div[2]/button").click()
# 自提点选择
self.driver.find_element(By.XPATH, "//*[@id='extraction-address-popup']/div/div[2]/ul/li[1]/div/button").click()
# 添加屏幕截图
MallDriver.getScreeShot()
# 测试订单确认(未登录情况下)
def OrderReviewFailTestByLogin(self):
self.driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[2]/div/p[1]")
self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div[2]/div[2]/div[2]/div/div[1]/div[1]/form/div[3]/button")
# 添加屏幕截图
MallDriver.getScreeShot()
7.10 整体运行 - RunTest.py
python
import time
from tests import MallLogin
from tests import MallRegister
from tests import MallList
from tests import MallDetail
from tests import MallCategory
from tests import MallAccount
from tests import MallCart
from tests import MallOrderReview
from common.Utils import MallDriver
if __name__ == "__main__":
# 注册失败
# MallRegister.MallRegister().RegisterFailTest1()
# MallRegister.MallRegister().RegisterFailTest2()
# MallRegister.MallRegister().RegisterFailTest3()
# MallRegister.MallRegister().RegisterFailTest4()
# MallRegister.MallRegister().RegisterFailTest5()
# MallRegister.MallRegister().RegisterFailTest6()
#
# # 注册成功
# MallRegister.MallRegister().RegisterCheckTest()
# MallRegister.MallRegister().RegisterSucTest()
#登录失败
MallLogin.MallLogin().LoginFailTest1()
# MallLogin.MallLogin().LoginFailTest2()
# MallLogin.MallLogin().LoginFailTest3()
# MallLogin.MallLogin().LoginFailTest4()
# MallLogin.MallLogin().LoginFailTest5()
# 登录成功
# MallLogin.MallLogin().LoginCheckTest()
# MallLogin.MallLogin().LoginSucTest()
#商城首页
# MallList.MallList().ListFailTestByLogin()
# MallList.MallList().ListCheckTestByLogin()
# MallList.MallList().ListSucTestByLogin()
# MallList.MallList().ListSearchTestByLogin()
# 商品详情页
# MallDetail.MallDetail().DetailFailTestByLogin()
# MallDetail.MallDetail().DetailCheckTestByLogin()
# MallDetail.MallDetail().DetailSucTestByLogin()
# 商品分类
# MallCategory.MallCategory().CategoryFailTestByLogin()
# MallCategory.MallCategory().CategoryCheckTestByLogin()
# MallCategory.MallCategory().CategorySucTestByLogin()
# 个人中心页
# MallAccount.MallAccount().AccountFailTestByLogin()
# MallAccount.MallAccount().AccountCheckTestByLogin()
# MallAccount.MallAccount().AccountSucTestByLogin()
# 购物车
# MallCart.MallCart().CartFailTestByLogin()
# MallCart.MallCart().CartCheckTestByLogin()
# MallCart.MallCart().CartSucTestByLogin()
# 订单确认
MallOrderReview.MallOrderReview().OrderReviewFailTestByLogin()
# MallOrderReview.MallOrderReview().OrderReviewCheckTestByLogin()
# MallOrderReview.MallOrderReview().OrderReviewSucTestByLogin()
# 执行浏览器的退出
MallDriver.driver.quit()
自动化测试脚本链接(已放入Gitee,可点击查看):商城系统用户端自动化脚本
八. 项目测试bug描述
8.1 登录注册页面
背景图未铺满屏幕


8.2 商城首页页面
图片不显示

8.3 商品详情页面
核心功能缺失(没有"立即购买"和"加入购物车")和 属性数据错乱
商品没有粉色和白色运动裤的图片

8.4 商品分类页面
商城里的商品匮乏 和 数码办公的图片也依旧不显示
手机通讯中出现笔记本电脑

长款连衣裙有两个,但是只显示一个


8.5 安全设置页面
当前密码和新密码一样,显示操作成功

获取验证码无效

8.6 购物车页面
修改商品数量后,跟右上角的购物车数量不匹配(不能同步更新)

8.7 订单确认页面
没有支付方式

地址里的电话号格式有误

九. 测试结论
本次测试覆盖了商城系统用户端的核心功能及 UI 自动化场景。经测试,系统基础浏览与跨浏览器运行正常,但核心交易流程与业务逻辑存在明显缺陷:订单页缺失支付方式导致无法下单,修改密码未校验新旧密码一致性,购物车数量同步异常,且存在图片不显示、分类归属错误等数据展示问题。
最终结论 :鉴于当前版本存在阻断核心交易流程(缺失支付方式)的严重缺陷,系统不具备上线条件。建议开发优先修复支付与逻辑漏洞,完成回归测试后再评估上线。






