kindergarten_java/test_schedule_page.py

206 lines
8.3 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
School Scheduling Page Browser Test
Tests the scheduling functionality including Tab navigation and create modal
"""
from playwright.sync_api import sync_playwright
import time
def test_schedule_page():
with sync_playwright() as p:
# Launch browser in headed mode to see what's happening
browser = p.chromium.launch(headless=False, slow_mo=1000)
page = browser.new_page()
print("=" * 60)
print("🧪 学校端排课功能测试")
print("=" * 60)
# Step 1: Navigate to login page
print("\n1⃣ 导航到登录页面...")
page.goto('http://localhost:5174/login')
page.wait_for_load_state('networkidle')
print(" ✅ 登录页面加载完成")
# Step 2: Click school role button
print("\n2⃣ 选择学校角色...")
try:
# Try multiple selector strategies
role_btn = page.locator('.role-btn').filter(has_text='学校').first
if role_btn.count() == 0:
role_btn = page.get_by_role('button').filter(has_text='学校').first
if role_btn.count() == 0:
# Try text-based selector
role_btn = page.locator('text=学校').first
role_btn.click()
print(" ✅ 已点击学校角色按钮")
except Exception as e:
print(f" ⚠️ 点击学校角色失败: {e}")
# Continue anyway
# Step 3: Fill login form
print("\n3⃣ 填写登录表单...")
# Wait for the form to auto-fill based on role selection
page.wait_for_timeout(500)
# The form should auto-fill when role is selected, but let's verify
account_input = page.locator('input[placeholder*="账号"]').first
password_input = page.locator('input[placeholder*="密码"]').first
account_value = account_input.input_value()
print(f" 📝 账号输入框当前值: {account_value}")
# Fill if needed
if account_value != 'school1':
account_input.fill('school1')
password_input.fill('123456')
print(" ✅ 已填写账号和密码")
# Step 4: Click login button
print("\n4⃣ 点击登录按钮...")
# Use the login-btn class which is more specific
login_btn = page.locator('.login-btn, button[type="submit"], button:has-text("登录")').first
login_btn.click()
# Wait for navigation
try:
page.wait_for_url('**/school/**', timeout=15000)
print(" ✅ 登录成功,已跳转到学校端")
except Exception as e:
print(f" ⚠️ 等待跳转超时: {e}")
# Check current URL
current_url = page.url
print(f" 📍 当前URL: {current_url}")
page.wait_for_load_state('networkidle')
time.sleep(2)
# Step 5: Navigate to schedule page
print("\n5⃣ 导航到课程排期页面...")
page.goto('http://localhost:5174/school/schedule')
page.wait_for_load_state('networkidle')
time.sleep(2)
print(" ✅ 已导航到课程排期页面")
# Step 6: Take screenshot
print("\n6⃣ 截图保存...")
page.screenshot(path='screenshots/schedule-page-test.png', full_page=True)
print(" ✅ 截图已保存: screenshots/schedule-page-test.png")
# Step 7: Check page title
print("\n7⃣ 检查页面标题...")
try:
title_element = page.locator('h1, h2, .page-header').first
title = title_element.text_content()
print(f" ✅ 页面标题: {title}")
except:
print(" ⚠️ 未找到页面标题")
# Step 8: Check for Tab navigation
print("\n8⃣ 检查Tab导航...")
tabs = page.locator('[role="tab"], .ant-tabs-tab').all()
print(f" 📊 找到 {len(tabs)} 个Tab")
for i, tab in enumerate(tabs):
try:
text = tab.text_content()
print(f" Tab {i+1}: {text}")
except:
print(f" Tab {i+1}: (无法获取文本)")
# Step 9: Click through each tab
print("\n9⃣ 测试Tab切换...")
tab_labels = ['列表视图', '课表视图', '日历视图']
for label in tab_labels:
print(f"\n 🔄 切换到 {label}...")
try:
tab = page.locator('[role="tab"], .ant-tabs-tab').filter(has_text=label).first
if tab.count() > 0:
tab.click()
page.wait_for_timeout(1000)
screenshot_name = f'screenshots/schedule-{label.replace("视图", "")}-test.png'
page.screenshot(path=screenshot_name)
print(f" ✅ 已截图: {screenshot_name}")
# Check for content
if '列表' in label:
table = page.locator('.ant-table')
has_table = table.count() > 0
print(f" 📋 列表视图: {'有表格数据' if has_table else '无表格'}")
elif '课表' in label:
timetable = page.locator('.timetable-header, .day-header')
has_timetable = timetable.count() > 0
print(f" 📅 课表视图: {'有课表' if has_timetable else '无课表'}")
elif '日历' in label:
calendar = page.locator('.ant-picker-calendar')
has_calendar = calendar.count() > 0
print(f" 📆 日历视图: {'有日历' if has_calendar else '无日历'}")
else:
print(f" ⚠️ 未找到 {label} Tab")
except Exception as e:
print(f" ❌ 切换失败: {e}")
# Step 10: Try clicking "新建排课" button
print("\n🔟 测试新建排课按钮...")
try:
create_btn = page.locator('button:has-text("新建排课")').first
if create_btn.count() > 0:
create_btn.click()
page.wait_for_timeout(1500)
# Check if modal opened
modal = page.locator('.ant-modal').first
if modal.count() > 0:
print(" ✅ 新建排课弹窗已打开")
page.screenshot(path='screenshots/schedule-create-modal-test.png')
print(" ✅ 弹窗截图已保存")
# Check for dropdowns in modal
dropdowns = modal.locator('.ant-select').all()
print(f" 📝 弹窗中有 {len(dropdowns)} 个下拉框")
# Try clicking the first dropdown to see if it has course collections
if len(dropdowns) > 0:
dropdowns[0].click()
page.wait_for_timeout(500)
page.screenshot(path='screenshots/schedule-dropdown-test.png')
print(" ✅ 下拉框截图已保存")
else:
print(" ⚠️ 弹窗未打开")
else:
print(" ⚠️ 未找到新建排课按钮")
except Exception as e:
print(f" ❌ 新建排课测试失败: {e}")
# Final screenshot
print("\n📸 最终截图...")
page.screenshot(path='screenshots/schedule-final-test.png', full_page=True)
print(" ✅ 最终截图已保存")
# Get page content for debugging
print("\n📄 获取页面信息...")
current_url = page.url
print(f" 当前URL: {current_url}")
# Check for any error messages
error_msg = page.locator('.error-message, .ant-message-error, .ant-alert-error').all()
if error_msg:
print(" ⚠️ 发现错误消息:")
for msg in error_msg:
try:
text = msg.text_content()
print(f" - {text}")
except:
pass
print("\n" + "=" * 60)
print("✅ 测试完成!")
print("=" * 60)
# Keep browser open for a moment to see the result
time.sleep(3)
browser.close()
if __name__ == '__main__':
test_schedule_page()