本文目录导读:

我来详细介绍几种模拟购物车操作的脚本方法,涵盖不同的测试场景和技术方案。
基础前端模拟(JavaScript)
// 购物车类
class ShoppingCart {
constructor() {
this.items = [];
this.total = 0;
}
// 添加商品
addItem(product, quantity = 1) {
const existingItem = this.items.find(item => item.id === product.id);
if (existingItem) {
existingItem.quantity += quantity;
} else {
this.items.push({
...product,
quantity: quantity
});
}
this.calculateTotal();
this.updateUI();
}
// 删除商品
removeItem(productId) {
this.items = this.items.filter(item => item.id !== productId);
this.calculateTotal();
this.updateUI();
}
// 修改数量
updateQuantity(productId, newQuantity) {
const item = this.items.find(item => item.id === productId);
if (item) {
item.quantity = Math.max(0, newQuantity);
if (item.quantity === 0) {
this.removeItem(productId);
}
}
this.calculateTotal();
this.updateUI();
}
// 计算总价
calculateTotal() {
this.total = this.items.reduce((sum, item) =>
sum + (item.price * item.quantity), 0
);
}
// 清空购物车
clearCart() {
this.items = [];
this.total = 0;
this.updateUI();
}
// 更新UI(示例)
updateUI() {
console.log('购物车更新:', {
items: this.items,
total: this.total
});
}
}
// 使用示例
const cart = new ShoppingCart();
// 模拟添加商品
const product1 = { id: 1, name: '商品A', price: 99.9 };
const product2 = { id: 2, name: '商品B', price: 59.9 };
cart.addItem(product1, 2); // 添加2个商品A
cart.addItem(product2, 1); // 添加1个商品B
cart.updateQuantity(1, 3); // 修改商品A数量为3
cart.removeItem(2); // 删除商品B
自动化测试脚本(Playwright)
const { chromium } = require('playwright');
async function simulateCartOperations() {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// 访问电商网站
await page.goto('https://example-shop.com');
// 模拟购物车操作
try {
// 1. 添加商品到购物车
await page.click('.add-to-cart-button');
await page.waitForSelector('.cart-count');
// 2. 查看购物车
await page.click('.cart-icon');
await page.waitForURL('**/cart');
// 3. 修改数量
await page.fill('.quantity-input', '3');
await page.click('.update-button');
// 4. 移除商品
await page.click('.remove-item-button');
// 5. 应用优惠券
await page.fill('.coupon-input', 'DISCOUNT20');
await page.click('.apply-coupon');
// 验证结果
const cartTotal = await page.textContent('.cart-total');
console.log(`购物车总价: ${cartTotal}`);
} catch (error) {
console.error('操作失败:', error);
} finally {
await browser.close();
}
}
simulateCartOperations();
API测试脚本(Python + Requests)
import requests
import json
import random
class CartAPI:
def __init__(self, base_url):
self.base_url = base_url
self.session = requests.Session()
# 模拟用户登录
self.login()
def login(self):
"""模拟用户登录"""
login_data = {
'username': 'test_user',
'password': 'test_password'
}
response = self.session.post(f'{self.base_url}/api/login', json=login_data)
if response.status_code == 200:
print('登录成功')
self.user_id = response.json()['user_id']
else:
raise Exception('登录失败')
def add_to_cart(self, product_id, quantity=1):
"""添加商品到购物车"""
data = {
'user_id': self.user_id,
'product_id': product_id,
'quantity': quantity
}
response = self.session.post(f'{self.base_url}/api/cart/add', json=data)
return response.json()
def get_cart(self):
"""获取购物车内容"""
response = self.session.get(f'{self.base_url}/api/cart/{self.user_id}')
return response.json()
def update_quantity(self, product_id, new_quantity):
"""更新商品数量"""
data = {
'user_id': self.user_id,
'product_id': product_id,
'quantity': new_quantity
}
response = self.session.put(f'{self.base_url}/api/cart/update', json=data)
return response.json()
def remove_item(self, product_id):
"""移除购物车商品"""
data = {
'user_id': self.user_id,
'product_id': product_id
}
response = self.session.delete(f'{self.base_url}/api/cart/remove', json=data)
return response.json()
def checkout(self):
"""结账"""
response = self.session.post(f'{self.base_url}/api/cart/checkout/{self.user_id}')
return response.json()
# 模拟购物车操作
def simulate_cart_scenario():
api = CartAPI('http://localhost:8000')
# 模拟随机商品选择
products = [101, 102, 103, 104, 105]
# 添加多个商品
print("=== 添加商品 ===")
for _ in range(3):
product_id = random.choice(products)
quantity = random.randint(1, 3)
result = api.add_to_cart(product_id, quantity)
print(f"添加商品 {product_id} x {quantity}: {result}")
# 查看购物车
print("\n=== 当前购物车 ===")
cart = api.get_cart()
print(json.dumps(cart, indent=2))
# 修改某个商品数量
if cart.get('items'):
first_item = cart['items'][0]
print(f"\n=== 修改商品 {first_item['product_id']} 数量 ===")
api.update_quantity(first_item['product_id'], 5)
# 移除一个商品
if len(cart.get('items', [])) > 1:
remove_id = cart['items'][1]['product_id']
print(f"\n=== 移除商品 {remove_id} ===")
api.remove_item(remove_id)
# 最终检查购物车
print("\n=== 最终购物车状态 ===")
final_cart = api.get_cart()
print(json.dumps(final_cart, indent=2))
# 结账
print("\n=== 结账 ===")
checkout_result = api.checkout()
print(f"结账结果: {checkout_result}")
# 运行模拟
simulate_cart_scenario()
性能测试脚本(Locust)
from locust import HttpUser, task, between
import random
class CartUser(HttpUser):
wait_time = between(1, 5)
def on_start(self):
"""用户启动时的初始化"""
# 登录
self.client.post("/login", {
"username": f"test_user_{random.randint(1, 1000)}",
"password": "test123"
})
@task(3)
def add_to_cart(self):
"""添加商品到购物车"""
product_id = random.randint(1, 100)
quantity = random.randint(1, 5)
self.client.post("/cart/add", json={
"product_id": product_id,
"quantity": quantity
})
@task(2)
def view_cart(self):
"""查看购物车"""
self.client.get("/cart")
@task(1)
def update_cart(self):
"""更新购物车商品数量"""
product_id = random.randint(1, 100)
new_quantity = random.randint(1, 10)
self.client.put("/cart/update", json={
"product_id": product_id,
"quantity": new_quantity
})
@task(1)
def remove_from_cart(self):
"""从购物车移除商品"""
product_id = random.randint(1, 100)
self.client.delete(f"/cart/remove/{product_id}")
@task(1)
def checkout(self):
"""结账"""
self.client.post("/cart/checkout")
# 运行:locust -f cart_simulation.py
完整测试场景脚本
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class CartTestScenario:
def __init__(self):
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver, 10)
def setup(self):
"""测试准备"""
self.driver.maximize_window()
self.driver.get("https://example-ecommerce.com")
self.login()
def login(self):
"""登录操作"""
self.driver.find_element(By.ID, "login-btn").click()
self.driver.find_element(By.NAME, "username").send_keys("testuser")
self.driver.find_element(By.NAME, "password").send_keys("password123")
self.driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
time.sleep(2)
def test_add_multiple_items(self):
"""测试添加多个商品"""
print("测试:添加多个商品到购物车")
products = [
{"name": "Product A", "quantity": 2},
{"name": "Product B", "quantity": 1},
{"name": "Product C", "quantity": 3}
]
for product in products:
# 搜索商品
search_box = self.driver.find_element(By.NAME, "search")
search_box.clear()
search_box.send_keys(product["name"])
search_box.submit()
# 等待搜索结果
self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "product-card")))
# 添加购物车
add_button = self.driver.find_element(By.CLASS_NAME, "add-to-cart")
for _ in range(product["quantity"]):
add_button.click()
time.sleep(0.5)
print(f" ✓ 已添加 {product['quantity']} 个 {product['name']}")
def test_modify_quantities(self):
"""测试修改数量"""
print("\n测试:修改购物车商品数量")
# 进入购物车
self.driver.find_element(By.CLASS_NAME, "cart-icon").click()
time.sleep(2)
# 修改第一个商品数量
quantity_input = self.driver.find_element(By.CSS_SELECTOR, ".cart-item .quantity-input")
quantity_input.clear()
quantity_input.send_keys("5")
update_btn = self.driver.find_element(By.CSS_SELECTOR, ".update-quantity")
update_btn.click()
time.sleep(1)
print(" ✓ 已修改商品数量为 5")
def test_remove_items(self):
"""测试删除商品"""
print("\n测试:删除购物车商品")
remove_buttons = self.driver.find_elements(By.CLASS_NAME, "remove-item")
if remove_buttons:
remove_buttons[0].click()
time.sleep(1)
print(" ✓ 已删除一个商品")
def test_apply_coupon(self):
"""测试应用优惠券"""
print("\n测试:应用优惠券")
coupon_input = self.driver.find_element(By.CLASS_NAME, "coupon-input")
coupon_input.send_keys("SAVE20")
apply_btn = self.driver.find_element(By.CLASS_NAME, "apply-coupon")
apply_btn.click()
time.sleep(1)
# 验证优惠券应用
discount = self.driver.find_element(By.CLASS_NAME, "discount-amount")
print(f" ✓ 优惠券已应用,折扣金额: {discount.text}")
def test_checkout(self):
"""测试结账"""
print("\n测试:结账流程")
checkout_btn = self.driver.find_element(By.CLASS_NAME, "checkout-button")
checkout_btn.click()
time.sleep(2)
# 填写配送信息
self.driver.find_element(By.NAME, "address").send_keys("测试地址 123号")
self.driver.find_element(By.NAME, "phone").send_keys("13800138000")
# 选择支付方式
payment_options = self.driver.find_elements(By.NAME, "payment")
if payment_options:
random.choice(payment_options).click()
# 提交订单
submit_btn = self.driver.find_element(By.CLASS_NAME, "submit-order")
submit_btn.click()
time.sleep(2)
# 验证订单
order_confirmation = self.driver.find_element(By.CLASS_NAME, "order-confirmation")
print(f" ✓ 订单提交成功,订单号: {order_confirmation.text}")
def run_all_tests(self):
"""运行所有测试"""
try:
self.setup()
self.test_add_multiple_items()
self.test_modify_quantities()
self.test_remove_items()
self.test_apply_coupon()
self.test_checkout()
print("\n✅ 所有购物车操作测试完成!")
except Exception as e:
print(f"❌ 测试失败: {str(e)}")
finally:
self.driver.quit()
# 运行测试
scenario = CartTestScenario()
scenario.run_all_tests()
关键功能点总结
| 操作类型 | 实现方式 | 测试重点 |
|---|---|---|
| 添加商品 | DOM操作/API请求 | 数量统计、价格计算 |
| 修改数量 | 输入框修改/API更新 | 数量限制、库存验证 |
| 删除商品 | 删除按钮/API请求 | 剩余商品、总价更新 |
| 优惠券 | 表单提交/API调用 | 折扣计算、有效期 |
| 结账 | 表单提交/API请求 | 订单生成、支付跳转 |
选择哪种方案取决于你的具体需求:
- 单元测试:使用Jest/Pytest测试纯逻辑
- 自动化测试:使用Playwright/Selenium模拟用户操作
- API测试:使用Requests直接调用接口
- 性能测试:使用Locust模拟并发访问
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播