Commit 8b7e11c6 authored by Cai Wei's avatar Cai Wei

feat(*): 更新测试报告

parent e8de7921
Pipeline #1311 failed
......@@ -37,6 +37,8 @@ test:basic:
dependencies:
- build
script:
# 清理可能存在的旧文件
- rm -rf cypress/reports/* cypress/videos/* cypress/screenshots/* || true
- npm run preview -- --host 0.0.0.0 --port 3000 &
- npx wait-on http://localhost:3000
- npx cypress run --browser chrome --spec "cypress/e2e/spec.cy.js" --reporter mochawesome --reporter-options "reportDir=cypress/reports/basic,overwrite=false,html=true,json=true"
......
#!/bin/bash
# DC-TOM 测试报告清理脚本
# 专门用于清理历史测试报告、视频和截图文件
# 默认保留最近3次测试结果
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
DEFAULT_KEEP_COUNT=3
REPORTS_DIR="cypress/reports"
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 显示使用说明
show_usage() {
echo "用法: $0 [保留数量]"
echo ""
echo "参数:"
echo " 保留数量 可选,指定保留最近几次测试结果 (默认: $DEFAULT_KEEP_COUNT)"
echo ""
echo "示例:"
echo " $0 # 保留最近 $DEFAULT_KEEP_COUNT 次测试结果"
echo " $0 5 # 保留最近 5 次测试结果"
echo " $0 1 # 仅保留最新的测试结果"
echo ""
echo "清理内容:"
echo " - cypress/reports/ 目录下的 HTML 和 JSON 报告文件"
echo " - cypress/videos/ 目录下的测试执行视频"
echo " - cypress/screenshots/ 目录下的失败截图"
echo " - public/reports/ 目录下的合并报告(可选)"
echo ""
echo "注意事项:"
echo " - 此脚本会根据文件修改时间排序,保留最新的文件"
echo " - 建议在项目根目录下运行此脚本"
echo " - 清理操作不可逆,请谨慎使用"
}
# 检查环境
check_environment() {
if [ ! -f "package.json" ]; then
log_error "请在项目根目录运行此脚本"
exit 1
fi
if [ ! -d "cypress" ]; then
log_error "未找到 cypress 目录,请确认这是一个 Cypress 项目"
exit 1
fi
}
# 清理历史报告
cleanup_reports() {
local keep_count=$1
log_info "开始清理历史测试报告,保留最近 $keep_count 次结果..."
local total_cleaned=0
# 清理 cypress/reports 目录中的历史报告
if [ -d "$REPORTS_DIR" ]; then
log_info "清理 $REPORTS_DIR 目录..."
# 清理 HTML 报告文件(按时间戳排序)
local html_files=($REPORTS_DIR/mochawesome_*.html)
if [ ${#html_files[@]} -gt 0 ] && [ -f "${html_files[0]}" ]; then
log_info "发现 ${#html_files[@]} 个 HTML 报告文件"
# 按文件修改时间排序,删除旧文件
local files_to_delete=$(printf '%s\n' "${html_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)))
if [ -n "$files_to_delete" ]; then
echo "$files_to_delete" | while read file; do
log_info "删除旧 HTML 报告: $(basename "$file")"
rm -f "$file"
((total_cleaned++))
done
else
log_info "HTML 报告文件数量未超过保留限制"
fi
else
log_info "未找到 HTML 报告文件"
fi
# 清理 JSON 报告文件
local json_files=($REPORTS_DIR/mochawesome_*.json)
if [ ${#json_files[@]} -gt 0 ] && [ -f "${json_files[0]}" ]; then
log_info "发现 ${#json_files[@]} 个 JSON 报告文件"
local files_to_delete=$(printf '%s\n' "${json_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)))
if [ -n "$files_to_delete" ]; then
echo "$files_to_delete" | while read file; do
log_info "删除旧 JSON 报告: $(basename "$file")"
rm -f "$file"
((total_cleaned++))
done
else
log_info "JSON 报告文件数量未超过保留限制"
fi
else
log_info "未找到 JSON 报告文件"
fi
else
log_warning "$REPORTS_DIR 目录不存在"
fi
# 清理测试视频
if [ -d "cypress/videos" ]; then
log_info "清理测试视频..."
local video_files=(cypress/videos/*.mp4)
if [ ${#video_files[@]} -gt 0 ] && [ -f "${video_files[0]}" ]; then
log_info "发现 ${#video_files[@]} 个视频文件"
local files_to_delete=$(printf '%s\n' "${video_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)))
if [ -n "$files_to_delete" ]; then
echo "$files_to_delete" | while read file; do
log_info "删除旧视频: $(basename "$file")"
rm -f "$file"
((total_cleaned++))
done
else
log_info "视频文件数量未超过保留限制"
fi
else
log_info "未找到视频文件"
fi
else
log_info "未找到 cypress/videos 目录"
fi
# 清理截图目录(按目录修改时间)
if [ -d "cypress/screenshots" ]; then
log_info "清理失败截图..."
# 获取所有截图子目录
local screenshot_dirs=(cypress/screenshots/*/)
if [ ${#screenshot_dirs[@]} -gt 0 ] && [ -d "${screenshot_dirs[0]}" ]; then
log_info "发现 ${#screenshot_dirs[@]} 个截图目录"
local dirs_to_delete=$(printf '%s\n' "${screenshot_dirs[@]}" | xargs ls -td | tail -n +$((keep_count + 1)))
if [ -n "$dirs_to_delete" ]; then
echo "$dirs_to_delete" | while read dir; do
log_info "删除旧截图目录: $(basename "$dir")"
rm -rf "$dir"
((total_cleaned++))
done
else
log_info "截图目录数量未超过保留限制"
fi
else
log_info "未找到截图子目录"
fi
else
log_info "未找到 cypress/screenshots 目录"
fi
# 可选:清理 public/reports 目录
if [ -d "public/reports" ]; then
log_info "清理合并报告..."
local old_reports=$(find public/reports -name "*.html" -o -name "*.json" | wc -l)
if [ "$old_reports" -gt 0 ]; then
log_warning "发现 $old_reports 个合并报告文件"
read -p "是否清理 public/reports 目录中的文件? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -f public/reports/*.html public/reports/*.json
log_info "已清理 public/reports 目录"
((total_cleaned += old_reports))
else
log_info "跳过 public/reports 目录清理"
fi
else
log_info "public/reports 目录为空"
fi
fi
log_success "清理完成,共清理了约 $total_cleaned 个文件/目录"
}
# 显示当前状态
show_status() {
log_info "当前测试文件状态:"
echo
echo "📊 报告文件:"
if [ -d "$REPORTS_DIR" ]; then
local html_count=$(find $REPORTS_DIR -name "mochawesome_*.html" 2>/dev/null | wc -l)
local json_count=$(find $REPORTS_DIR -name "mochawesome_*.json" 2>/dev/null | wc -l)
echo " HTML 报告: $html_count 个"
echo " JSON 报告: $json_count 个"
else
echo " 报告目录不存在"
fi
echo
echo "🎥 视频文件:"
if [ -d "cypress/videos" ]; then
local video_count=$(find cypress/videos -name "*.mp4" 2>/dev/null | wc -l)
echo " 测试视频: $video_count 个"
else
echo " 视频目录不存在"
fi
echo
echo "📸 截图文件:"
if [ -d "cypress/screenshots" ]; then
local screenshot_dirs=$(find cypress/screenshots -maxdepth 1 -type d 2>/dev/null | grep -v "^cypress/screenshots$" | wc -l)
echo " 截图目录: $screenshot_dirs 个"
else
echo " 截图目录不存在"
fi
echo
}
# 主函数
main() {
# 处理帮助和状态选项
case ${1:-} in
"help"|"-h"|"--help")
show_usage
exit 0
;;
"status"|"-s"|"--status")
check_environment
show_status
exit 0
;;
esac
local keep_count=${1:-$DEFAULT_KEEP_COUNT}
# 参数验证
if ! [[ "$keep_count" =~ ^[0-9]+$ ]] || [ "$keep_count" -lt 1 ]; then
log_error "保留数量必须是大于0的整数"
show_usage
exit 1
fi
echo "========================================"
echo " DC-TOM 测试报告清理工具"
echo "========================================"
echo
check_environment
log_info "准备清理历史测试文件,保留最近 $keep_count 次测试结果"
# 显示当前状态
show_status
# 确认操作
read -p "确认继续清理? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "操作已取消"
exit 0
fi
# 执行清理
cleanup_reports "$keep_count"
echo
log_success "报告清理完成!"
echo
echo "💡 提示:"
echo " - 运行 '$0 status' 查看当前文件状态"
echo " - 运行 '$0 help' 查看详细使用说明"
}
# 运行主函数
main "$@"
\ No newline at end of file
......@@ -41,10 +41,10 @@ export default defineConfig({
reporter: 'mochawesome',
reporterOptions: {
reportDir: 'cypress/reports',
overwrite: false,
overwrite: false, // 不覆盖旧报告,由 local-ci.sh 自动清理历史文件
html: true,
json: true,
timestamp: 'mmddyyyy_HHMMss',
timestamp: 'mmddyyyy_HHMMss', // 时间戳格式用于文件排序和清理
reportTitle: 'DC-TOM Cypress Tests',
reportPageTitle: 'DC-TOM 测试报告'
}
......
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:7,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:0,&quot;start&quot;:&quot;2025-09-01T02:29:20.862Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:29:26.409Z&quot;,&quot;duration&quot;:5547,&quot;testsRegistered&quot;:7,&quot;passPercent&quot;:100,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;04108623-1b63-4dd0-8643-fc32b1bd18cb&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;title&quot;:&quot;登录功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示登录页面的所有元素&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该显示登录页面的所有元素&quot;,&quot;duration&quot;:361,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查登录页面基本元素\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-remember-checkbox\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查验证码相关元素(如果存在)\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;baae059d-31aa-4223-a025-a3b8ef200a52&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证必填字段&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证必填字段&quot;,&quot;duration&quot;:193,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击登录按钮而不填写任何信息\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 检查错误提示(这里需要根据实际的错误提示元素调整)\n// 由于Element Plus的验证提示可能不在DOM中持久存在,我们可以检查表单是否仍然可见\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5c98ef5e-8385-46aa-81f0-36078e1c37ca&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换密码可见性&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够切换密码可见性&quot;,&quot;duration&quot;:377,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 尝试多种可能的选择器来找到密码切换图标\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).then($input =&gt; {\n // 方法1: 直接查找后缀区域内的图标\n let toggleIcon = $input.find(&#x27;.el-input__suffix .el-input__icon&#x27;);\n // 方法2: 如果方法1失败,查找任何包含icon的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;[class*=\&quot;icon\&quot;]&#x27;);\n }\n // 方法3: 如果方法2失败,查找任何可点击的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;.el-input__suffix *&#x27;);\n }\n if (toggleIcon.length &gt; 0) {\n cy.wrap(toggleIcon).first().click();\n // 验证密码是否变为可见\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;] input&#x27;).should(&#x27;have.attr&#x27;, &#x27;type&#x27;, &#x27;text&#x27;);\n } else {\n // 如果所有方法都失败,记录日志但不失败测试\n cy.log(&#x27;无法找到密码切换图标,可能是Element Plus版本或配置问题&#x27;);\n // 验证输入框仍然存在\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;cc60930d-df39-4827-8478-27dd62aeda7d&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够刷新验证码&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够刷新验证码&quot;,&quot;duration&quot;:79,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果验证码图片存在,测试点击刷新\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n // 点击验证码图片刷新\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).click();\n // 验证图片src发生变化(这里需要更复杂的逻辑来验证)\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e5db9970-6b12-4d96-a1f3-0644a86241ca&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理登录表单提交&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该处理登录表单提交&quot;,&quot;duration&quot;:673,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 填写登录信息\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;testuser&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 如果有验证码输入框,填写验证码\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;1234&#x27;);\n }\n});\n// 提交表单\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 验证是否有加载状态或者跳转(这里需要根据实际情况调整)\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;30f49177-f347-4f9b-a80e-8d93388ffa87&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证响应式设计&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证响应式设计&quot;,&quot;duration&quot;:1592,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;741e7628-be75-418c-a626-c7c2dd847685&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理路由跳转到登录页&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该正确处理路由跳转到登录页&quot;,&quot;duration&quot;:2146,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 尝试直接访问需要权限的页面,应该被重定向到登录页\n// 模拟登录状态\ncy.mockLogin();\n// 等待1秒\ncy.wait(2000);\n// 访问仪表板\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/dashboard&#x27;);\n// 验证登录页面元素存在\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1a064f89-111e-46ac-9fd8-c99e6ddfac6c&quot;,&quot;parentUUID&quot;:&quot;ce269ca4-c51b-46ce-83e6-e639db8717d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;baae059d-31aa-4223-a025-a3b8ef200a52&quot;,&quot;5c98ef5e-8385-46aa-81f0-36078e1c37ca&quot;,&quot;cc60930d-df39-4827-8478-27dd62aeda7d&quot;,&quot;e5db9970-6b12-4d96-a1f3-0644a86241ca&quot;,&quot;30f49177-f347-4f9b-a80e-8d93388ffa87&quot;,&quot;741e7628-be75-418c-a626-c7c2dd847685&quot;,&quot;1a064f89-111e-46ac-9fd8-c99e6ddfac6c&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:5421,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_102926.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_102926.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:7,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:0,&quot;start&quot;:&quot;2025-09-01T02:33:38.917Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:33:44.399Z&quot;,&quot;duration&quot;:5482,&quot;testsRegistered&quot;:7,&quot;passPercent&quot;:100,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;fbda53bd-25d8-4dff-b32a-e2d4ecbb5c7a&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;title&quot;:&quot;登录功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示登录页面的所有元素&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该显示登录页面的所有元素&quot;,&quot;duration&quot;:341,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查登录页面基本元素\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-remember-checkbox\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查验证码相关元素(如果存在)\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;cb1af9a7-ceef-42fe-8d80-7145e4c92373&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证必填字段&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证必填字段&quot;,&quot;duration&quot;:193,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击登录按钮而不填写任何信息\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 检查错误提示(这里需要根据实际的错误提示元素调整)\n// 由于Element Plus的验证提示可能不在DOM中持久存在,我们可以检查表单是否仍然可见\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6b34066c-a739-486a-a49e-d7232bc01590&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换密码可见性&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够切换密码可见性&quot;,&quot;duration&quot;:369,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 尝试多种可能的选择器来找到密码切换图标\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).then($input =&gt; {\n // 方法1: 直接查找后缀区域内的图标\n let toggleIcon = $input.find(&#x27;.el-input__suffix .el-input__icon&#x27;);\n // 方法2: 如果方法1失败,查找任何包含icon的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;[class*=\&quot;icon\&quot;]&#x27;);\n }\n // 方法3: 如果方法2失败,查找任何可点击的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;.el-input__suffix *&#x27;);\n }\n if (toggleIcon.length &gt; 0) {\n cy.wrap(toggleIcon).first().click();\n // 验证密码是否变为可见\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;] input&#x27;).should(&#x27;have.attr&#x27;, &#x27;type&#x27;, &#x27;text&#x27;);\n } else {\n // 如果所有方法都失败,记录日志但不失败测试\n cy.log(&#x27;无法找到密码切换图标,可能是Element Plus版本或配置问题&#x27;);\n // 验证输入框仍然存在\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b58bc070-82d0-4e53-9b98-00657638c648&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够刷新验证码&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够刷新验证码&quot;,&quot;duration&quot;:77,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果验证码图片存在,测试点击刷新\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n // 点击验证码图片刷新\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).click();\n // 验证图片src发生变化(这里需要更复杂的逻辑来验证)\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6e00baae-61c7-449d-a2d2-1ce1fbcebd23&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理登录表单提交&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该处理登录表单提交&quot;,&quot;duration&quot;:648,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 填写登录信息\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;testuser&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 如果有验证码输入框,填写验证码\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;1234&#x27;);\n }\n});\n// 提交表单\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 验证是否有加载状态或者跳转(这里需要根据实际情况调整)\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2c2893e5-1f12-4bf6-a1cf-1d450b7478d0&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证响应式设计&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证响应式设计&quot;,&quot;duration&quot;:1590,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d6180eee-d494-47a2-814f-6060755d2785&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理路由跳转到登录页&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该正确处理路由跳转到登录页&quot;,&quot;duration&quot;:2137,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 尝试直接访问需要权限的页面,应该被重定向到登录页\n// 模拟登录状态\ncy.mockLogin();\n// 等待1秒\ncy.wait(2000);\n// 访问仪表板\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/dashboard&#x27;);\n// 验证登录页面元素存在\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;233a617c-6c5f-4884-ba3c-76412d915992&quot;,&quot;parentUUID&quot;:&quot;33b13c76-4112-419a-889e-09257e5b9d26&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;cb1af9a7-ceef-42fe-8d80-7145e4c92373&quot;,&quot;6b34066c-a739-486a-a49e-d7232bc01590&quot;,&quot;b58bc070-82d0-4e53-9b98-00657638c648&quot;,&quot;6e00baae-61c7-449d-a2d2-1ce1fbcebd23&quot;,&quot;2c2893e5-1f12-4bf6-a1cf-1d450b7478d0&quot;,&quot;d6180eee-d494-47a2-814f-6060755d2785&quot;,&quot;233a617c-6c5f-4884-ba3c-76412d915992&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:5355,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103344.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103344.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T02:33:46.189Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:34:49.373Z&quot;,&quot;duration&quot;:63184,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;0050d738-ff41-4c16-8bf5-72acad4a3116&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1292,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1eba12f2-94ee-4c13-b72e-e9d4f399b234&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1133,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0ccd6dfd-65c2-4691-963e-785f3b2c3cef&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1113,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;70b6a00c-e007-4262-a3ea-c3fa150f981d&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1128,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5098915b-be28-409c-9ee9-1ac161635ba0&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3142,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;31a172a0-d8c9-4275-9e2e-bfdce77c7d47&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1140,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a4b036d2-571a-4a82-9543-34795c927a9c&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2623,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e3f7f54d-1cdd-461e-b4d0-0f406af97753&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1108,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7f7af922-0716-47b5-9168-e1c92474d70b&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1687,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6814026e-7481-4d4c-a73c-0ec3d695cc87&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16223,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;4493897b-91e9-4ab0-9a99-4ed7ca525db3&quot;,&quot;parentUUID&quot;:&quot;550b7276-38ad-4f38-bf1c-3a2eb9a558cc&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;1eba12f2-94ee-4c13-b72e-e9d4f399b234&quot;,&quot;0ccd6dfd-65c2-4691-963e-785f3b2c3cef&quot;,&quot;70b6a00c-e007-4262-a3ea-c3fa150f981d&quot;,&quot;5098915b-be28-409c-9ee9-1ac161635ba0&quot;,&quot;31a172a0-d8c9-4275-9e2e-bfdce77c7d47&quot;,&quot;a4b036d2-571a-4a82-9543-34795c927a9c&quot;,&quot;e3f7f54d-1cdd-461e-b4d0-0f406af97753&quot;,&quot;7f7af922-0716-47b5-9168-e1c92474d70b&quot;,&quot;6814026e-7481-4d4c-a73c-0ec3d695cc87&quot;],&quot;failures&quot;:[&quot;4493897b-91e9-4ab0-9a99-4ed7ca525db3&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:30589,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103449.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103449.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:11,&quot;passes&quot;:8,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T02:34:51.166Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:36:29.585Z&quot;,&quot;duration&quot;:98419,&quot;testsRegistered&quot;:11,&quot;passPercent&quot;:72.72727272727273,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;4cbeff2c-5ab1-4f38-8c32-4c8091a4b8c1&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;title&quot;:&quot;导航菜单功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示侧边栏菜单&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示侧边栏菜单&quot;,&quot;duration&quot;:329,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单容器\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查菜单是否有菜单项\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;] .el-menu-item, [data-testid=\&quot;sidebar-menu\&quot;] .el-sub-menu&#x27;).should(&#x27;have.length.gt&#x27;, 0);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e7511828-8d5e-409b-bb45-9583e09d2f7d&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击菜单项进行导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该能够点击菜单项进行导航&quot;,&quot;duration&quot;:1233,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 获取所有菜单项\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).then($items =&gt; {\n if ($items.length &gt; 0) {\n // 点击第一个菜单项\n const firstItemTestId = $items[0].getAttribute(&#x27;data-testid&#x27;);\n cy.get(`[data-testid=\&quot;${firstItemTestId}\&quot;]`).click();\n // 验证页面跳转\n cy.wait(1000);\n cy.url().should(&#x27;not.be.empty&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;48b67908-19c2-4982-922c-f753363a840f&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持子菜单展开和收起&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持子菜单展开和收起&quot;,&quot;duration&quot;:289,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 查找子菜单\ncy.get(&#x27;[data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).then($submenus =&gt; {\n if ($submenus.length &gt; 0) {\n const firstSubmenuTestId = $submenus[0].getAttribute(&#x27;data-testid&#x27;);\n // 点击子菜单标题展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-opened&#x27;);\n // 再次点击收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;not.have.class&#x27;, &#x27;is-opened&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;767c3f74-11a4-48fc-97d9-8f65b6b7cb21&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该高亮当前激活的菜单项&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该高亮当前激活的菜单项&quot;,&quot;duration&quot;:112,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查当前URL对应的菜单项是否被激活\ncy.url().then(currentUrl =&gt; {\n const path = new URL(currentUrl).pathname.replace(&#x27;/&#x27;, &#x27;&#x27;);\n if (path) {\n // 查找对应的菜单项\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n // 验证菜单项有活跃状态\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3403072a-a3c9-4b30-9c7b-eaa62902f0e6&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示菜单图标&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示菜单图标&quot;,&quot;duration&quot;:140,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单项是否有图标\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;] .menu-icon, [data-testid^=\&quot;menu-submenu-\&quot;] .menu-icon&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n// 验证图标是否正常显示\ncy.get(&#x27;.menu-icon&#x27;).each($icon =&gt; {\n cy.wrap($icon).should(&#x27;be.visible&#x27;);\n cy.wrap($icon).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;dc5dcf43-2a3f-472a-9ec0-1b9e58254865&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持菜单收起状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持菜单收起状态&quot;,&quot;duration&quot;:114,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果有收起按钮,测试收起功能\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n // 查找可能的收起按钮(这里需要根据实际实现调整)\n if ($body.find(&#x27;.hamburger, .menu-toggle&#x27;).length &gt; 0) {\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n // 验证菜单收起状态\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n // 再次点击展开\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;not.have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;bea6f294-fb6e-4c52-876d-ad3ddc61bc78&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持键盘导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持键盘导航&quot;,&quot;duration&quot;:215,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用Tab键在菜单项之间导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).focus();\n// 使用方向键导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{downarrow}&#x27;);\ncy.wait(500);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{uparrow}&#x27;);\n// 使用Enter键选择\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{enter}&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-194920f7=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus&quot;,&quot;estack&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-194920f7=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus\n at Context.focus (http://localhost:3000/__cypress/runner/cypress_runner.js:113422:70)\n at wrapped (http://localhost:3000/__cypress/runner/cypress_runner.js:138092:19)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:103:43)&quot;},&quot;uuid&quot;:&quot;0cb1dea3-475a-4bf6-b233-06f7e6cc3ab6&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在不同页面显示正确的菜单状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在不同页面显示正确的菜单状态&quot;,&quot;duration&quot;:16422,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 导航到不同页面并验证菜单状态\nconst testPages = [&#x27;dashboard&#x27;, &#x27;dust-overview&#x27;];\ntestPages.forEach(page =&gt; {\n cy.visit(`/${page}`);\n cy.waitForPageLoad();\n // 验证菜单仍然可见\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证对应的菜单项被激活\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:128:54)&quot;},&quot;uuid&quot;:&quot;fb2b627a-1572-469c-8a5a-ac341efbc6ca&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单权限控制&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单权限控制&quot;,&quot;duration&quot;:15227,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证菜单项是否根据权限显示\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;], [data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).each($item =&gt; {\n // 验证菜单项是可见的(说明用户有权限访问)\n cy.wrap($item).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:138:21)&quot;},&quot;uuid&quot;:&quot;db96b91e-da59-4fb6-b800-e4007fa228c0&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在移动端正确显示&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在移动端正确显示&quot;,&quot;duration&quot;:168,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试移动端菜单\ncy.viewport(375, 667); // iPhone尺寸\n// 菜单应该仍然可见或者有移动端适配\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;exist&#x27;);\n// 恢复桌面端\ncy.viewport(1280, 720);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2e4f8b53-8c41-46b4-a7c8-735b1b6b0b37&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单项的hover状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单项的hover状态&quot;,&quot;duration&quot;:161,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试菜单项的鼠标悬停效果\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).first().then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.wrap($item).trigger(&#x27;mouseover&#x27;);\n // 验证hover状态(这里需要根据实际CSS类名调整)\n cy.wrap($item).should(&#x27;have.css&#x27;, &#x27;background-color&#x27;);\n cy.wrap($item).trigger(&#x27;mouseout&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d658da4b-7070-4749-a5d5-46e51bd07fab&quot;,&quot;parentUUID&quot;:&quot;e9f2d0b3-84dd-4eaf-b69b-5b1033d3201f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;e7511828-8d5e-409b-bb45-9583e09d2f7d&quot;,&quot;48b67908-19c2-4982-922c-f753363a840f&quot;,&quot;767c3f74-11a4-48fc-97d9-8f65b6b7cb21&quot;,&quot;3403072a-a3c9-4b30-9c7b-eaa62902f0e6&quot;,&quot;dc5dcf43-2a3f-472a-9ec0-1b9e58254865&quot;,&quot;bea6f294-fb6e-4c52-876d-ad3ddc61bc78&quot;,&quot;2e4f8b53-8c41-46b4-a7c8-735b1b6b0b37&quot;,&quot;d658da4b-7070-4749-a5d5-46e51bd07fab&quot;],&quot;failures&quot;:[&quot;0cb1dea3-475a-4bf6-b233-06f7e6cc3ab6&quot;,&quot;fb2b627a-1572-469c-8a5a-ac341efbc6ca&quot;,&quot;db96b91e-da59-4fb6-b800-e4007fa228c0&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:34410,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103629.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103629.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:20,&quot;passes&quot;:18,&quot;pending&quot;:0,&quot;failures&quot;:2,&quot;start&quot;:&quot;2025-09-01T02:36:39.279Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:38:52.496Z&quot;,&quot;duration&quot;:133217,&quot;testsRegistered&quot;:20,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;fcf0a6bd-ef43-4279-89f8-90c523c0f837&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;title&quot;:&quot;告警总览功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示告警总览页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警总览页面的所有核心组件&quot;,&quot;duration&quot;:1328,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;.content-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.demo-form-inline&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格区域\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;951145a2-b0d7-44eb-9eff-2a80600b5569&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示所有搜索条件输入框&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示所有搜索条件输入框&quot;,&quot;duration&quot;:1139,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查事件名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查发生位置输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查设备类型选择框\ncy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n// 检查告警时间选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1837e6aa-d515-43e4-815d-2a80209ea415&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够输入搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够输入搜索条件&quot;,&quot;duration&quot;:1893,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入事件名称\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试事件&#x27;);\n// 输入发生位置\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试位置&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试除尘器&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;94043e45-bf61-455f-b7cd-2c783d420cb0&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择设备类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择设备类型&quot;,&quot;duration&quot;:1298,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击设备类型选择框 - 使用更精确的选择器\ncy.get(&#x27;.el-form-item:contains(\&quot;设备类型\&quot;) .el-select&#x27;).first().click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有选项,选择第一个\ncy.get(&#x27;.el-select-dropdown&#x27;).then($dropdown =&gt; {\n if ($dropdown.find(&#x27;.el-select-dropdown__item&#x27;).length &gt; 0) {\n cy.get(&#x27;.el-select-dropdown__item&#x27;).first().click();\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;aaf61c86-35da-4d90-aa18-208e3781c191&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置告警时间范围&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够设置告警时间范围&quot;,&quot;duration&quot;:16567,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击时间选择器 - 使用更通用的选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).first().click();\n// 等待日期面板出现\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).first().click();\n// 选择结束日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).eq(5).click();\n// 点击确定按钮\ncy.get(&#x27;.el-picker-panel__footer .el-button--primary&#x27;).click();\n// 验证时间选择器有值\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;not.have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:93:7)&quot;},&quot;uuid&quot;:&quot;ec3914cb-2544-4c2d-965d-b7ba724ca5fc&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:1709,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\n// 点击重置按钮\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b585d1ff-c707-407b-9a31-be567a3f7511&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够执行搜索查询&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够执行搜索查询&quot;,&quot;duration&quot;:2499,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\n// 点击查询按钮\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;c1396881-b337-49b3-9c7f-f61f6ad11ba5&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示挂起设备按钮&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示挂起设备按钮&quot;,&quot;duration&quot;:1162,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查挂起设备按钮\ncy.get(&#x27;button&#x27;).contains(&#x27;挂起设备&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e1cd3a82-3297-4eda-a6a1-392c4213234d&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择告警类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择告警类型&quot;,&quot;duration&quot;:1411,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查单选按钮组\ncy.get(&#x27;.el-radio-group&#x27;).should(&#x27;be.visible&#x27;);\n// 检查各个选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).should(&#x27;be.visible&#x27;);\n// 选择不同的选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).click();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;fe79650b-b88d-44e2-8bf5-344e64546546&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警数据表格&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警数据表格&quot;,&quot;duration&quot;:1139,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格容器\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格组件\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a314246b-a04a-4103-8e6a-4d2beedee3da&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格分页组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格分页组件&quot;,&quot;duration&quot;:1118,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查分页组件\ncy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页信息\ncy.get(&#x27;.el-pagination__total&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7d5206e0-d1db-43d6-9935-9a76dc192aff&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行分页操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够进行分页操作&quot;,&quot;duration&quot;:17228,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面加载完成\ncy.wait(1000);\n// 检查是否有分页组件,如果有则进行分页操作测试\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;.el-pagination&#x27;).length &gt; 0) {\n // 检查分页按钮\n cy.get(&#x27;.el-pagination__prev&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-pagination__next&#x27;).should(&#x27;be.visible&#x27;);\n // 检查页码按钮\n cy.get(&#x27;.el-pager&#x27;).should(&#x27;be.visible&#x27;);\n } else {\n // 如果没有分页组件,记录日志并继续\n cy.log(&#x27;没有分页组件,数据量可能较少&#x27;);\n // 验证页面仍然正常显示\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:173:39)&quot;},&quot;uuid&quot;:&quot;078dc7f5-087c-4ec3-ae1d-f4011a46d214&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格操作列&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格操作列&quot;,&quot;duration&quot;:1163,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查操作列\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().should(&#x27;contain&#x27;, &#x27;暂挂起&#x27;);\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;bf6c50cb-db61-4099-97e6-842cdf077296&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击暂挂起操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够点击暂挂起操作&quot;,&quot;duration&quot;:1243,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 点击暂挂起按钮\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().contains(&#x27;暂挂起&#x27;).click();\n });\n // 这里可以添加点击后的验证逻辑\n // 比如检查是否有弹窗、确认对话框等\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;9031a08f-5275-40a6-9295-f7101c16f4a7&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警级别标识&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警级别标识&quot;,&quot;duration&quot;:2177,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查表格行是否有内容\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n // 检查是否有任何内容,不特定检查&#x27;level&#x27;\n cy.get(&#x27;td&#x27;).should(&#x27;have.length.greaterThan&#x27;, 0);\n });\n } else {\n // 如果没有数据行,记录日志\n cy.log(&#x27;表格中没有数据行&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b2d963c7-dfc8-4ab9-bde8-2b99461d9a52&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理表格数据加载&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理表格数据加载&quot;,&quot;duration&quot;:2151,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 验证表格有内容\ncy.get(&#x27;.el-table__body&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;989654b4-bfc7-4d8f-a28e-643f7de88ac8&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应搜索条件变化&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该响应搜索条件变化&quot;,&quot;duration&quot;:3640,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件并查询\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 清空搜索条件并查询\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a62a0a96-7f91-4995-997e-f559f89f1f80&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该检查响应式设计&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该检查响应式设计&quot;,&quot;duration&quot;:2668,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查不同屏幕尺寸下的显示\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n} // 平板\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件仍然可见\n cy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;096db423-3546-4a59-8992-50fccbe49c2c&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:2516,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;不存在的告警事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0381fca9-2fe2-45ee-8964-60ce8035f859&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:1168,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部行\ncy.get(&#x27;.el-table__header tr&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部单元格\ncy.get(&#x27;.el-table__header th&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d60375ac-7457-47b9-b945-8d75696f3f1a&quot;,&quot;parentUUID&quot;:&quot;c409fdbb-c086-4592-8f2e-203142330ea5&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;951145a2-b0d7-44eb-9eff-2a80600b5569&quot;,&quot;1837e6aa-d515-43e4-815d-2a80209ea415&quot;,&quot;94043e45-bf61-455f-b7cd-2c783d420cb0&quot;,&quot;aaf61c86-35da-4d90-aa18-208e3781c191&quot;,&quot;b585d1ff-c707-407b-9a31-be567a3f7511&quot;,&quot;c1396881-b337-49b3-9c7f-f61f6ad11ba5&quot;,&quot;e1cd3a82-3297-4eda-a6a1-392c4213234d&quot;,&quot;fe79650b-b88d-44e2-8bf5-344e64546546&quot;,&quot;a314246b-a04a-4103-8e6a-4d2beedee3da&quot;,&quot;7d5206e0-d1db-43d6-9935-9a76dc192aff&quot;,&quot;bf6c50cb-db61-4099-97e6-842cdf077296&quot;,&quot;9031a08f-5275-40a6-9295-f7101c16f4a7&quot;,&quot;b2d963c7-dfc8-4ab9-bde8-2b99461d9a52&quot;,&quot;989654b4-bfc7-4d8f-a28e-643f7de88ac8&quot;,&quot;a62a0a96-7f91-4995-997e-f559f89f1f80&quot;,&quot;096db423-3546-4a59-8992-50fccbe49c2c&quot;,&quot;0381fca9-2fe2-45ee-8964-60ce8035f859&quot;,&quot;d60375ac-7457-47b9-b945-8d75696f3f1a&quot;],&quot;failures&quot;:[&quot;ec3914cb-2544-4c2d-965d-b7ba724ca5fc&quot;,&quot;078dc7f5-087c-4ec3-ae1d-f4011a46d214&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:65217,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103852.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_103852.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:13,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:12,&quot;start&quot;:&quot;2025-09-01T02:38:54.362Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:41:25.659Z&quot;,&quot;duration&quot;:151297,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:7.6923076923076925,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;897e6234-76a9-4389-a50c-473ec9777867&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;title&quot;:&quot;布袋周期管理高级功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确加载和显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该正确加载和显示表格数据&quot;,&quot;duration&quot;:2215,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待API请求完成\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证表格数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行数量\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 3);\n // 验证第一行数据\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n cy.get(&#x27;td&#x27;).eq(3).should(&#x27;contain&#x27;, &#x27;1排/1列&#x27;);\n cy.get(&#x27;td&#x27;).eq(4).should(&#x27;contain&#x27;, &#x27;2024-02-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(5).should(&#x27;contain&#x27;, &#x27;2024-01-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(6).should(&#x27;contain&#x27;, &#x27;张三&#x27;);\n cy.get(&#x27;td&#x27;).eq(7).should(&#x27;contain&#x27;, &#x27;30天&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:52:7)&quot;},&quot;uuid&quot;:&quot;b293e3e5-6547-4230-8359-37aec7019bf6&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行精确搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够进行精确搜索&quot;,&quot;duration&quot;:2232,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 1,\n dusterName: &#x27;1#除尘器&#x27;,\n compart: &#x27;A仓室&#x27;,\n bagLocation: &#x27;1排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-15 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-15 10:00:00&#x27;,\n bagChangeAuthor: &#x27;张三&#x27;,\n bagChangePeriod: &#x27;30天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;searchCollectorList&#x27;);\n// 输入搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;A仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;1#除尘器&#x27;);\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@searchCollectorList&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:74:7)&quot;},&quot;uuid&quot;:&quot;80bf71be-7de4-4826-bb00-8b7d32ec6fdc&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理分页功能&quot;,&quot;duration&quot;:2230,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟第二页数据\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*pageNo=2*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 4,\n dusterName: &#x27;4#除尘器&#x27;,\n compart: &#x27;D仓室&#x27;,\n bagLocation: &#x27;2排/2列&#x27;,\n bagChangeNextTime: &#x27;2024-03-01 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-02-01 10:00:00&#x27;,\n bagChangeAuthor: &#x27;赵六&#x27;,\n bagChangePeriod: &#x27;28天&#x27;\n }],\n total: 4,\n pageNo: 2,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;getPage2Data&#x27;);\n// 点击下一页\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-pagination .btn-next&#x27;).click();\n});\n// 等待第二页数据加载\ncy.wait(&#x27;@getPage2Data&#x27;);\n// 验证第二页数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;4#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;D仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:124:7)&quot;},&quot;uuid&quot;:&quot;72bc0389-c6a1-4f0f-ad35-8a43a193574e&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开并操作分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够打开并操作分析对话框&quot;,&quot;duration&quot;:2223,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\ncy.wait(&#x27;@getDusterList&#x27;);\ncy.wait(&#x27;@getAnalysisData&#x27;);\n// 双击除尘器名称打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 测试除尘器切换\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).eq(1).click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);\n// 关闭对话框\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:172:7)&quot;},&quot;uuid&quot;:&quot;08426c9c-a791-4d95-8a6c-70678f66f37b&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理日期范围搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理日期范围搜索&quot;,&quot;duration&quot;:2215,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟日期搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 2,\n dusterName: &#x27;2#除尘器&#x27;,\n compart: &#x27;B仓室&#x27;,\n bagLocation: &#x27;2排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-20 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-20 10:00:00&#x27;,\n bagChangeAuthor: &#x27;李四&#x27;,\n bagChangePeriod: &#x27;25天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;dateSearchResult&#x27;);\n// 设置日期范围\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择日期范围(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(5).click();\n});\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@dateSearchResult&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:208:7)&quot;},&quot;uuid&quot;:&quot;d9d2f123-d735-4c66-8e44-654c0f9e3745&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理空搜索结果&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理空搜索结果&quot;,&quot;duration&quot;:2214,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟空搜索结果\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [],\n total: 0,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;emptySearchResult&#x27;);\n// 输入不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@emptySearchResult&#x27;);\n// 验证空数据状态\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有空数据提示或空表格\n cy.get(&#x27;.el-table__body&#x27;).should(&#x27;exist&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:262:7)&quot;},&quot;uuid&quot;:&quot;5da487bc-0470-4248-916e-84ea471c2a38&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理API错误&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理API错误&quot;,&quot;duration&quot;:17299,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟API错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;\n }\n}).as(&#x27;apiError&#x27;);\n// 刷新页面或触发搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@apiError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:308:7)&quot;},&quot;uuid&quot;:&quot;e496b71c-2286-43cc-aede-3e4f5ad12054&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格排序功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格排序功能&quot;,&quot;duration&quot;:2196,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查表格列头是否可点击(排序功能)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查除尘器名称列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;除尘器名称&#x27;).should(&#x27;be.visible&#x27;);\n // 检查仓室列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;仓室&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:317:7)&quot;},&quot;uuid&quot;:&quot;ddc1bd92-201a-4871-b088-87e6ac13e139&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的完整性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格数据的完整性&quot;,&quot;duration&quot;:2227,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证所有必需的列都存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n const expectedColumns = [&#x27;序号&#x27;, &#x27;除尘器名称&#x27;, &#x27;仓室&#x27;, &#x27;布袋位置(排/列)&#x27;, &#x27;布袋更换提醒时间&#x27;, &#x27;更换时间&#x27;, &#x27;更换人&#x27;, &#x27;更换周期(与上次更换比)&#x27;];\n expectedColumns.forEach(columnName =&gt; {\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, columnName);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:331:7)&quot;},&quot;uuid&quot;:&quot;4c33a162-9549-4ed3-a490-50bd77b9e8d1&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证除尘器名称链接的交互性&quot;,&quot;duration&quot;:2218,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证除尘器名称链接的样式和交互\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);\n// 验证链接可以点击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.css&#x27;, &#x27;cursor&#x27;, &#x27;pointer&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:354:7)&quot;},&quot;uuid&quot;:&quot;7cc4c74a-8cc8-47b7-bea7-35ad00ab5a9e&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面性能指标&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证页面性能指标&quot;,&quot;duration&quot;:2223,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面完全加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查页面性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证DOM内容加载时间\n expect(navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart).to.be.lessThan(3000);\n // 验证页面完全加载时间\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:366:7)&quot;},&quot;uuid&quot;:&quot;59bc9899-2e84-4734-8f67-a955d71b657c&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的验证功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证搜索表单的验证功能&quot;,&quot;duration&quot;:25414,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;slow&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的最大长度限制\nconst longText = &#x27;a&#x27;.repeat(1000);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\n// 清除输入\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7ff127de-92bb-464b-9101-46ea887e6341&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格的响应式布局&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格的响应式布局&quot;,&quot;duration&quot;:2224,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 测试不同屏幕尺寸下的表格显示\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 768,\n height: 1024\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证表格在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证表格内容可以滚动(如果需要)\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:398:7)&quot;},&quot;uuid&quot;:&quot;4b022564-27ce-4dde-9219-ab7a5a2fd8fd&quot;,&quot;parentUUID&quot;:&quot;32261b62-a4b7-43fc-bb9b-06b5d015a519&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;7ff127de-92bb-464b-9101-46ea887e6341&quot;],&quot;failures&quot;:[&quot;b293e3e5-6547-4230-8359-37aec7019bf6&quot;,&quot;80bf71be-7de4-4826-bb00-8b7d32ec6fdc&quot;,&quot;72bc0389-c6a1-4f0f-ad35-8a43a193574e&quot;,&quot;08426c9c-a791-4d95-8a6c-70678f66f37b&quot;,&quot;d9d2f123-d735-4c66-8e44-654c0f9e3745&quot;,&quot;5da487bc-0470-4248-916e-84ea471c2a38&quot;,&quot;e496b71c-2286-43cc-aede-3e4f5ad12054&quot;,&quot;ddc1bd92-201a-4871-b088-87e6ac13e139&quot;,&quot;4c33a162-9549-4ed3-a490-50bd77b9e8d1&quot;,&quot;7cc4c74a-8cc8-47b7-bea7-35ad00ab5a9e&quot;,&quot;59bc9899-2e84-4734-8f67-a955d71b657c&quot;,&quot;4b022564-27ce-4dde-9219-ab7a5a2fd8fd&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:67130,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104125.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104125.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T02:41:27.451Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:43:51.851Z&quot;,&quot;duration&quot;:144400,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:70,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;d31e7423-9030-4d9f-be36-683ee7733ae8&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;title&quot;:&quot;布袋周期管理简化测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确显示页面组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该正确显示页面组件&quot;,&quot;duration&quot;:364,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面组件\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6cf40b37-d25e-4481-94b4-5eab052759fa&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证搜索表单字段&quot;,&quot;duration&quot;:15265,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证搜索表单字段\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-simple.cy.js:24:52)&quot;},&quot;uuid&quot;:&quot;b93a31b7-f160-4847-8bdf-a4ccacaea73e&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1801,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令进行搜索\ncy.searchCollectorData(&#x27;测试仓室&#x27;, &#x27;测试除尘器&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;4292144b-0456-4e10-904b-c54e56a35e6b&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:589,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 使用自定义命令重置\ncy.resetCollectorSearch();\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ecbf83c1-94e5-4515-b60a-16d53cf6bae4&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够打开分析对话框&quot;,&quot;duration&quot;:15425,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令打开对话框\ncy.openAnalysisDialog(&#x27;button&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;9bf32eba-56e2-4ed3-b2a7-b6150c71ff57&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过双击除尘器名称打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够通过双击除尘器名称打开对话框&quot;,&quot;duration&quot;:15623,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令通过双击打开对话框\ncy.openAnalysisDialog(&#x27;dblclick&#x27;);\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;a35d158c-b848-4641-a79c-4823a66a14fc&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证表格列标题&quot;,&quot;duration&quot;:191,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令验证表格列标题\ncy.verifyCollectorTableHeaders();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0c16779e-09c0-48b7-9527-1d3a8d75bdf0&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:1666,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用现有的响应式检查命令\ncy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ede68764-e1e6-4c48-be6d-7d98464c72e8&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接样式&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证除尘器名称链接样式&quot;,&quot;duration&quot;:380,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e56ab749-fb13-4889-b74e-54b78b3c8717&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面加载性能&quot;,&quot;duration&quot;:174,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面加载性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8276658f-4c56-40c5-bb36-b6aa2a827f2a&quot;,&quot;parentUUID&quot;:&quot;ba19326e-73ff-4ca6-a6aa-acc6aaa4fb8a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;6cf40b37-d25e-4481-94b4-5eab052759fa&quot;,&quot;4292144b-0456-4e10-904b-c54e56a35e6b&quot;,&quot;ecbf83c1-94e5-4515-b60a-16d53cf6bae4&quot;,&quot;0c16779e-09c0-48b7-9527-1d3a8d75bdf0&quot;,&quot;ede68764-e1e6-4c48-be6d-7d98464c72e8&quot;,&quot;e56ab749-fb13-4889-b74e-54b78b3c8717&quot;,&quot;8276658f-4c56-40c5-bb36-b6aa2a827f2a&quot;],&quot;failures&quot;:[&quot;b93a31b7-f160-4847-8bdf-a4ccacaea73e&quot;,&quot;9bf32eba-56e2-4ed3-b2a7-b6150c71ff57&quot;,&quot;a35d158c-b848-4641-a79c-4823a66a14fc&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:51478,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104351.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104351.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:19,&quot;passes&quot;:14,&quot;pending&quot;:0,&quot;failures&quot;:5,&quot;start&quot;:&quot;2025-09-01T02:43:53.675Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:47:55.778Z&quot;,&quot;duration&quot;:242103,&quot;testsRegistered&quot;:19,&quot;passPercent&quot;:73.68421052631578,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;21935044-2b4c-4739-a2dc-84de3a5e1450&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;title&quot;:&quot;布袋周期管理功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示布袋周期页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示布袋周期页面的所有核心组件&quot;,&quot;duration&quot;:363,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;[data-testid=\&quot;collector-list-content\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格容器\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查通用表格组件\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f814ad29-6278-467d-a8e6-b0c30bfbd2c3&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示搜索表单的所有输入字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示搜索表单的所有输入字段&quot;,&quot;duration&quot;:15281,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查仓室输入框\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入仓室名称&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入除尘器名称&#x27;);\n// 检查日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:44:52)&quot;},&quot;uuid&quot;:&quot;a9d42e47-1f06-4c5e-83a3-362067b007a9&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1834,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入仓室名称\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear().type(&#x27;测试仓室&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\n// 点击查询按钮\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;14b353f9-94e9-49f4-bad6-09bd4c36c4fe&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:608,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 点击重置按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e67e171e-9cc0-4040-bd61-1bfbf673ed86&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置日期范围&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够设置日期范围&quot;,&quot;duration&quot;:15265,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\n// 等待日期选择器弹出\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择今天的日期作为开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择明天的日期作为结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(1).click();\n});\n// 验证日期选择器关闭\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:91:7)&quot;},&quot;uuid&quot;:&quot;05a1c5f6-c7f6-45de-93e1-da6b76f8bcc1&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示表格数据&quot;,&quot;duration&quot;:190,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格是否有数据行\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行是否存在(即使为空数据)\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;26d215f9-2dd8-42a2-834f-66bacd99a4b9&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击除尘器名称打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够点击除尘器名称打开分析对话框&quot;,&quot;duration&quot;:439,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 查找除尘器名称链接并双击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器名称选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5e51f8c2-b93d-4e83-821a-02aa9663d6bd&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过分析按钮打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够通过分析按钮打开对话框&quot;,&quot;duration&quot;:221,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击更换周期分析按钮\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b99ed6f4-8fcb-49c9-a928-4b16ffedf822&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够关闭分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够关闭分析对话框&quot;,&quot;duration&quot;:15417,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击关闭按钮\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\n// 验证对话框关闭\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:160:30)&quot;},&quot;uuid&quot;:&quot;3b706566-c9f8-43eb-844c-707491a7bef7&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换除尘器选择&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够切换除尘器选择&quot;,&quot;duration&quot;:15532,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击除尘器选择器\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 选择第一个选项(如果存在)\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).first().click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-1801-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-1801-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-1801-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-1801-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-1801-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-1801-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isStrictlyVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144971:10)\n at runAllChecks (http://localhost:3000/__cypress/runner/cypress_runner.js:113271:26)\n at retryActionability (http://localhost:3000/__cypress/runner/cypress_runner.js:113339:16)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:175:68)&quot;},&quot;uuid&quot;:&quot;8be13067-73ac-4d64-8377-cd44789c88a9&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格分页功能&quot;,&quot;duration&quot;:188,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页组件是否存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 查找分页组件\n cy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e01611f3-ddb1-4d0f-b0d1-2c5e8fa1c5e9&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:178,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格列标题\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查主要列标题\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;序号&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;除尘器名称&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;仓室&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋位置(排/列)&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋更换提醒时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换人&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期(与上次更换比)&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ba6a1170-17fa-44db-b9e2-3af0d39a5f46&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:1433,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证表格仍然可见(即使没有数据)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ea0e4204-5b92-4a40-9136-0b31ecc1e564&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:196,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n},\n// 平板\n{\n width: 375,\n height: 667\n} // 手机\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证主要组件仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d9847950-133e-4cda-9247-4c0a9bda4066&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的输入验证&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证搜索表单的输入验证&quot;,&quot;duration&quot;:670,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的清除功能\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5309bf0a-23b3-40b2-a92f-61e8d18db9d7&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格数据的交互性&quot;,&quot;duration&quot;:384,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3a0b3454-994a-4321-b721-c460cee8a968&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面加载性能&quot;,&quot;duration&quot;:145,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录页面加载时间\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内(小于10秒)\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1228ad3e-a908-49a7-9e9f-2950a131de4c&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证错误处理&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证错误处理&quot;,&quot;duration&quot;:15348,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误(通过拦截API请求)\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n error: &#x27;服务器错误&#x27;\n }\n}).as(&#x27;getCollectorListError&#x27;);\n// 触发搜索操作\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@getCollectorListError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:283:7)&quot;},&quot;uuid&quot;:&quot;759729e7-6d47-4582-9e11-3cbcc9c0cb75&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证数据刷新功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证数据刷新功能&quot;,&quot;duration&quot;:2200,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 等待一段时间后验证页面仍然响应\ncy.wait(2000);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8190bcbb-bc3d-437b-8015-00df4b302851&quot;,&quot;parentUUID&quot;:&quot;9f76944b-953d-4ceb-8720-a7cbfd876bc9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;f814ad29-6278-467d-a8e6-b0c30bfbd2c3&quot;,&quot;14b353f9-94e9-49f4-bad6-09bd4c36c4fe&quot;,&quot;e67e171e-9cc0-4040-bd61-1bfbf673ed86&quot;,&quot;26d215f9-2dd8-42a2-834f-66bacd99a4b9&quot;,&quot;5e51f8c2-b93d-4e83-821a-02aa9663d6bd&quot;,&quot;b99ed6f4-8fcb-49c9-a928-4b16ffedf822&quot;,&quot;e01611f3-ddb1-4d0f-b0d1-2c5e8fa1c5e9&quot;,&quot;ba6a1170-17fa-44db-b9e2-3af0d39a5f46&quot;,&quot;ea0e4204-5b92-4a40-9136-0b31ecc1e564&quot;,&quot;d9847950-133e-4cda-9247-4c0a9bda4066&quot;,&quot;5309bf0a-23b3-40b2-a92f-61e8d18db9d7&quot;,&quot;3a0b3454-994a-4321-b721-c460cee8a968&quot;,&quot;1228ad3e-a908-49a7-9e9f-2950a131de4c&quot;,&quot;8190bcbb-bc3d-437b-8015-00df4b302851&quot;],&quot;failures&quot;:[&quot;a9d42e47-1f06-4c5e-83a3-362067b007a9&quot;,&quot;05a1c5f6-c7f6-45de-93e1-da6b76f8bcc1&quot;,&quot;3b706566-c9f8-43eb-844c-707491a7bef7&quot;,&quot;8be13067-73ac-4d64-8377-cd44789c88a9&quot;,&quot;759729e7-6d47-4582-9e11-3cbcc9c0cb75&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:85892,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104755.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104755.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T02:47:57.561Z&quot;,&quot;end&quot;:&quot;2025-09-01T02:49:00.841Z&quot;,&quot;duration&quot;:63280,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;7f77082b-dcc8-4fbf-a617-609f8f8e890d&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1292,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;af932fda-03c4-4aea-b78a-f82ca2e06f69&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1141,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;820c5249-3821-4ec2-9789-8ca17e70c200&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1132,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f625c503-3bd8-4d55-ac70-4185747658fc&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1127,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b9b3d8d9-3c73-46a5-a85e-4774136cbf96&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3123,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;c7e1058b-b577-4bc8-8748-7a4d907b86ed&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1150,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;cc4da8ce-28d3-48a1-afad-c924f504cf49&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2641,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;de31df3b-f27d-41c5-82dd-5ac3fd03ee65&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1124,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;177eccef-3788-4c92-9293-6f523ef94ceb&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1713,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;14d66ba5-58ce-4c7a-a61e-6932a116f370&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16247,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;27160dc6-e6b2-4e07-a6bd-466de8e8c342&quot;,&quot;parentUUID&quot;:&quot;8e2ce6c7-63ab-4063-b6ae-752c7653a163&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;af932fda-03c4-4aea-b78a-f82ca2e06f69&quot;,&quot;820c5249-3821-4ec2-9789-8ca17e70c200&quot;,&quot;f625c503-3bd8-4d55-ac70-4185747658fc&quot;,&quot;b9b3d8d9-3c73-46a5-a85e-4774136cbf96&quot;,&quot;c7e1058b-b577-4bc8-8748-7a4d907b86ed&quot;,&quot;cc4da8ce-28d3-48a1-afad-c924f504cf49&quot;,&quot;de31df3b-f27d-41c5-82dd-5ac3fd03ee65&quot;,&quot;177eccef-3788-4c92-9293-6f523ef94ceb&quot;,&quot;14d66ba5-58ce-4c7a-a61e-6932a116f370&quot;],&quot;failures&quot;:[&quot;27160dc6-e6b2-4e07-a6bd-466de8e8c342&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:30690,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104900.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_104900.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:7,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:0,&quot;start&quot;:&quot;2025-09-01T07:33:35.714Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:33:41.820Z&quot;,&quot;duration&quot;:6106,&quot;testsRegistered&quot;:7,&quot;passPercent&quot;:100,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;7c4b3334-e268-4b1b-b836-a6576ce0f01d&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;title&quot;:&quot;登录功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示登录页面的所有元素&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该显示登录页面的所有元素&quot;,&quot;duration&quot;:507,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查登录页面基本元素\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-remember-checkbox\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查验证码相关元素(如果存在)\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1fc3ccc6-da67-42f7-a218-eee851b6392c&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证必填字段&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证必填字段&quot;,&quot;duration&quot;:307,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击登录按钮而不填写任何信息\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 检查错误提示(这里需要根据实际的错误提示元素调整)\n// 由于Element Plus的验证提示可能不在DOM中持久存在,我们可以检查表单是否仍然可见\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e26e1206-0925-4d02-aa6c-67dbabe69ea4&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换密码可见性&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够切换密码可见性&quot;,&quot;duration&quot;:451,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 尝试多种可能的选择器来找到密码切换图标\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).then($input =&gt; {\n // 方法1: 直接查找后缀区域内的图标\n let toggleIcon = $input.find(&#x27;.el-input__suffix .el-input__icon&#x27;);\n // 方法2: 如果方法1失败,查找任何包含icon的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;[class*=\&quot;icon\&quot;]&#x27;);\n }\n // 方法3: 如果方法2失败,查找任何可点击的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;.el-input__suffix *&#x27;);\n }\n if (toggleIcon.length &gt; 0) {\n cy.wrap(toggleIcon).first().click();\n // 验证密码是否变为可见\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;] input&#x27;).should(&#x27;have.attr&#x27;, &#x27;type&#x27;, &#x27;text&#x27;);\n } else {\n // 如果所有方法都失败,记录日志但不失败测试\n cy.log(&#x27;无法找到密码切换图标,可能是Element Plus版本或配置问题&#x27;);\n // 验证输入框仍然存在\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;c920ffe6-3d1e-4544-a611-3c914d5b837d&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够刷新验证码&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够刷新验证码&quot;,&quot;duration&quot;:140,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果验证码图片存在,测试点击刷新\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n // 点击验证码图片刷新\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).click();\n // 验证图片src发生变化(这里需要更复杂的逻辑来验证)\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;228353f1-d43d-45f1-9570-f41803b65f24&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理登录表单提交&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该处理登录表单提交&quot;,&quot;duration&quot;:730,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 填写登录信息\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;testuser&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 如果有验证码输入框,填写验证码\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;1234&#x27;);\n }\n});\n// 提交表单\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 验证是否有加载状态或者跳转(这里需要根据实际情况调整)\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5e6c1a9d-33a5-4176-9356-f1f7cabd9a17&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证响应式设计&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证响应式设计&quot;,&quot;duration&quot;:1657,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b94c4b2a-c434-401c-a293-7a42164d6ebc&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理路由跳转到登录页&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该正确处理路由跳转到登录页&quot;,&quot;duration&quot;:2201,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 尝试直接访问需要权限的页面,应该被重定向到登录页\n// 模拟登录状态\ncy.mockLogin();\n// 等待1秒\ncy.wait(2000);\n// 访问仪表板\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/dashboard&#x27;);\n// 验证登录页面元素存在\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8bd393f2-eb6a-4b05-91d8-460488c6265f&quot;,&quot;parentUUID&quot;:&quot;1b4e92fa-478e-41ed-bc21-4b8e49a7e848&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;1fc3ccc6-da67-42f7-a218-eee851b6392c&quot;,&quot;e26e1206-0925-4d02-aa6c-67dbabe69ea4&quot;,&quot;c920ffe6-3d1e-4544-a611-3c914d5b837d&quot;,&quot;228353f1-d43d-45f1-9570-f41803b65f24&quot;,&quot;5e6c1a9d-33a5-4176-9356-f1f7cabd9a17&quot;,&quot;b94c4b2a-c434-401c-a293-7a42164d6ebc&quot;,&quot;8bd393f2-eb6a-4b05-91d8-460488c6265f&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:5993,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153341.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153341.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T07:33:43.792Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:34:48.074Z&quot;,&quot;duration&quot;:64282,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;0ead79f3-4f96-42d2-8e0d-fda3d6020f0e&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1383,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;be4e696b-05f8-420a-bf13-4b9f253facfd&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1232,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;99d9e3b4-1eaa-445a-8909-e8d1da05e839&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1208,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;11e40549-25ca-4ecb-87df-b27daa03d461&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1183,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1d81a8b5-1943-4f0d-9ded-ad3eee52c45d&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3207,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;13dc6a81-2216-41e0-a303-0f8313e8bdc6&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1200,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7f4bd713-1315-4b59-8a2d-617cd1c5d267&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2696,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3afc9952-5374-4f6a-9cb9-4b9849a98d26&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1176,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;00fef968-89f0-4b3b-b607-61078e82983d&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1808,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e0519fd7-7ccd-46a0-9b66-966bbd3867be&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16334,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;cd3b3d5e-b117-4aa0-94ae-c9ebfaa248cb&quot;,&quot;parentUUID&quot;:&quot;e30d6bf2-f917-40b3-a9e1-6567a733b8fa&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;be4e696b-05f8-420a-bf13-4b9f253facfd&quot;,&quot;99d9e3b4-1eaa-445a-8909-e8d1da05e839&quot;,&quot;11e40549-25ca-4ecb-87df-b27daa03d461&quot;,&quot;1d81a8b5-1943-4f0d-9ded-ad3eee52c45d&quot;,&quot;13dc6a81-2216-41e0-a303-0f8313e8bdc6&quot;,&quot;7f4bd713-1315-4b59-8a2d-617cd1c5d267&quot;,&quot;3afc9952-5374-4f6a-9cb9-4b9849a98d26&quot;,&quot;00fef968-89f0-4b3b-b607-61078e82983d&quot;,&quot;e0519fd7-7ccd-46a0-9b66-966bbd3867be&quot;],&quot;failures&quot;:[&quot;cd3b3d5e-b117-4aa0-94ae-c9ebfaa248cb&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:31427,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153448.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153448.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:11,&quot;passes&quot;:8,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T07:34:50.008Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:36:30.496Z&quot;,&quot;duration&quot;:100488,&quot;testsRegistered&quot;:11,&quot;passPercent&quot;:72.72727272727273,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;11d602ff-53a1-437c-8746-47b7c90b5bfe&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;title&quot;:&quot;导航菜单功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示侧边栏菜单&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示侧边栏菜单&quot;,&quot;duration&quot;:595,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单容器\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查菜单是否有菜单项\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;] .el-menu-item, [data-testid=\&quot;sidebar-menu\&quot;] .el-sub-menu&#x27;).should(&#x27;have.length.gt&#x27;, 0);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d5635f78-7f9d-4260-99f3-975a5fa2b15c&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击菜单项进行导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该能够点击菜单项进行导航&quot;,&quot;duration&quot;:1344,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 获取所有菜单项\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).then($items =&gt; {\n if ($items.length &gt; 0) {\n // 点击第一个菜单项\n const firstItemTestId = $items[0].getAttribute(&#x27;data-testid&#x27;);\n cy.get(`[data-testid=\&quot;${firstItemTestId}\&quot;]`).click();\n // 验证页面跳转\n cy.wait(1000);\n cy.url().should(&#x27;not.be.empty&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a622748f-2ef4-4f59-bfbc-78647bc4f520&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持子菜单展开和收起&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持子菜单展开和收起&quot;,&quot;duration&quot;:378,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 查找子菜单\ncy.get(&#x27;[data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).then($submenus =&gt; {\n if ($submenus.length &gt; 0) {\n const firstSubmenuTestId = $submenus[0].getAttribute(&#x27;data-testid&#x27;);\n // 点击子菜单标题展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-opened&#x27;);\n // 再次点击收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;not.have.class&#x27;, &#x27;is-opened&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2fa946ff-2190-4bf7-8d1c-e669b397dc8a&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该高亮当前激活的菜单项&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该高亮当前激活的菜单项&quot;,&quot;duration&quot;:216,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查当前URL对应的菜单项是否被激活\ncy.url().then(currentUrl =&gt; {\n const path = new URL(currentUrl).pathname.replace(&#x27;/&#x27;, &#x27;&#x27;);\n if (path) {\n // 查找对应的菜单项\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n // 验证菜单项有活跃状态\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;bf2f7a99-5fe9-4276-964c-f0481f0c63bd&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示菜单图标&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示菜单图标&quot;,&quot;duration&quot;:259,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单项是否有图标\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;] .menu-icon, [data-testid^=\&quot;menu-submenu-\&quot;] .menu-icon&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n// 验证图标是否正常显示\ncy.get(&#x27;.menu-icon&#x27;).each($icon =&gt; {\n cy.wrap($icon).should(&#x27;be.visible&#x27;);\n cy.wrap($icon).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;9b77bdf7-556e-4303-84f5-c7fca8846e8e&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持菜单收起状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持菜单收起状态&quot;,&quot;duration&quot;:164,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果有收起按钮,测试收起功能\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n // 查找可能的收起按钮(这里需要根据实际实现调整)\n if ($body.find(&#x27;.hamburger, .menu-toggle&#x27;).length &gt; 0) {\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n // 验证菜单收起状态\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n // 再次点击展开\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;not.have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0baf4688-17c6-4b07-9c2e-027b6e193c06&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持键盘导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持键盘导航&quot;,&quot;duration&quot;:308,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用Tab键在菜单项之间导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).focus();\n// 使用方向键导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{downarrow}&#x27;);\ncy.wait(500);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{uparrow}&#x27;);\n// 使用Enter键选择\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{enter}&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-5b118a14=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus&quot;,&quot;estack&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-5b118a14=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus\n at Context.focus (http://localhost:3000/__cypress/runner/cypress_runner.js:113422:70)\n at wrapped (http://localhost:3000/__cypress/runner/cypress_runner.js:138092:19)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:103:43)&quot;},&quot;uuid&quot;:&quot;3ccf1d86-7d96-4932-b0bf-ad452581d5d2&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在不同页面显示正确的菜单状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在不同页面显示正确的菜单状态&quot;,&quot;duration&quot;:16600,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 导航到不同页面并验证菜单状态\nconst testPages = [&#x27;dashboard&#x27;, &#x27;dust-overview&#x27;];\ntestPages.forEach(page =&gt; {\n cy.visit(`/${page}`);\n cy.waitForPageLoad();\n // 验证菜单仍然可见\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证对应的菜单项被激活\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:128:54)&quot;},&quot;uuid&quot;:&quot;18bb5f65-4232-4495-83b7-583c68a5cff7&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单权限控制&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单权限控制&quot;,&quot;duration&quot;:15334,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证菜单项是否根据权限显示\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;], [data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).each($item =&gt; {\n // 验证菜单项是可见的(说明用户有权限访问)\n cy.wrap($item).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:138:21)&quot;},&quot;uuid&quot;:&quot;758c2f3c-4a01-44a9-85e5-48d91bfb8548&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在移动端正确显示&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在移动端正确显示&quot;,&quot;duration&quot;:260,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试移动端菜单\ncy.viewport(375, 667); // iPhone尺寸\n// 菜单应该仍然可见或者有移动端适配\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;exist&#x27;);\n// 恢复桌面端\ncy.viewport(1280, 720);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7e281ea4-fa8c-43b7-8798-c57d1deddbf0&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单项的hover状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单项的hover状态&quot;,&quot;duration&quot;:269,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试菜单项的鼠标悬停效果\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).first().then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.wrap($item).trigger(&#x27;mouseover&#x27;);\n // 验证hover状态(这里需要根据实际CSS类名调整)\n cy.wrap($item).should(&#x27;have.css&#x27;, &#x27;background-color&#x27;);\n cy.wrap($item).trigger(&#x27;mouseout&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;bcac42d4-354f-441d-bc9f-00b2a0422102&quot;,&quot;parentUUID&quot;:&quot;9bc6c750-3c62-483f-bae6-7974004881a6&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;d5635f78-7f9d-4260-99f3-975a5fa2b15c&quot;,&quot;a622748f-2ef4-4f59-bfbc-78647bc4f520&quot;,&quot;2fa946ff-2190-4bf7-8d1c-e669b397dc8a&quot;,&quot;bf2f7a99-5fe9-4276-964c-f0481f0c63bd&quot;,&quot;9b77bdf7-556e-4303-84f5-c7fca8846e8e&quot;,&quot;0baf4688-17c6-4b07-9c2e-027b6e193c06&quot;,&quot;7e281ea4-fa8c-43b7-8798-c57d1deddbf0&quot;,&quot;bcac42d4-354f-441d-bc9f-00b2a0422102&quot;],&quot;failures&quot;:[&quot;3ccf1d86-7d96-4932-b0bf-ad452581d5d2&quot;,&quot;18bb5f65-4232-4495-83b7-583c68a5cff7&quot;,&quot;758c2f3c-4a01-44a9-85e5-48d91bfb8548&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:35727,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153630.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153630.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:20,&quot;passes&quot;:18,&quot;pending&quot;:0,&quot;failures&quot;:2,&quot;start&quot;:&quot;2025-09-01T07:36:36.015Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:38:51.427Z&quot;,&quot;duration&quot;:135412,&quot;testsRegistered&quot;:20,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;de8b0c33-5a75-40f7-bcd3-dc54ce3226b1&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;title&quot;:&quot;告警总览功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示告警总览页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警总览页面的所有核心组件&quot;,&quot;duration&quot;:1435,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;.content-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.demo-form-inline&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格区域\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d49e9d44-75a9-415e-8f58-3384556de14f&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示所有搜索条件输入框&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示所有搜索条件输入框&quot;,&quot;duration&quot;:1715,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查事件名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查发生位置输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查设备类型选择框\ncy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n// 检查告警时间选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;92958446-2849-4bf6-8925-ee896c21c5ee&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够输入搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够输入搜索条件&quot;,&quot;duration&quot;:2283,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入事件名称\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试事件&#x27;);\n// 输入发生位置\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试位置&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试除尘器&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f7604151-a942-4e7f-8ebe-d8f85747dc7a&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择设备类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择设备类型&quot;,&quot;duration&quot;:1349,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击设备类型选择框 - 使用更精确的选择器\ncy.get(&#x27;.el-form-item:contains(\&quot;设备类型\&quot;) .el-select&#x27;).first().click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有选项,选择第一个\ncy.get(&#x27;.el-select-dropdown&#x27;).then($dropdown =&gt; {\n if ($dropdown.find(&#x27;.el-select-dropdown__item&#x27;).length &gt; 0) {\n cy.get(&#x27;.el-select-dropdown__item&#x27;).first().click();\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2adfc5f0-0549-48a0-931d-8d0f82e6270a&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置告警时间范围&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够设置告警时间范围&quot;,&quot;duration&quot;:16646,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击时间选择器 - 使用更通用的选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).first().click();\n// 等待日期面板出现\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).first().click();\n// 选择结束日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).eq(5).click();\n// 点击确定按钮\ncy.get(&#x27;.el-picker-panel__footer .el-button--primary&#x27;).click();\n// 验证时间选择器有值\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;not.have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:93:7)&quot;},&quot;uuid&quot;:&quot;c812f0f8-920e-4790-8c51-dc56a9738d16&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:1767,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\n// 点击重置按钮\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;dce1cc89-c4f8-4510-b38b-22c69429d9c3&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够执行搜索查询&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够执行搜索查询&quot;,&quot;duration&quot;:2506,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\n// 点击查询按钮\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ca781d30-8449-434b-85eb-96bfa81cb4a8&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示挂起设备按钮&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示挂起设备按钮&quot;,&quot;duration&quot;:1174,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查挂起设备按钮\ncy.get(&#x27;button&#x27;).contains(&#x27;挂起设备&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d6888763-213a-4da0-8d98-12c01520ae98&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择告警类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择告警类型&quot;,&quot;duration&quot;:1404,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查单选按钮组\ncy.get(&#x27;.el-radio-group&#x27;).should(&#x27;be.visible&#x27;);\n// 检查各个选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).should(&#x27;be.visible&#x27;);\n// 选择不同的选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).click();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;9a688ca7-f0e8-40b2-bffc-45a51dfb3e00&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警数据表格&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警数据表格&quot;,&quot;duration&quot;:1172,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格容器\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格组件\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8a01afc3-8aa5-4776-b2ff-61d3f18fff48&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格分页组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格分页组件&quot;,&quot;duration&quot;:1168,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查分页组件\ncy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页信息\ncy.get(&#x27;.el-pagination__total&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b9798dd2-ddb5-43e3-b843-1985ec137652&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行分页操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够进行分页操作&quot;,&quot;duration&quot;:17289,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面加载完成\ncy.wait(1000);\n// 检查是否有分页组件,如果有则进行分页操作测试\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;.el-pagination&#x27;).length &gt; 0) {\n // 检查分页按钮\n cy.get(&#x27;.el-pagination__prev&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-pagination__next&#x27;).should(&#x27;be.visible&#x27;);\n // 检查页码按钮\n cy.get(&#x27;.el-pager&#x27;).should(&#x27;be.visible&#x27;);\n } else {\n // 如果没有分页组件,记录日志并继续\n cy.log(&#x27;没有分页组件,数据量可能较少&#x27;);\n // 验证页面仍然正常显示\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:173:39)&quot;},&quot;uuid&quot;:&quot;bb094ac6-1801-4662-a383-c0f7b7c6cdcd&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格操作列&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格操作列&quot;,&quot;duration&quot;:1226,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查操作列\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().should(&#x27;contain&#x27;, &#x27;暂挂起&#x27;);\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;30fbad0b-4c4f-44b3-b4ff-b92d5e795830&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击暂挂起操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够点击暂挂起操作&quot;,&quot;duration&quot;:1339,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 点击暂挂起按钮\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().contains(&#x27;暂挂起&#x27;).click();\n });\n // 这里可以添加点击后的验证逻辑\n // 比如检查是否有弹窗、确认对话框等\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;cc935988-cc70-402e-9009-e410f393cb40&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警级别标识&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警级别标识&quot;,&quot;duration&quot;:2222,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查表格行是否有内容\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n // 检查是否有任何内容,不特定检查&#x27;level&#x27;\n cy.get(&#x27;td&#x27;).should(&#x27;have.length.greaterThan&#x27;, 0);\n });\n } else {\n // 如果没有数据行,记录日志\n cy.log(&#x27;表格中没有数据行&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8486b2ba-1ffb-4000-bfcd-f49815a3e7f2&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理表格数据加载&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理表格数据加载&quot;,&quot;duration&quot;:2200,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 验证表格有内容\ncy.get(&#x27;.el-table__body&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b4d1c03c-4963-42fe-865b-6147703f3aa4&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应搜索条件变化&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该响应搜索条件变化&quot;,&quot;duration&quot;:3672,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件并查询\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 清空搜索条件并查询\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;09d8546a-22b5-47eb-958b-b25dd1a12c98&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该检查响应式设计&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该检查响应式设计&quot;,&quot;duration&quot;:2721,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查不同屏幕尺寸下的显示\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n} // 平板\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件仍然可见\n cy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;aeffe733-c613-433b-a1a4-d6ff72efba92&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:2555,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;不存在的告警事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;cb1f41e6-04f6-4d2c-9803-24ef0b9a8cc7&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:1240,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部行\ncy.get(&#x27;.el-table__header tr&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部单元格\ncy.get(&#x27;.el-table__header th&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d77ba461-a955-4126-b394-b2aa5aa38112&quot;,&quot;parentUUID&quot;:&quot;eb570159-bc38-416b-909f-400ef59c5d5a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;d49e9d44-75a9-415e-8f58-3384556de14f&quot;,&quot;92958446-2849-4bf6-8925-ee896c21c5ee&quot;,&quot;f7604151-a942-4e7f-8ebe-d8f85747dc7a&quot;,&quot;2adfc5f0-0549-48a0-931d-8d0f82e6270a&quot;,&quot;dce1cc89-c4f8-4510-b38b-22c69429d9c3&quot;,&quot;ca781d30-8449-434b-85eb-96bfa81cb4a8&quot;,&quot;d6888763-213a-4da0-8d98-12c01520ae98&quot;,&quot;9a688ca7-f0e8-40b2-bffc-45a51dfb3e00&quot;,&quot;8a01afc3-8aa5-4776-b2ff-61d3f18fff48&quot;,&quot;b9798dd2-ddb5-43e3-b843-1985ec137652&quot;,&quot;30fbad0b-4c4f-44b3-b4ff-b92d5e795830&quot;,&quot;cc935988-cc70-402e-9009-e410f393cb40&quot;,&quot;8486b2ba-1ffb-4000-bfcd-f49815a3e7f2&quot;,&quot;b4d1c03c-4963-42fe-865b-6147703f3aa4&quot;,&quot;09d8546a-22b5-47eb-958b-b25dd1a12c98&quot;,&quot;aeffe733-c613-433b-a1a4-d6ff72efba92&quot;,&quot;cb1f41e6-04f6-4d2c-9803-24ef0b9a8cc7&quot;,&quot;d77ba461-a955-4126-b394-b2aa5aa38112&quot;],&quot;failures&quot;:[&quot;c812f0f8-920e-4790-8c51-dc56a9738d16&quot;,&quot;bb094ac6-1801-4662-a383-c0f7b7c6cdcd&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:67083,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153851.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_153851.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:13,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:12,&quot;start&quot;:&quot;2025-09-01T07:38:53.395Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:41:26.936Z&quot;,&quot;duration&quot;:153541,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:7.6923076923076925,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;3f613b53-6938-4a7d-8b60-c59eb241b2a0&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;title&quot;:&quot;布袋周期管理高级功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确加载和显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该正确加载和显示表格数据&quot;,&quot;duration&quot;:2260,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待API请求完成\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证表格数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行数量\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 3);\n // 验证第一行数据\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n cy.get(&#x27;td&#x27;).eq(3).should(&#x27;contain&#x27;, &#x27;1排/1列&#x27;);\n cy.get(&#x27;td&#x27;).eq(4).should(&#x27;contain&#x27;, &#x27;2024-02-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(5).should(&#x27;contain&#x27;, &#x27;2024-01-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(6).should(&#x27;contain&#x27;, &#x27;张三&#x27;);\n cy.get(&#x27;td&#x27;).eq(7).should(&#x27;contain&#x27;, &#x27;30天&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:52:7)&quot;},&quot;uuid&quot;:&quot;964fd351-97c8-446b-a1a2-ca8cbc2395cb&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行精确搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够进行精确搜索&quot;,&quot;duration&quot;:2280,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 1,\n dusterName: &#x27;1#除尘器&#x27;,\n compart: &#x27;A仓室&#x27;,\n bagLocation: &#x27;1排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-15 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-15 10:00:00&#x27;,\n bagChangeAuthor: &#x27;张三&#x27;,\n bagChangePeriod: &#x27;30天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;searchCollectorList&#x27;);\n// 输入搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;A仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;1#除尘器&#x27;);\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@searchCollectorList&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:74:7)&quot;},&quot;uuid&quot;:&quot;5ce26640-67a1-48ad-9452-e84d272f5f7d&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理分页功能&quot;,&quot;duration&quot;:2263,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟第二页数据\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*pageNo=2*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 4,\n dusterName: &#x27;4#除尘器&#x27;,\n compart: &#x27;D仓室&#x27;,\n bagLocation: &#x27;2排/2列&#x27;,\n bagChangeNextTime: &#x27;2024-03-01 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-02-01 10:00:00&#x27;,\n bagChangeAuthor: &#x27;赵六&#x27;,\n bagChangePeriod: &#x27;28天&#x27;\n }],\n total: 4,\n pageNo: 2,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;getPage2Data&#x27;);\n// 点击下一页\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-pagination .btn-next&#x27;).click();\n});\n// 等待第二页数据加载\ncy.wait(&#x27;@getPage2Data&#x27;);\n// 验证第二页数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;4#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;D仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:124:7)&quot;},&quot;uuid&quot;:&quot;d1a911a2-2a62-4dc0-a9bb-0851db666b79&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开并操作分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够打开并操作分析对话框&quot;,&quot;duration&quot;:2281,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\ncy.wait(&#x27;@getDusterList&#x27;);\ncy.wait(&#x27;@getAnalysisData&#x27;);\n// 双击除尘器名称打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 测试除尘器切换\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).eq(1).click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);\n// 关闭对话框\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:172:7)&quot;},&quot;uuid&quot;:&quot;9763abcf-ae14-4c6b-becd-adfa6ba3d92d&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理日期范围搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理日期范围搜索&quot;,&quot;duration&quot;:2263,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟日期搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 2,\n dusterName: &#x27;2#除尘器&#x27;,\n compart: &#x27;B仓室&#x27;,\n bagLocation: &#x27;2排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-20 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-20 10:00:00&#x27;,\n bagChangeAuthor: &#x27;李四&#x27;,\n bagChangePeriod: &#x27;25天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;dateSearchResult&#x27;);\n// 设置日期范围\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择日期范围(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(5).click();\n});\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@dateSearchResult&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:208:7)&quot;},&quot;uuid&quot;:&quot;6adb7008-7761-4f5c-bdd7-5852020247bb&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理空搜索结果&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理空搜索结果&quot;,&quot;duration&quot;:2304,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟空搜索结果\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [],\n total: 0,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;emptySearchResult&#x27;);\n// 输入不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@emptySearchResult&#x27;);\n// 验证空数据状态\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有空数据提示或空表格\n cy.get(&#x27;.el-table__body&#x27;).should(&#x27;exist&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:262:7)&quot;},&quot;uuid&quot;:&quot;140ec900-ef45-40ac-9416-68daa990955a&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理API错误&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理API错误&quot;,&quot;duration&quot;:17375,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟API错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;\n }\n}).as(&#x27;apiError&#x27;);\n// 刷新页面或触发搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@apiError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:308:7)&quot;},&quot;uuid&quot;:&quot;c230982e-7900-4442-aa03-8c3beaeb4abb&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格排序功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格排序功能&quot;,&quot;duration&quot;:2270,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查表格列头是否可点击(排序功能)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查除尘器名称列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;除尘器名称&#x27;).should(&#x27;be.visible&#x27;);\n // 检查仓室列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;仓室&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:317:7)&quot;},&quot;uuid&quot;:&quot;f7658627-8fbd-4a28-86c9-3be828b0dead&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的完整性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格数据的完整性&quot;,&quot;duration&quot;:2266,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证所有必需的列都存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n const expectedColumns = [&#x27;序号&#x27;, &#x27;除尘器名称&#x27;, &#x27;仓室&#x27;, &#x27;布袋位置(排/列)&#x27;, &#x27;布袋更换提醒时间&#x27;, &#x27;更换时间&#x27;, &#x27;更换人&#x27;, &#x27;更换周期(与上次更换比)&#x27;];\n expectedColumns.forEach(columnName =&gt; {\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, columnName);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:331:7)&quot;},&quot;uuid&quot;:&quot;f74155b7-cee8-4e3c-bd47-75d8e1e88910&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证除尘器名称链接的交互性&quot;,&quot;duration&quot;:2262,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证除尘器名称链接的样式和交互\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);\n// 验证链接可以点击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.css&#x27;, &#x27;cursor&#x27;, &#x27;pointer&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:354:7)&quot;},&quot;uuid&quot;:&quot;6a935d04-a301-447f-8926-48d60a71e2d4&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面性能指标&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证页面性能指标&quot;,&quot;duration&quot;:2267,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面完全加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查页面性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证DOM内容加载时间\n expect(navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart).to.be.lessThan(3000);\n // 验证页面完全加载时间\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:366:7)&quot;},&quot;uuid&quot;:&quot;e8970b5e-aab2-44b3-8459-251d76a74127&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的验证功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证搜索表单的验证功能&quot;,&quot;duration&quot;:25689,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;slow&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的最大长度限制\nconst longText = &#x27;a&#x27;.repeat(1000);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\n// 清除输入\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;37c88164-2ef0-426c-88f1-f835ee4b2f86&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格的响应式布局&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格的响应式布局&quot;,&quot;duration&quot;:2261,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 测试不同屏幕尺寸下的表格显示\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 768,\n height: 1024\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证表格在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证表格内容可以滚动(如果需要)\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:398:7)&quot;},&quot;uuid&quot;:&quot;c4b62fe0-9bb8-436f-93bf-eeb11fce3703&quot;,&quot;parentUUID&quot;:&quot;9d85a808-4a1d-4f56-95a4-004eecd8e125&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;37c88164-2ef0-426c-88f1-f835ee4b2f86&quot;],&quot;failures&quot;:[&quot;964fd351-97c8-446b-a1a2-ca8cbc2395cb&quot;,&quot;5ce26640-67a1-48ad-9452-e84d272f5f7d&quot;,&quot;d1a911a2-2a62-4dc0-a9bb-0851db666b79&quot;,&quot;9763abcf-ae14-4c6b-becd-adfa6ba3d92d&quot;,&quot;6adb7008-7761-4f5c-bdd7-5852020247bb&quot;,&quot;140ec900-ef45-40ac-9416-68daa990955a&quot;,&quot;c230982e-7900-4442-aa03-8c3beaeb4abb&quot;,&quot;f7658627-8fbd-4a28-86c9-3be828b0dead&quot;,&quot;f74155b7-cee8-4e3c-bd47-75d8e1e88910&quot;,&quot;6a935d04-a301-447f-8926-48d60a71e2d4&quot;,&quot;e8970b5e-aab2-44b3-8459-251d76a74127&quot;,&quot;c4b62fe0-9bb8-436f-93bf-eeb11fce3703&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:68041,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154126.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154126.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T07:41:28.906Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:43:55.443Z&quot;,&quot;duration&quot;:146537,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:70,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;718d4e9d-fd11-4e31-952e-662b3c3eb6dc&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;title&quot;:&quot;布袋周期管理简化测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确显示页面组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该正确显示页面组件&quot;,&quot;duration&quot;:654,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面组件\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1dc9e49a-edbe-46f7-8b2f-e912708107ca&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证搜索表单字段&quot;,&quot;duration&quot;:15379,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证搜索表单字段\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-simple.cy.js:24:52)&quot;},&quot;uuid&quot;:&quot;d8a255e4-4b7e-421b-b0a0-3aca3484b6a3&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1889,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令进行搜索\ncy.searchCollectorData(&#x27;测试仓室&#x27;, &#x27;测试除尘器&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3cfb1748-3b98-4810-baf8-0ec22ad769e1&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:719,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 使用自定义命令重置\ncy.resetCollectorSearch();\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6f0f1c79-34c5-46ce-a74d-6a5db6ce5060&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够打开分析对话框&quot;,&quot;duration&quot;:15541,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令打开对话框\ncy.openAnalysisDialog(&#x27;button&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;fefe342d-80ec-4971-bac6-9730c6788a96&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过双击除尘器名称打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够通过双击除尘器名称打开对话框&quot;,&quot;duration&quot;:15789,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令通过双击打开对话框\ncy.openAnalysisDialog(&#x27;dblclick&#x27;);\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;d2b6ccee-25cd-4e29-b85e-1cc1dcf00034&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证表格列标题&quot;,&quot;duration&quot;:321,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令验证表格列标题\ncy.verifyCollectorTableHeaders();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8ff70ba5-f50a-4975-b5e8-e4bfa537cc8a&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:1801,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用现有的响应式检查命令\ncy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;431085d0-6c95-4e8a-98b0-06a54924891a&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接样式&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证除尘器名称链接样式&quot;,&quot;duration&quot;:503,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d6bac50f-3e6d-489c-a0c4-d50699df89be&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面加载性能&quot;,&quot;duration&quot;:274,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面加载性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2b41600c-a8c6-4091-b037-ea240474b4ac&quot;,&quot;parentUUID&quot;:&quot;93f33794-0959-44ee-b6eb-56e1adc8981a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;1dc9e49a-edbe-46f7-8b2f-e912708107ca&quot;,&quot;3cfb1748-3b98-4810-baf8-0ec22ad769e1&quot;,&quot;6f0f1c79-34c5-46ce-a74d-6a5db6ce5060&quot;,&quot;8ff70ba5-f50a-4975-b5e8-e4bfa537cc8a&quot;,&quot;431085d0-6c95-4e8a-98b0-06a54924891a&quot;,&quot;d6bac50f-3e6d-489c-a0c4-d50699df89be&quot;,&quot;2b41600c-a8c6-4091-b037-ea240474b4ac&quot;],&quot;failures&quot;:[&quot;d8a255e4-4b7e-421b-b0a0-3aca3484b6a3&quot;,&quot;fefe342d-80ec-4971-bac6-9730c6788a96&quot;,&quot;d2b6ccee-25cd-4e29-b85e-1cc1dcf00034&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:52870,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154355.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154355.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:19,&quot;passes&quot;:14,&quot;pending&quot;:0,&quot;failures&quot;:5,&quot;start&quot;:&quot;2025-09-01T07:43:57.379Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:48:00.863Z&quot;,&quot;duration&quot;:243484,&quot;testsRegistered&quot;:19,&quot;passPercent&quot;:73.68421052631578,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;c2edb0a6-4477-44c6-9f5b-f0c120a525b3&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;title&quot;:&quot;布袋周期管理功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示布袋周期页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示布袋周期页面的所有核心组件&quot;,&quot;duration&quot;:634,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;[data-testid=\&quot;collector-list-content\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格容器\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查通用表格组件\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;38853ea1-31df-4355-ac06-ae73c2c8460d&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示搜索表单的所有输入字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示搜索表单的所有输入字段&quot;,&quot;duration&quot;:15385,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查仓室输入框\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入仓室名称&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入除尘器名称&#x27;);\n// 检查日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:44:52)&quot;},&quot;uuid&quot;:&quot;88821c5b-c8ab-43c5-8a8e-5669189a44d6&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1902,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入仓室名称\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear().type(&#x27;测试仓室&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\n// 点击查询按钮\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;89706594-98c8-4054-b352-bf43e451bf7a&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:695,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 点击重置按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ee8c1b64-9d10-4da7-9c9e-3f871cb74366&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置日期范围&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够设置日期范围&quot;,&quot;duration&quot;:15379,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\n// 等待日期选择器弹出\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择今天的日期作为开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择明天的日期作为结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(1).click();\n});\n// 验证日期选择器关闭\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:91:7)&quot;},&quot;uuid&quot;:&quot;0016c21a-7d59-4b83-a817-7f8026c59d0f&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示表格数据&quot;,&quot;duration&quot;:355,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格是否有数据行\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行是否存在(即使为空数据)\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;8f1d619e-e431-47e8-b544-4d180d814dd3&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击除尘器名称打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够点击除尘器名称打开分析对话框&quot;,&quot;duration&quot;:590,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 查找除尘器名称链接并双击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器名称选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b31418b7-8ab2-4788-8300-3944cf5a45a3&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过分析按钮打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够通过分析按钮打开对话框&quot;,&quot;duration&quot;:359,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击更换周期分析按钮\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;223601dd-19d6-4707-bdea-8b56c0f264ee&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够关闭分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够关闭分析对话框&quot;,&quot;duration&quot;:15561,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击关闭按钮\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\n// 验证对话框关闭\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:160:30)&quot;},&quot;uuid&quot;:&quot;2e35695d-03b2-4bb4-9ed4-f5f333705d17&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换除尘器选择&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够切换除尘器选择&quot;,&quot;duration&quot;:15601,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击除尘器选择器\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 选择第一个选项(如果存在)\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).first().click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-7476-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-7476-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-7476-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-7476-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-7476-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-7476-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isStrictlyVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144971:10)\n at runAllChecks (http://localhost:3000/__cypress/runner/cypress_runner.js:113271:26)\n at retryActionability (http://localhost:3000/__cypress/runner/cypress_runner.js:113339:16)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:175:68)&quot;},&quot;uuid&quot;:&quot;a9aa0d68-7bc2-42d6-a347-0f2a06b53fcd&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格分页功能&quot;,&quot;duration&quot;:370,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页组件是否存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 查找分页组件\n cy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f0ced982-d85f-4eb0-aea5-3ef2e965ba98&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:292,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格列标题\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查主要列标题\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;序号&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;除尘器名称&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;仓室&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋位置(排/列)&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋更换提醒时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换人&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期(与上次更换比)&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5942d9b7-238b-4816-945a-22e57cf0cce8&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:1546,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证表格仍然可见(即使没有数据)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a72cd093-08f8-473e-b3de-530466193820&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:301,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n},\n// 平板\n{\n width: 375,\n height: 667\n} // 手机\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证主要组件仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;95645a1d-1b45-419b-a1fd-501d5250f4c4&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的输入验证&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证搜索表单的输入验证&quot;,&quot;duration&quot;:761,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的清除功能\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f6a0b89a-6be0-4dbe-8e49-75441976994c&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格数据的交互性&quot;,&quot;duration&quot;:493,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;16791dd6-a789-41b6-b69f-af4635716649&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面加载性能&quot;,&quot;duration&quot;:270,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录页面加载时间\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内(小于10秒)\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;655fce58-a181-40e6-af31-93e8cc49df8a&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证错误处理&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证错误处理&quot;,&quot;duration&quot;:15452,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误(通过拦截API请求)\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n error: &#x27;服务器错误&#x27;\n }\n}).as(&#x27;getCollectorListError&#x27;);\n// 触发搜索操作\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@getCollectorListError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:283:7)&quot;},&quot;uuid&quot;:&quot;95a7d834-dbdf-4813-80dd-bfbd8dddce6d&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证数据刷新功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证数据刷新功能&quot;,&quot;duration&quot;:2302,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 等待一段时间后验证页面仍然响应\ncy.wait(2000);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;09b24b33-9bc4-4e4d-af7b-f3434322786e&quot;,&quot;parentUUID&quot;:&quot;a2c973de-1c48-429d-bb3b-8e3c858817e1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;38853ea1-31df-4355-ac06-ae73c2c8460d&quot;,&quot;89706594-98c8-4054-b352-bf43e451bf7a&quot;,&quot;ee8c1b64-9d10-4da7-9c9e-3f871cb74366&quot;,&quot;8f1d619e-e431-47e8-b544-4d180d814dd3&quot;,&quot;b31418b7-8ab2-4788-8300-3944cf5a45a3&quot;,&quot;223601dd-19d6-4707-bdea-8b56c0f264ee&quot;,&quot;f0ced982-d85f-4eb0-aea5-3ef2e965ba98&quot;,&quot;5942d9b7-238b-4816-945a-22e57cf0cce8&quot;,&quot;a72cd093-08f8-473e-b3de-530466193820&quot;,&quot;95645a1d-1b45-419b-a1fd-501d5250f4c4&quot;,&quot;f6a0b89a-6be0-4dbe-8e49-75441976994c&quot;,&quot;16791dd6-a789-41b6-b69f-af4635716649&quot;,&quot;655fce58-a181-40e6-af31-93e8cc49df8a&quot;,&quot;09b24b33-9bc4-4e4d-af7b-f3434322786e&quot;],&quot;failures&quot;:[&quot;88821c5b-c8ab-43c5-8a8e-5669189a44d6&quot;,&quot;0016c21a-7d59-4b83-a817-7f8026c59d0f&quot;,&quot;2e35695d-03b2-4bb4-9ed4-f5f333705d17&quot;,&quot;a9aa0d68-7bc2-42d6-a347-0f2a06b53fcd&quot;,&quot;95a7d834-dbdf-4813-80dd-bfbd8dddce6d&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:88248,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154800.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154800.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:8,&quot;tests&quot;:13,&quot;passes&quot;:3,&quot;pending&quot;:0,&quot;failures&quot;:10,&quot;start&quot;:&quot;2025-09-01T07:48:02.846Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:48:06.556Z&quot;,&quot;duration&quot;:3710,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:23.076923076923077,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;9d3aa4e9-fc77-4c02-8f9a-b775f7d3ca5e&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;779d9e3c-ceec-40b7-8a12-22c840828680&quot;,&quot;title&quot;:&quot;首页API接口正确性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;c38e7abd-5924-4978-a11f-6fcb5e6818d7&quot;,&quot;title&quot;:&quot;健康度概览接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度概览数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该成功获取健康度概览数据&quot;,&quot;duration&quot;:90,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证数据结构(如果有数据)\n if (response.body.data) {\n const data = response.body.data;\n // 健康度数据应该包含数值类型的字段\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的健康度字段\n if (data.average !== undefined) {\n expect(data.average).to.be.a(&#x27;number&#x27;);\n expect(data.average).to.be.at.least(0);\n expect(data.average).to.be.at.most(100);\n }\n if (data.bag !== undefined) {\n expect(data.bag).to.be.a(&#x27;number&#x27;);\n expect(data.bag).to.be.at.least(0);\n expect(data.bag).to.be.at.most(100);\n }\n if (data.pulseValve !== undefined) {\n expect(data.pulseValve).to.be.a(&#x27;number&#x27;);\n expect(data.pulseValve).to.be.at.least(0);\n expect(data.pulseValve).to.be.at.most(100);\n }\n if (data.poppetValve !== undefined) {\n expect(data.poppetValve).to.be.a(&#x27;number&#x27;);\n expect(data.poppetValve).to.be.at.least(0);\n expect(data.poppetValve).to.be.at.most(100);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:41:38)&quot;},&quot;uuid&quot;:&quot;5665661b-8a67-4149-bbbf-9bee8b2f27ef&quot;,&quot;parentUUID&quot;:&quot;c38e7abd-5924-4978-a11f-6fcb5e6818d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度概览接口的错误响应&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该处理健康度概览接口的错误响应&quot;,&quot;duration&quot;:84,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟服务器错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;,\n data: null\n }\n}).as(&#x27;healthOverviewError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(500);\n expect(response.body.code).to.equal(500);\n expect(response.body.message).to.contain(&#x27;错误&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected 200 to equal 500&quot;,&quot;estack&quot;:&quot;AssertionError: expected 200 to equal 500\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:105:35)&quot;,&quot;diff&quot;:&quot;- 200\n+ 500\n&quot;},&quot;uuid&quot;:&quot;4ad8fd43-773f-4d72-bb3d-8afed85219dc&quot;,&quot;parentUUID&quot;:&quot;c38e7abd-5924-4978-a11f-6fcb5e6818d7&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;5665661b-8a67-4149-bbbf-9bee8b2f27ef&quot;,&quot;4ad8fd43-773f-4d72-bb3d-8afed85219dc&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:174,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;647e9911-e1b9-4876-940e-dc7d90effb6a&quot;,&quot;title&quot;:&quot;健康度统计接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度统计数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该成功获取健康度统计数据&quot;,&quot;duration&quot;:112,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证图表数据结构\n if (response.body.data) {\n const data = response.body.data;\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的图表数据字段\n if (data.xAxis) {\n expect(data.xAxis).to.be.an(&#x27;array&#x27;);\n }\n if (data.series) {\n expect(data.series).to.be.an(&#x27;array&#x27;);\n }\n if (data.categories) {\n expect(data.categories).to.be.an(&#x27;array&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:126:38)&quot;},&quot;uuid&quot;:&quot;5204f36a-7fa6-4af1-ab8e-2e74bc7bef30&quot;,&quot;parentUUID&quot;:&quot;647e9911-e1b9-4876-940e-dc7d90effb6a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度统计接口的超时&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该处理健康度统计接口的超时&quot;,&quot;duration&quot;:93,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟超时\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/statistic&#x27;, req =&gt; {\n req.reply(res =&gt; {\n return new Promise(resolve =&gt; {\n setTimeout(() =&gt; resolve(res.send({\n statusCode: 408\n })), 6000);\n });\n });\n}).as(&#x27;healthStatisticTimeout&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n timeout: 5000,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该处理超时情况\n expect([408, 504]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:178:30)&quot;},&quot;uuid&quot;:&quot;d3d55831-bd96-4826-818e-437338f35aa4&quot;,&quot;parentUUID&quot;:&quot;647e9911-e1b9-4876-940e-dc7d90effb6a&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;5204f36a-7fa6-4af1-ab8e-2e74bc7bef30&quot;,&quot;d3d55831-bd96-4826-818e-437338f35aa4&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:205,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;461656f5-9f7a-4143-a317-995e6d090335&quot;,&quot;title&quot;:&quot;异常监控接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取异常监控数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该成功获取异常监控数据&quot;,&quot;duration&quot;:111,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证异常监控数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的异常监控字段\n if (item.time) {\n expect(item.time).to.be.a(&#x27;string&#x27;);\n }\n if (item.level) {\n expect(item.level).to.be.a(&#x27;string&#x27;);\n }\n if (item.message) {\n expect(item.message).to.be.a(&#x27;string&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:197:38)&quot;},&quot;uuid&quot;:&quot;74bc4e12-2c52-4412-b19e-0afe54a7595d&quot;,&quot;parentUUID&quot;:&quot;461656f5-9f7a-4143-a317-995e6d090335&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证异常监控数据的完整性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该验证异常监控数据的完整性&quot;,&quot;duration&quot;:34,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n // 验证数据量合理性\n expect(data.length).to.be.at.most(1000); // 单次返回不超过1000条\n // 验证时间戳格式(如果存在)\n data.forEach(item =&gt; {\n if (item.timestamp) {\n expect(new Date(item.timestamp).getTime()).to.be.a(&#x27;number&#x27;);\n }\n if (item.createTime) {\n expect(new Date(item.createTime).getTime()).to.be.a(&#x27;number&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f1545a33-25a9-4f1f-b752-0a0c611b1377&quot;,&quot;parentUUID&quot;:&quot;461656f5-9f7a-4143-a317-995e6d090335&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;f1545a33-25a9-4f1f-b752-0a0c611b1377&quot;],&quot;failures&quot;:[&quot;74bc4e12-2c52-4412-b19e-0afe54a7595d&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:145,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;49cb86ab-cca0-433a-b892-5172f58a0656&quot;,&quot;title&quot;:&quot;除尘器告警接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取除尘器告警数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该成功获取除尘器告警数据&quot;,&quot;duration&quot;:110,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证告警数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的告警字段\n if (item.alarmLevel) {\n expect(item.alarmLevel).to.be.a(&#x27;string&#x27;);\n }\n if (item.alarmType) {\n expect(item.alarmType).to.be.a(&#x27;string&#x27;);\n }\n if (item.deviceName) {\n expect(item.deviceName).to.be.a(&#x27;string&#x27;);\n }\n if (item.location) {\n expect(item.location).to.be.an(&#x27;object&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:282:38)&quot;},&quot;uuid&quot;:&quot;6435620f-6ec9-4b78-91c9-484685883b76&quot;,&quot;parentUUID&quot;:&quot;49cb86ab-cca0-433a-b892-5172f58a0656&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证告警数据的地理位置信息&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该验证告警数据的地理位置信息&quot;,&quot;duration&quot;:43,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n data.forEach(item =&gt; {\n // 验证地理位置信息\n if (item.location) {\n const location = item.location;\n if (location.latitude) {\n expect(location.latitude).to.be.a(&#x27;number&#x27;);\n expect(location.latitude).to.be.at.least(-90);\n expect(location.latitude).to.be.at.most(90);\n }\n if (location.longitude) {\n expect(location.longitude).to.be.a(&#x27;number&#x27;);\n expect(location.longitude).to.be.at.least(-180);\n expect(location.longitude).to.be.at.most(180);\n }\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;40c9fc6b-d81a-4244-85e0-f9255ea9fa9f&quot;,&quot;parentUUID&quot;:&quot;49cb86ab-cca0-433a-b892-5172f58a0656&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;40c9fc6b-d81a-4244-85e0-f9255ea9fa9f&quot;],&quot;failures&quot;:[&quot;6435620f-6ec9-4b78-91c9-484685883b76&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:153,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;375139f6-588b-49e7-abe4-e762e1b56202&quot;,&quot;title&quot;:&quot;接口并发访问测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该能够同时访问所有首页接口&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口并发访问测试 应该能够同时访问所有首页接口&quot;,&quot;duration&quot;:56,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;const requests = [cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n})];\n// 并发执行所有请求\nCypress.Promise.all(requests).then(responses =&gt; {\n // 验证所有请求都成功\n responses.forEach((response, index) =&gt; {\n expect(response.status).to.equal(200);\n expect(response.body.code).to.equal(200);\n // 验证响应时间合理\n expect(response.duration).to.be.lessThan(10000);\n });\n // 验证总体响应时间\n const totalTime = responses.reduce((sum, resp) =&gt; sum + resp.duration, 0);\n expect(totalTime).to.be.lessThan(20000); // 总时间不超过20秒\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e7776273-f711-4b12-baa6-a0a9e19bd5cf&quot;,&quot;parentUUID&quot;:&quot;375139f6-588b-49e7-abe4-e762e1b56202&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;e7776273-f711-4b12-baa6-a0a9e19bd5cf&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:56,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;0c402414-1502-477e-b9a4-24762457f1c8&quot;,&quot;title&quot;:&quot;接口错误处理测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确处理无效的TOKEN&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理无效的TOKEN&quot;,&quot;duration&quot;:107,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: &#x27;invalid_token_12345&#x27;,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:417:30)&quot;},&quot;uuid&quot;:&quot;ad188e62-12b3-4e2c-9c5e-541ecc422cbb&quot;,&quot;parentUUID&quot;:&quot;0c402414-1502-477e-b9a4-24762457f1c8&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理缺少TOKEN的请求&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理缺少TOKEN的请求&quot;,&quot;duration&quot;:107,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:431:30)&quot;},&quot;uuid&quot;:&quot;1b3b8f64-f424-4b79-9896-82defabac4ec&quot;,&quot;parentUUID&quot;:&quot;0c402414-1502-477e-b9a4-24762457f1c8&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理网络错误&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理网络错误&quot;,&quot;duration&quot;:98,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n forceNetworkError: true\n}).as(&#x27;networkError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n retryOnNetworkFailure: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 网络错误应该被正确处理\n expect(response).to.exist;\n}).catch(error =&gt; {\n // 或者抛出网络错误异常\n expect(error.message).to.contain(&#x27;network&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function&quot;,&quot;estack&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:453:16)&quot;},&quot;uuid&quot;:&quot;1fcd4566-5b3d-4442-9d3f-8b18610a2cce&quot;,&quot;parentUUID&quot;:&quot;0c402414-1502-477e-b9a4-24762457f1c8&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;ad188e62-12b3-4e2c-9c5e-541ecc422cbb&quot;,&quot;1b3b8f64-f424-4b79-9896-82defabac4ec&quot;,&quot;1fcd4566-5b3d-4442-9d3f-8b18610a2cce&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:312,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;9d353c08-50de-47d1-967a-f38fa0c9c491&quot;,&quot;title&quot;:&quot;接口数据一致性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该验证多次调用返回数据的一致性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口数据一致性测试 应该验证多次调用返回数据的一致性&quot;,&quot;duration&quot;:129,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;let firstResponse;\n// 第一次调用\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n firstResponse = response.body;\n expect(response.status).to.equal(200);\n}).then(() =&gt; {\n // 短时间内第二次调用\n cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n }).then(response =&gt; {\n expect(response.status).to.equal(200);\n // 验证数据结构一致性\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证数据类型一致性\n if (firstResponse.data &amp;&amp; response.body.data) {\n expect(typeof response.body.data).to.equal(typeof firstResponse.data);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:488:40)&quot;},&quot;uuid&quot;:&quot;2b5279b9-d8d1-4c23-afd7-8280a9bc9834&quot;,&quot;parentUUID&quot;:&quot;9d353c08-50de-47d1-967a-f38fa0c9c491&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;2b5279b9-d8d1-4c23-afd7-8280a9bc9834&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:129,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154806.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154806.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T07:48:08.689Z&quot;,&quot;end&quot;:&quot;2025-09-01T07:49:12.713Z&quot;,&quot;duration&quot;:64024,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;d34e47fe-d84a-465a-b62b-f7048b0b64b8&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1383,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;547622fd-5648-468c-a872-db5514948b95&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1230,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5803569d-b8e1-40cf-81c9-11166df46ea0&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1172,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a534e19b-44e7-4388-991a-4d27e1b776c1&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1184,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;790b2bc7-1874-4db9-aab2-05699a086092&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3185,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6b0b9c36-8b83-4dc0-931c-6a2e3e2d200f&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1202,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ace22bc1-4c82-4c89-a99e-f72dc32f2fa0&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2694,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0c93d336-7d4c-4ab3-bf52-589d5ceaa185&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1178,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;86f99cc0-9a48-4e16-87e5-706b8c72deb9&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1832,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1ae43477-4e94-4bda-8741-3d0d330f4ffe&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16263,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;ef6212c7-e2d9-4c2e-9bed-3038bf745640&quot;,&quot;parentUUID&quot;:&quot;ad478024-ad46-4a69-8158-670e99593e72&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;547622fd-5648-468c-a872-db5514948b95&quot;,&quot;5803569d-b8e1-40cf-81c9-11166df46ea0&quot;,&quot;a534e19b-44e7-4388-991a-4d27e1b776c1&quot;,&quot;790b2bc7-1874-4db9-aab2-05699a086092&quot;,&quot;6b0b9c36-8b83-4dc0-931c-6a2e3e2d200f&quot;,&quot;ace22bc1-4c82-4c89-a99e-f72dc32f2fa0&quot;,&quot;0c93d336-7d4c-4ab3-bf52-589d5ceaa185&quot;,&quot;86f99cc0-9a48-4e16-87e5-706b8c72deb9&quot;,&quot;1ae43477-4e94-4bda-8741-3d0d330f4ffe&quot;],&quot;failures&quot;:[&quot;ef6212c7-e2d9-4c2e-9bed-3038bf745640&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:31323,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154912.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_154912.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:7,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:0,&quot;start&quot;:&quot;2025-09-01T08:06:29.271Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:06:35.287Z&quot;,&quot;duration&quot;:6016,&quot;testsRegistered&quot;:7,&quot;passPercent&quot;:100,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;70b2af5f-e681-48fb-8e46-d0ab12f6df8c&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/login.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;title&quot;:&quot;登录功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示登录页面的所有元素&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该显示登录页面的所有元素&quot;,&quot;duration&quot;:464,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查登录页面基本元素\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-remember-checkbox\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查验证码相关元素(如果存在)\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;210e29b6-16f1-40ef-b8af-b25f980f0506&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证必填字段&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证必填字段&quot;,&quot;duration&quot;:281,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击登录按钮而不填写任何信息\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 检查错误提示(这里需要根据实际的错误提示元素调整)\n// 由于Element Plus的验证提示可能不在DOM中持久存在,我们可以检查表单是否仍然可见\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ded9aefe-8401-43f5-b8c1-efe705eda2b1&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换密码可见性&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够切换密码可见性&quot;,&quot;duration&quot;:448,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 尝试多种可能的选择器来找到密码切换图标\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).then($input =&gt; {\n // 方法1: 直接查找后缀区域内的图标\n let toggleIcon = $input.find(&#x27;.el-input__suffix .el-input__icon&#x27;);\n // 方法2: 如果方法1失败,查找任何包含icon的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;[class*=\&quot;icon\&quot;]&#x27;);\n }\n // 方法3: 如果方法2失败,查找任何可点击的元素\n if (toggleIcon.length === 0) {\n toggleIcon = $input.find(&#x27;.el-input__suffix *&#x27;);\n }\n if (toggleIcon.length &gt; 0) {\n cy.wrap(toggleIcon).first().click();\n // 验证密码是否变为可见\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;] input&#x27;).should(&#x27;have.attr&#x27;, &#x27;type&#x27;, &#x27;text&#x27;);\n } else {\n // 如果所有方法都失败,记录日志但不失败测试\n cy.log(&#x27;无法找到密码切换图标,可能是Element Plus版本或配置问题&#x27;);\n // 验证输入框仍然存在\n cy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a102055b-c738-466d-947b-b2f153c41142&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够刷新验证码&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该能够刷新验证码&quot;,&quot;duration&quot;:140,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果验证码图片存在,测试点击刷新\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n // 点击验证码图片刷新\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).click();\n // 验证图片src发生变化(这里需要更复杂的逻辑来验证)\n cy.get(&#x27;[data-testid=\&quot;login-captcha-image\&quot;]&#x27;).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6c883268-c6f9-4cea-9b24-3838de64a0ae&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理登录表单提交&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该处理登录表单提交&quot;,&quot;duration&quot;:722,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 填写登录信息\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;testuser&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;testpassword&#x27;);\n// 如果有验证码输入框,填写验证码\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).length &gt; 0) {\n cy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;1234&#x27;);\n }\n});\n// 提交表单\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\n// 验证是否有加载状态或者跳转(这里需要根据实际情况调整)\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7d5de7e4-18cc-448d-9c98-1b7f21e9372c&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证响应式设计&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该验证响应式设计&quot;,&quot;duration&quot;:1643,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;63e5614a-bcdc-4d39-8ce4-b2f6bfb6bb0f&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理路由跳转到登录页&quot;,&quot;fullTitle&quot;:&quot;登录功能测试 应该正确处理路由跳转到登录页&quot;,&quot;duration&quot;:2223,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 尝试直接访问需要权限的页面,应该被重定向到登录页\n// 模拟登录状态\ncy.mockLogin();\n// 等待1秒\ncy.wait(2000);\n// 访问仪表板\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/dashboard&#x27;);\n// 验证登录页面元素存在\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;76ea4838-0329-46ec-9a80-544d642253a2&quot;,&quot;parentUUID&quot;:&quot;24066abf-776e-4ff3-bd34-28a0b88f3574&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;210e29b6-16f1-40ef-b8af-b25f980f0506&quot;,&quot;ded9aefe-8401-43f5-b8c1-efe705eda2b1&quot;,&quot;a102055b-c738-466d-947b-b2f153c41142&quot;,&quot;6c883268-c6f9-4cea-9b24-3838de64a0ae&quot;,&quot;7d5de7e4-18cc-448d-9c98-1b7f21e9372c&quot;,&quot;63e5614a-bcdc-4d39-8ce4-b2f6bfb6bb0f&quot;,&quot;76ea4838-0329-46ec-9a80-544d642253a2&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:5921,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160635.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160635.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T08:06:37.204Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:07:41.323Z&quot;,&quot;duration&quot;:64119,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;a2bedf38-19f6-4dcb-9f2a-d22406df855c&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1419,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e48c853a-4683-45ad-9cf9-2d0a36dd07da&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1207,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;739af90c-22d7-4e00-a897-1cbab5926c2d&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1191,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0790efc8-9ffd-491b-b180-a3467bbaf7c8&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1189,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e6bd768b-3bca-4175-b945-bede464c5f82&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3188,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;27a98214-f853-4021-8885-01dde48e18c7&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1187,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;72b8b2d8-7d1f-49f0-8a44-a12ed351f435&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2685,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;4d8321ba-fc91-43dc-8c79-2154884c3939&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1182,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6c54c24b-d608-49d1-8c5c-52cd38c08fcd&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1792,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ed6e75a1-7a82-44c0-9949-27faf0ac1e59&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16278,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;baae3a3f-6a28-4696-b923-74159efc9c18&quot;,&quot;parentUUID&quot;:&quot;c472d871-5547-4999-b013-b94eb24eb802&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;e48c853a-4683-45ad-9cf9-2d0a36dd07da&quot;,&quot;739af90c-22d7-4e00-a897-1cbab5926c2d&quot;,&quot;0790efc8-9ffd-491b-b180-a3467bbaf7c8&quot;,&quot;e6bd768b-3bca-4175-b945-bede464c5f82&quot;,&quot;27a98214-f853-4021-8885-01dde48e18c7&quot;,&quot;72b8b2d8-7d1f-49f0-8a44-a12ed351f435&quot;,&quot;4d8321ba-fc91-43dc-8c79-2154884c3939&quot;,&quot;6c54c24b-d608-49d1-8c5c-52cd38c08fcd&quot;,&quot;ed6e75a1-7a82-44c0-9949-27faf0ac1e59&quot;],&quot;failures&quot;:[&quot;baae3a3f-6a28-4696-b923-74159efc9c18&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:31318,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160741.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160741.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:11,&quot;passes&quot;:8,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T08:07:43.280Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:09:23.761Z&quot;,&quot;duration&quot;:100481,&quot;testsRegistered&quot;:11,&quot;passPercent&quot;:72.72727272727273,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;32f00ddb-30ea-40e7-baf1-00a31bb967f4&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/navigation.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;title&quot;:&quot;导航菜单功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示侧边栏菜单&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示侧边栏菜单&quot;,&quot;duration&quot;:590,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单容器\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查菜单是否有菜单项\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;] .el-menu-item, [data-testid=\&quot;sidebar-menu\&quot;] .el-sub-menu&#x27;).should(&#x27;have.length.gt&#x27;, 0);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2f08febb-c7ff-4da4-a7f5-c2c6204b771a&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击菜单项进行导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该能够点击菜单项进行导航&quot;,&quot;duration&quot;:1339,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 获取所有菜单项\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).then($items =&gt; {\n if ($items.length &gt; 0) {\n // 点击第一个菜单项\n const firstItemTestId = $items[0].getAttribute(&#x27;data-testid&#x27;);\n cy.get(`[data-testid=\&quot;${firstItemTestId}\&quot;]`).click();\n // 验证页面跳转\n cy.wait(1000);\n cy.url().should(&#x27;not.be.empty&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ad3edf01-a0ac-47e2-9908-1d2e2f49b685&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持子菜单展开和收起&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持子菜单展开和收起&quot;,&quot;duration&quot;:359,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 查找子菜单\ncy.get(&#x27;[data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).then($submenus =&gt; {\n if ($submenus.length &gt; 0) {\n const firstSubmenuTestId = $submenus[0].getAttribute(&#x27;data-testid&#x27;);\n // 点击子菜单标题展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单展开\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-opened&#x27;);\n // 再次点击收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;] .el-sub-menu__title`).click();\n // 验证子菜单收起\n cy.get(`[data-testid=\&quot;${firstSubmenuTestId}\&quot;]`).should(&#x27;not.have.class&#x27;, &#x27;is-opened&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6d4f843e-4c6a-44a1-ab2b-f44c14e462f0&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该高亮当前激活的菜单项&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该高亮当前激活的菜单项&quot;,&quot;duration&quot;:152,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查当前URL对应的菜单项是否被激活\ncy.url().then(currentUrl =&gt; {\n const path = new URL(currentUrl).pathname.replace(&#x27;/&#x27;, &#x27;&#x27;);\n if (path) {\n // 查找对应的菜单项\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n // 验证菜单项有活跃状态\n cy.get(`[data-testid=\&quot;menu-item-${path}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a511e066-d202-4799-ab76-2adf82e750e4&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示菜单图标&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该显示菜单图标&quot;,&quot;duration&quot;:270,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查菜单项是否有图标\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;] .menu-icon, [data-testid^=\&quot;menu-submenu-\&quot;] .menu-icon&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n// 验证图标是否正常显示\ncy.get(&#x27;.menu-icon&#x27;).each($icon =&gt; {\n cy.wrap($icon).should(&#x27;be.visible&#x27;);\n cy.wrap($icon).should(&#x27;have.attr&#x27;, &#x27;src&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ae6d423b-9c98-463f-acf3-4a8e626d5881&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持菜单收起状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持菜单收起状态&quot;,&quot;duration&quot;:176,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 如果有收起按钮,测试收起功能\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n // 查找可能的收起按钮(这里需要根据实际实现调整)\n if ($body.find(&#x27;.hamburger, .menu-toggle&#x27;).length &gt; 0) {\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n // 验证菜单收起状态\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n // 再次点击展开\n cy.get(&#x27;.hamburger, .menu-toggle&#x27;).click();\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;not.have.class&#x27;, &#x27;el-menu--collapse&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f06d26ad-c693-4b52-a767-faf5a815ba8d&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该支持键盘导航&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该支持键盘导航&quot;,&quot;duration&quot;:330,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用Tab键在菜单项之间导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).focus();\n// 使用方向键导航\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{downarrow}&#x27;);\ncy.wait(500);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{uparrow}&#x27;);\n// 使用Enter键选择\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).type(&#x27;{enter}&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-5b118a14=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus&quot;,&quot;estack&quot;:&quot;CypressError: `cy.focus()` can only be called on a valid focusable element. Your subject is a: `&lt;ul data-v-5b118a14=\&quot;\&quot; role=\&quot;menubar\&quot; class=\&quot;el-menu el-menu--vertical el-menu-vertical-demo\&quot; data-testid=\&quot;sidebar-menu\&quot; style=\&quot;--el-menu-active-color: #1890FF; --el-menu-level: 0;\&quot;&gt;...&lt;/ul&gt;`\n\nhttps://on.cypress.io/focus\n at Context.focus (http://localhost:3000/__cypress/runner/cypress_runner.js:113422:70)\n at wrapped (http://localhost:3000/__cypress/runner/cypress_runner.js:138092:19)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:103:43)&quot;},&quot;uuid&quot;:&quot;528f7375-a431-45d9-8031-2227d3d67608&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在不同页面显示正确的菜单状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在不同页面显示正确的菜单状态&quot;,&quot;duration&quot;:16626,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 导航到不同页面并验证菜单状态\nconst testPages = [&#x27;dashboard&#x27;, &#x27;dust-overview&#x27;];\ntestPages.forEach(page =&gt; {\n cy.visit(`/${page}`);\n cy.waitForPageLoad();\n // 验证菜单仍然可见\n cy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证对应的菜单项被激活\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.get(`[data-testid=\&quot;menu-item-${page}\&quot;]`).should(&#x27;have.class&#x27;, &#x27;is-active&#x27;);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-box&gt;&#x27; to have class &#x27;is-active&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:128:54)&quot;},&quot;uuid&quot;:&quot;5701b526-5ae8-4345-8516-6508ae31265b&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单权限控制&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单权限控制&quot;,&quot;duration&quot;:15340,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证菜单项是否根据权限显示\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;], [data-testid^=\&quot;menu-submenu-\&quot;]&#x27;).each($item =&gt; {\n // 验证菜单项是可见的(说明用户有权限访问)\n cy.wrap($item).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;&lt;li.el-menu-item.submenu-title-noDropdown&gt;&#x27; to be &#x27;visible&#x27;\n\nThis element `&lt;li.el-menu-item.submenu-title-noDropdown&gt;` is not visible because its parent `&lt;ul.el-menu.el-menu--inline&gt;` has CSS property: `display: none`\n at Context.eval (webpack://dctomproject/./cypress/e2e/navigation.cy.js:138:21)&quot;},&quot;uuid&quot;:&quot;bc6d383e-af5d-4736-a927-88b7f16e50cb&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该在移动端正确显示&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该在移动端正确显示&quot;,&quot;duration&quot;:255,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试移动端菜单\ncy.viewport(375, 667); // iPhone尺寸\n// 菜单应该仍然可见或者有移动端适配\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;exist&#x27;);\n// 恢复桌面端\ncy.viewport(1280, 720);\ncy.get(&#x27;[data-testid=\&quot;sidebar-menu\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;43f71ffc-d33a-4d1c-85c3-e8df128ba294&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理菜单项的hover状态&quot;,&quot;fullTitle&quot;:&quot;导航菜单功能测试 应该处理菜单项的hover状态&quot;,&quot;duration&quot;:270,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试菜单项的鼠标悬停效果\ncy.get(&#x27;[data-testid^=\&quot;menu-item-\&quot;]&#x27;).first().then($item =&gt; {\n if ($item.length &gt; 0) {\n cy.wrap($item).trigger(&#x27;mouseover&#x27;);\n // 验证hover状态(这里需要根据实际CSS类名调整)\n cy.wrap($item).should(&#x27;have.css&#x27;, &#x27;background-color&#x27;);\n cy.wrap($item).trigger(&#x27;mouseout&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;60eea169-0413-4bc8-9257-f853ccd64412&quot;,&quot;parentUUID&quot;:&quot;0a3bac94-1ec7-4f7a-8db6-7e0782f41ff9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;2f08febb-c7ff-4da4-a7f5-c2c6204b771a&quot;,&quot;ad3edf01-a0ac-47e2-9908-1d2e2f49b685&quot;,&quot;6d4f843e-4c6a-44a1-ab2b-f44c14e462f0&quot;,&quot;a511e066-d202-4799-ab76-2adf82e750e4&quot;,&quot;ae6d423b-9c98-463f-acf3-4a8e626d5881&quot;,&quot;f06d26ad-c693-4b52-a767-faf5a815ba8d&quot;,&quot;43f71ffc-d33a-4d1c-85c3-e8df128ba294&quot;,&quot;60eea169-0413-4bc8-9257-f853ccd64412&quot;],&quot;failures&quot;:[&quot;528f7375-a431-45d9-8031-2227d3d67608&quot;,&quot;5701b526-5ae8-4345-8516-6508ae31265b&quot;,&quot;bc6d383e-af5d-4736-a927-88b7f16e50cb&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:35707,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160923.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_160923.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:20,&quot;passes&quot;:18,&quot;pending&quot;:0,&quot;failures&quot;:2,&quot;start&quot;:&quot;2025-09-01T08:09:28.988Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:11:43.494Z&quot;,&quot;duration&quot;:134506,&quot;testsRegistered&quot;:20,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;11b430e6-483a-4bf3-96d8-0871fc0dd1a0&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/alerts.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;title&quot;:&quot;告警总览功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示告警总览页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警总览页面的所有核心组件&quot;,&quot;duration&quot;:1426,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;.content-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.demo-form-inline&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格区域\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;735479df-8ab4-469e-b7b1-1169bf3e7b34&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示所有搜索条件输入框&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示所有搜索条件输入框&quot;,&quot;duration&quot;:1216,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查事件名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查发生位置输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查设备类型选择框\ncy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n// 检查告警时间选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;448789bd-d866-4854-8c56-ee96500dc5a4&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够输入搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够输入搜索条件&quot;,&quot;duration&quot;:1963,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入事件名称\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试事件&#x27;);\n// 输入发生位置\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试位置&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入除尘器名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;测试除尘器&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f76f8d72-e587-450b-8e29-75eb377637b0&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择设备类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择设备类型&quot;,&quot;duration&quot;:1372,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击设备类型选择框 - 使用更精确的选择器\ncy.get(&#x27;.el-form-item:contains(\&quot;设备类型\&quot;) .el-select&#x27;).first().click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有选项,选择第一个\ncy.get(&#x27;.el-select-dropdown&#x27;).then($dropdown =&gt; {\n if ($dropdown.find(&#x27;.el-select-dropdown__item&#x27;).length &gt; 0) {\n cy.get(&#x27;.el-select-dropdown__item&#x27;).first().click();\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;a3f3ac5f-cba2-4909-b941-61716162723a&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置告警时间范围&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够设置告警时间范围&quot;,&quot;duration&quot;:16639,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击时间选择器 - 使用更通用的选择器\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).first().click();\n// 等待日期面板出现\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).first().click();\n// 选择结束日期 - 使用更精确的选择器\ncy.get(&#x27;.el-picker-panel .el-date-table td.available&#x27;).eq(5).click();\n// 点击确定按钮\ncy.get(&#x27;.el-picker-panel__footer .el-button--primary&#x27;).click();\n// 验证时间选择器有值\ncy.get(&#x27;input[placeholder=\&quot;开始时间\&quot;]&#x27;).should(&#x27;not.have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-picker-panel__footer .el-button--primary`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:93:7)&quot;},&quot;uuid&quot;:&quot;baf19eec-bc93-40df-8003-c85e048627e1&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:1748,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).clear().type(&#x27;测试位置&#x27;);\n// 点击重置按钮\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;input[placeholder=\&quot;请输入发生位置\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f4c48790-bde5-4415-abbe-a168c7693f23&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够执行搜索查询&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够执行搜索查询&quot;,&quot;duration&quot;:2491,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\n// 点击查询按钮\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;aaf0114d-92b5-491b-92bb-4abf129b6c77&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示挂起设备按钮&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示挂起设备按钮&quot;,&quot;duration&quot;:1186,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查挂起设备按钮\ncy.get(&#x27;button&#x27;).contains(&#x27;挂起设备&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;98b37d96-8124-46d8-a9be-d7e2e5974590&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够选择告警类型&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够选择告警类型&quot;,&quot;duration&quot;:1392,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查单选按钮组\ncy.get(&#x27;.el-radio-group&#x27;).should(&#x27;be.visible&#x27;);\n// 检查各个选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).should(&#x27;be.visible&#x27;);\n// 选择不同的选项\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;非挂起期间告警&#x27;).click();\ncy.get(&#x27;.el-radio&#x27;).contains(&#x27;全部告警&#x27;).click();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;c1dee83c-07aa-491c-8aea-2be5abde8ebd&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警数据表格&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警数据表格&quot;,&quot;duration&quot;:1175,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格容器\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格组件\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;554ef38f-de50-4080-9a6e-47426d46f7ab&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格分页组件&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格分页组件&quot;,&quot;duration&quot;:1170,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查分页组件\ncy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页信息\ncy.get(&#x27;.el-pagination__total&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6c0b04f5-60da-4f3f-9aef-68b4e433a6fa&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行分页操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够进行分页操作&quot;,&quot;duration&quot;:17308,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面加载完成\ncy.wait(1000);\n// 检查是否有分页组件,如果有则进行分页操作测试\ncy.get(&#x27;body&#x27;).then($body =&gt; {\n if ($body.find(&#x27;.el-pagination&#x27;).length &gt; 0) {\n // 检查分页按钮\n cy.get(&#x27;.el-pagination__prev&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-pagination__next&#x27;).should(&#x27;be.visible&#x27;);\n // 检查页码按钮\n cy.get(&#x27;.el-pager&#x27;).should(&#x27;be.visible&#x27;);\n } else {\n // 如果没有分页组件,记录日志并继续\n cy.log(&#x27;没有分页组件,数据量可能较少&#x27;);\n // 验证页面仍然正常显示\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n }\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `.el-pagination__prev`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/alerts.cy.js:173:39)&quot;},&quot;uuid&quot;:&quot;7cbecd4c-943a-4f49-a1d9-93faf27b79cf&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格操作列&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示表格操作列&quot;,&quot;duration&quot;:1189,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查操作列\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().should(&#x27;contain&#x27;, &#x27;暂挂起&#x27;);\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3025c20d-815e-47f6-88d1-53ba178315fc&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击暂挂起操作&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该能够点击暂挂起操作&quot;,&quot;duration&quot;:1325,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 点击暂挂起按钮\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).last().contains(&#x27;暂挂起&#x27;).click();\n });\n // 这里可以添加点击后的验证逻辑\n // 比如检查是否有弹窗、确认对话框等\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;b58b0f57-7baf-4b3a-b8f4-cba341cf1dbf&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示告警级别标识&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该显示告警级别标识&quot;,&quot;duration&quot;:2233,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 检查表格行\ncy.get(&#x27;.el-table__body tr&#x27;).then($rows =&gt; {\n if ($rows.length &gt; 0) {\n // 检查表格行是否有内容\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n // 检查是否有任何内容,不特定检查&#x27;level&#x27;\n cy.get(&#x27;td&#x27;).should(&#x27;have.length.greaterThan&#x27;, 0);\n });\n } else {\n // 如果没有数据行,记录日志\n cy.log(&#x27;表格中没有数据行&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;619f1fc5-dc74-4467-b4ef-35569092615c&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理表格数据加载&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理表格数据加载&quot;,&quot;duration&quot;:2188,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格数据加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;.el-table&#x27;).should(&#x27;be.visible&#x27;);\n// 验证表格有内容\ncy.get(&#x27;.el-table__body&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ca013074-ad1d-4f26-a77e-e9c392a79eae&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应搜索条件变化&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该响应搜索条件变化&quot;,&quot;duration&quot;:3682,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入搜索条件并查询\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;测试事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n// 清空搜索条件并查询\ncy.get(&#x27;.reset-btn-balck-theme&#x27;).click();\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待结果\ncy.wait(1000);\n// 验证页面正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1d4b4784-ec9e-4102-b4f9-8977194b34e3&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该检查响应式设计&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该检查响应式设计&quot;,&quot;duration&quot;:2715,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查不同屏幕尺寸下的显示\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n} // 平板\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件仍然可见\n cy.get(&#x27;.page-container&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.search&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;0b9a2582-304c-4f1e-8878-fa862695efc2&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:2556,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;input[placeholder=\&quot;请输入事件名称\&quot;]&#x27;).clear().type(&#x27;不存在的告警事件&#x27;);\ncy.get(&#x27;.search-btn-balck-theme&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证页面仍然正常显示\ncy.get(&#x27;.table-box&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;dd19005b-b470-4377-a311-4048a992e90e&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;告警总览功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:1205,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查表格头部\ncy.get(&#x27;.el-table__header&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部行\ncy.get(&#x27;.el-table__header tr&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格头部单元格\ncy.get(&#x27;.el-table__header th&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;614d4ab9-a48a-430c-9bc7-8775bba64e7b&quot;,&quot;parentUUID&quot;:&quot;c26ff21f-33ef-4b90-a990-f06317ff7a24&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;735479df-8ab4-469e-b7b1-1169bf3e7b34&quot;,&quot;448789bd-d866-4854-8c56-ee96500dc5a4&quot;,&quot;f76f8d72-e587-450b-8e29-75eb377637b0&quot;,&quot;a3f3ac5f-cba2-4909-b941-61716162723a&quot;,&quot;f4c48790-bde5-4415-abbe-a168c7693f23&quot;,&quot;aaf0114d-92b5-491b-92bb-4abf129b6c77&quot;,&quot;98b37d96-8124-46d8-a9be-d7e2e5974590&quot;,&quot;c1dee83c-07aa-491c-8aea-2be5abde8ebd&quot;,&quot;554ef38f-de50-4080-9a6e-47426d46f7ab&quot;,&quot;6c0b04f5-60da-4f3f-9aef-68b4e433a6fa&quot;,&quot;3025c20d-815e-47f6-88d1-53ba178315fc&quot;,&quot;b58b0f57-7baf-4b3a-b8f4-cba341cf1dbf&quot;,&quot;619f1fc5-dc74-4467-b4ef-35569092615c&quot;,&quot;ca013074-ad1d-4f26-a77e-e9c392a79eae&quot;,&quot;1d4b4784-ec9e-4102-b4f9-8977194b34e3&quot;,&quot;0b9a2582-304c-4f1e-8878-fa862695efc2&quot;,&quot;dd19005b-b470-4377-a311-4048a992e90e&quot;,&quot;614d4ab9-a48a-430c-9bc7-8775bba64e7b&quot;],&quot;failures&quot;:[&quot;baf19eec-bc93-40df-8003-c85e048627e1&quot;,&quot;7cbecd4c-943a-4f49-a1d9-93faf27b79cf&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:66179,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161143.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161143.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:13,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:12,&quot;start&quot;:&quot;2025-09-01T08:11:45.477Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:14:19.578Z&quot;,&quot;duration&quot;:154101,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:7.6923076923076925,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;bcf83216-5b42-4f23-94fd-580e8b1a5729&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-advanced.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;title&quot;:&quot;布袋周期管理高级功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确加载和显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该正确加载和显示表格数据&quot;,&quot;duration&quot;:2302,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待API请求完成\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证表格数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行数量\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 3);\n // 验证第一行数据\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n cy.get(&#x27;td&#x27;).eq(3).should(&#x27;contain&#x27;, &#x27;1排/1列&#x27;);\n cy.get(&#x27;td&#x27;).eq(4).should(&#x27;contain&#x27;, &#x27;2024-02-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(5).should(&#x27;contain&#x27;, &#x27;2024-01-15&#x27;);\n cy.get(&#x27;td&#x27;).eq(6).should(&#x27;contain&#x27;, &#x27;张三&#x27;);\n cy.get(&#x27;td&#x27;).eq(7).should(&#x27;contain&#x27;, &#x27;30天&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:52:7)&quot;},&quot;uuid&quot;:&quot;7f593ac9-16d3-42f2-bcb4-d36dcb1529cb&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行精确搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够进行精确搜索&quot;,&quot;duration&quot;:2287,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 1,\n dusterName: &#x27;1#除尘器&#x27;,\n compart: &#x27;A仓室&#x27;,\n bagLocation: &#x27;1排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-15 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-15 10:00:00&#x27;,\n bagChangeAuthor: &#x27;张三&#x27;,\n bagChangePeriod: &#x27;30天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;searchCollectorList&#x27;);\n// 输入搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;A仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;1#除尘器&#x27;);\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@searchCollectorList&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;1#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;A仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:74:7)&quot;},&quot;uuid&quot;:&quot;dd9941fb-497a-4f94-bf1d-8ac54c03024c&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理分页功能&quot;,&quot;duration&quot;:2285,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟第二页数据\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*pageNo=2*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 4,\n dusterName: &#x27;4#除尘器&#x27;,\n compart: &#x27;D仓室&#x27;,\n bagLocation: &#x27;2排/2列&#x27;,\n bagChangeNextTime: &#x27;2024-03-01 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-02-01 10:00:00&#x27;,\n bagChangeAuthor: &#x27;赵六&#x27;,\n bagChangePeriod: &#x27;28天&#x27;\n }],\n total: 4,\n pageNo: 2,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;getPage2Data&#x27;);\n// 点击下一页\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-pagination .btn-next&#x27;).click();\n});\n// 等待第二页数据加载\ncy.wait(&#x27;@getPage2Data&#x27;);\n// 验证第二页数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n cy.get(&#x27;.el-table__body tr&#x27;).first().within(() =&gt; {\n cy.get(&#x27;td&#x27;).eq(1).should(&#x27;contain&#x27;, &#x27;4#除尘器&#x27;);\n cy.get(&#x27;td&#x27;).eq(2).should(&#x27;contain&#x27;, &#x27;D仓室&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:124:7)&quot;},&quot;uuid&quot;:&quot;d009e7c6-7d98-42a1-848a-e143c8335264&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开并操作分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够打开并操作分析对话框&quot;,&quot;duration&quot;:2289,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\ncy.wait(&#x27;@getDusterList&#x27;);\ncy.wait(&#x27;@getAnalysisData&#x27;);\n// 双击除尘器名称打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 测试除尘器切换\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).eq(1).click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);\n// 关闭对话框\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:172:7)&quot;},&quot;uuid&quot;:&quot;3ed18c6d-fbae-4825-aea3-6ebc49726672&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理日期范围搜索&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理日期范围搜索&quot;,&quot;duration&quot;:2278,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟日期搜索API响应\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [{\n id: 2,\n dusterName: &#x27;2#除尘器&#x27;,\n compart: &#x27;B仓室&#x27;,\n bagLocation: &#x27;2排/1列&#x27;,\n bagChangeNextTime: &#x27;2024-02-20 10:00:00&#x27;,\n bagChangeTime: &#x27;2024-01-20 10:00:00&#x27;,\n bagChangeAuthor: &#x27;李四&#x27;,\n bagChangePeriod: &#x27;25天&#x27;\n }],\n total: 1,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;dateSearchResult&#x27;);\n// 设置日期范围\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择日期范围(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(5).click();\n});\n// 点击搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@dateSearchResult&#x27;);\n// 验证搜索结果\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body tr&#x27;).should(&#x27;have.length&#x27;, 1);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:208:7)&quot;},&quot;uuid&quot;:&quot;b3131ddf-e7cc-4db8-9a07-edec74c26482&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理空搜索结果&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理空搜索结果&quot;,&quot;duration&quot;:2278,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 模拟空搜索结果\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage*&#x27;, {\n statusCode: 200,\n body: {\n code: 200,\n data: {\n records: [],\n total: 0,\n pageNo: 1,\n pageSize: 20\n },\n message: &#x27;success&#x27;\n }\n}).as(&#x27;emptySearchResult&#x27;);\n// 输入不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(&#x27;@emptySearchResult&#x27;);\n// 验证空数据状态\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有空数据提示或空表格\n cy.get(&#x27;.el-table__body&#x27;).should(&#x27;exist&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:262:7)&quot;},&quot;uuid&quot;:&quot;5c31fc4a-814b-4f56-b4c8-e46fa2643639&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够处理API错误&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该能够处理API错误&quot;,&quot;duration&quot;:17401,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟API错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;\n }\n}).as(&#x27;apiError&#x27;);\n// 刷新页面或触发搜索\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@apiError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `apiError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:308:7)&quot;},&quot;uuid&quot;:&quot;2edfd176-2748-4b56-83b8-ba07df9435d1&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格排序功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格排序功能&quot;,&quot;duration&quot;:2303,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查表格列头是否可点击(排序功能)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查除尘器名称列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;除尘器名称&#x27;).should(&#x27;be.visible&#x27;);\n // 检查仓室列是否可以排序\n cy.get(&#x27;.el-table__header th&#x27;).contains(&#x27;仓室&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:317:7)&quot;},&quot;uuid&quot;:&quot;ef5a97d4-ec20-444d-aae9-3ad6efa0e9a5&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的完整性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格数据的完整性&quot;,&quot;duration&quot;:2273,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证所有必需的列都存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n const expectedColumns = [&#x27;序号&#x27;, &#x27;除尘器名称&#x27;, &#x27;仓室&#x27;, &#x27;布袋位置(排/列)&#x27;, &#x27;布袋更换提醒时间&#x27;, &#x27;更换时间&#x27;, &#x27;更换人&#x27;, &#x27;更换周期(与上次更换比)&#x27;];\n expectedColumns.forEach(columnName =&gt; {\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, columnName);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:331:7)&quot;},&quot;uuid&quot;:&quot;b0feed85-9923-4e8d-8954-2b3c4a5bf6d4&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证除尘器名称链接的交互性&quot;,&quot;duration&quot;:2314,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 验证除尘器名称链接的样式和交互\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);\n// 验证链接可以点击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.css&#x27;, &#x27;cursor&#x27;, &#x27;pointer&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:354:7)&quot;},&quot;uuid&quot;:&quot;93f9d9d1-587d-4a7f-bf9e-a8140579e6f6&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面性能指标&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证页面性能指标&quot;,&quot;duration&quot;:2282,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待页面完全加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 检查页面性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证DOM内容加载时间\n expect(navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart).to.be.lessThan(3000);\n // 验证页面完全加载时间\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:366:7)&quot;},&quot;uuid&quot;:&quot;c72b9b22-9dbf-49fa-8afe-03a5b963b827&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的验证功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证搜索表单的验证功能&quot;,&quot;duration&quot;:25814,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;slow&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的最大长度限制\nconst longText = &#x27;a&#x27;.repeat(1000);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(longText);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, longText);\n// 清除输入\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;09b605c4-d334-449b-a516-d375583a18af&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格的响应式布局&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理高级功能测试 应该验证表格的响应式布局&quot;,&quot;duration&quot;:2279,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待初始数据加载\ncy.wait(&#x27;@getCollectorList&#x27;);\n// 测试不同屏幕尺寸下的表格显示\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 768,\n height: 1024\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证表格在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n // 验证表格内容可以滚动(如果需要)\n cy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.&quot;,&quot;estack&quot;:&quot;CypressError: `cy.wait()` could not find a registered alias for: `@getCollectorList`.\nYou have not aliased anything yet.\n at $Cy.aliasNotFoundFor (http://localhost:3000/__cypress/runner/cypress_runner.js:132315:66)\n at $Cy.getAlias (http://localhost:3000/__cypress/runner/cypress_runner.js:132258:12)\n at waitForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135391:23)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135494:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at MappingPromiseArray._promiseFulfilled (http://localhost:3000/__cypress/runner/cypress_runner.js:4970:38)\n at PromiseArray._iterate (http://localhost:3000/__cypress/runner/cypress_runner.js:2943:31)\n at MappingPromiseArray.init (http://localhost:3000/__cypress/runner/cypress_runner.js:2907:10)\n at MappingPromiseArray._asyncInit (http://localhost:3000/__cypress/runner/cypress_runner.js:4939:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at Async.drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-advanced.cy.js:398:7)&quot;},&quot;uuid&quot;:&quot;2e4d1313-9023-4167-b21f-4a19ce521b45&quot;,&quot;parentUUID&quot;:&quot;f7f44eec-44e1-4e80-ad99-8904ff234162&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;09b605c4-d334-449b-a516-d375583a18af&quot;],&quot;failures&quot;:[&quot;7f593ac9-16d3-42f2-bcb4-d36dcb1529cb&quot;,&quot;dd9941fb-497a-4f94-bf1d-8ac54c03024c&quot;,&quot;d009e7c6-7d98-42a1-848a-e143c8335264&quot;,&quot;3ed18c6d-fbae-4825-aea3-6ebc49726672&quot;,&quot;b3131ddf-e7cc-4db8-9a07-edec74c26482&quot;,&quot;5c31fc4a-814b-4f56-b4c8-e46fa2643639&quot;,&quot;2edfd176-2748-4b56-83b8-ba07df9435d1&quot;,&quot;ef5a97d4-ec20-444d-aae9-3ad6efa0e9a5&quot;,&quot;b0feed85-9923-4e8d-8954-2b3c4a5bf6d4&quot;,&quot;93f9d9d1-587d-4a7f-bf9e-a8140579e6f6&quot;,&quot;c72b9b22-9dbf-49fa-8afe-03a5b963b827&quot;,&quot;2e4d1313-9023-4167-b21f-4a19ce521b45&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:68385,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161419.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161419.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:7,&quot;pending&quot;:0,&quot;failures&quot;:3,&quot;start&quot;:&quot;2025-09-01T08:14:21.529Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:16:48.148Z&quot;,&quot;duration&quot;:146619,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:70,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;d035bbc7-4f7a-48e7-9ebb-13631cd4bd72&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list-simple.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;title&quot;:&quot;布袋周期管理简化测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确显示页面组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该正确显示页面组件&quot;,&quot;duration&quot;:849,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面组件\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2925a0b7-c65e-4c7a-a860-8c2fcf775424&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证搜索表单字段&quot;,&quot;duration&quot;:15371,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证搜索表单字段\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list-simple.cy.js:24:52)&quot;},&quot;uuid&quot;:&quot;2c60355b-61e5-4423-8b49-fd7b98e67ff1&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1894,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令进行搜索\ncy.searchCollectorData(&#x27;测试仓室&#x27;, &#x27;测试除尘器&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7f8823c2-ab93-4a4a-ae81-93c2dd7f512f&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:689,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 使用自定义命令重置\ncy.resetCollectorSearch();\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;403ef70c-9ff6-4b8f-965c-2080ef4e5f2e&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够打开分析对话框&quot;,&quot;duration&quot;:15633,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令打开对话框\ncy.openAnalysisDialog(&#x27;button&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;75b89ac3-39a1-4be8-8a18-ddb428cd2272&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过双击除尘器名称打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该能够通过双击除尘器名称打开对话框&quot;,&quot;duration&quot;:15727,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令通过双击打开对话框\ncy.openAnalysisDialog(&#x27;dblclick&#x27;);\n// 关闭对话框\ncy.closeAnalysisDialog();&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/support/commands.js:177:28)&quot;},&quot;uuid&quot;:&quot;956a5ad9-c086-45ef-8446-3ee6b7c3fc84&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证表格列标题&quot;,&quot;duration&quot;:310,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用自定义命令验证表格列标题\ncy.verifyCollectorTableHeaders();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;fe462515-6592-453e-b931-07aeba86220e&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:1753,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 使用现有的响应式检查命令\ncy.checkResponsive();&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;94c08a3e-cbb3-42ef-b995-993fc94e8823&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证除尘器名称链接样式&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证除尘器名称链接样式&quot;,&quot;duration&quot;:463,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;3e16086d-a66d-4ce3-9317-cd59b8a92ed8&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理简化测试 应该验证页面加载性能&quot;,&quot;duration&quot;:240,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 验证页面加载性能\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5fb6fd80-0610-46ce-8e28-3ef65e81ff9f&quot;,&quot;parentUUID&quot;:&quot;8e059df1-c030-45e3-8adf-ddc3738fd725&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;2925a0b7-c65e-4c7a-a860-8c2fcf775424&quot;,&quot;7f8823c2-ab93-4a4a-ae81-93c2dd7f512f&quot;,&quot;403ef70c-9ff6-4b8f-965c-2080ef4e5f2e&quot;,&quot;fe462515-6592-453e-b931-07aeba86220e&quot;,&quot;94c08a3e-cbb3-42ef-b995-993fc94e8823&quot;,&quot;3e16086d-a66d-4ce3-9317-cd59b8a92ed8&quot;,&quot;5fb6fd80-0610-46ce-8e28-3ef65e81ff9f&quot;],&quot;failures&quot;:[&quot;2c60355b-61e5-4423-8b49-fd7b98e67ff1&quot;,&quot;75b89ac3-39a1-4be8-8a18-ddb428cd2272&quot;,&quot;956a5ad9-c086-45ef-8446-3ee6b7c3fc84&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:52929,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161648.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_161648.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:19,&quot;passes&quot;:14,&quot;pending&quot;:0,&quot;failures&quot;:5,&quot;start&quot;:&quot;2025-09-01T08:16:50.081Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:20:53.438Z&quot;,&quot;duration&quot;:243357,&quot;testsRegistered&quot;:19,&quot;passPercent&quot;:73.68421052631578,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;ceb9ed3c-6c9f-49f3-b623-a393901a1236&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/collector-list.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;title&quot;:&quot;布袋周期管理功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示布袋周期页面的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示布袋周期页面的所有核心组件&quot;,&quot;duration&quot;:821,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查内容区域\ncy.get(&#x27;[data-testid=\&quot;collector-list-content\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查搜索表单\ncy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格容器\ncy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查通用表格组件\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;f56b6b82-e68f-4b6d-9b56-9bcc71204bb2&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示搜索表单的所有输入字段&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示搜索表单的所有输入字段&quot;,&quot;duration&quot;:15388,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查仓室输入框\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入仓室名称&#x27;);\n// 检查除尘器名称输入框\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;have.attr&#x27;, &#x27;placeholder&#x27;, &#x27;请输入除尘器名称&#x27;);\n// 检查日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:44:52)&quot;},&quot;uuid&quot;:&quot;a93521d3-819f-4524-990c-14462ee93017&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够进行搜索操作&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够进行搜索操作&quot;,&quot;duration&quot;:1927,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入仓室名称\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear().type(&#x27;测试仓室&#x27;);\n// 输入除尘器名称\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear().type(&#x27;测试除尘器&#x27;);\n// 点击查询按钮\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果加载\ncy.wait(1000);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;02b518a6-65c4-4b44-8dd1-d83188bfab51&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够重置搜索条件&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够重置搜索条件&quot;,&quot;duration&quot;:690,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 先输入一些搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试数据&#x27;);\n// 点击重置按钮\ncy.get(&#x27;[data-testid=\&quot;collector-reset-button\&quot;]&#x27;).click();\n// 验证输入框已清空\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\n// 验证表格仍然可见\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;12ca1272-ab21-4063-b9b1-9a733720ec36&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够设置日期范围&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够设置日期范围&quot;,&quot;duration&quot;:15380,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击日期选择器\ncy.get(&#x27;[data-testid=\&quot;collector-date-picker\&quot;]&#x27;).click();\n// 等待日期选择器弹出\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;be.visible&#x27;);\n// 选择开始日期(这里需要根据实际的日期选择器实现调整)\ncy.get(&#x27;.el-picker-panel&#x27;).within(() =&gt; {\n // 选择今天的日期作为开始日期\n cy.get(&#x27;.el-date-table td.available&#x27;).first().click();\n // 选择明天的日期作为结束日期\n cy.get(&#x27;.el-date-table td.available&#x27;).eq(1).click();\n});\n// 验证日期选择器关闭\ncy.get(&#x27;.el-picker-panel&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected to find element: `[data-testid=\&quot;collector-date-picker\&quot;]`, but never found it.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:91:7)&quot;},&quot;uuid&quot;:&quot;d0053d2e-7d26-4856-b306-a89d9b8f735f&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示表格数据&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该显示表格数据&quot;,&quot;duration&quot;:279,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格是否有数据行\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查表格行是否存在(即使为空数据)\n cy.get(&#x27;.el-table__body-wrapper&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;4561f0e2-0bfa-4d32-aec3-09149678c84d&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够点击除尘器名称打开分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够点击除尘器名称打开分析对话框&quot;,&quot;duration&quot;:572,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 查找除尘器名称链接并双击\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().dblclick();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);\n// 验证对话框内容\ncy.get(&#x27;.dustListDialog&#x27;).within(() =&gt; {\n // 检查除尘器名称选择器\n cy.get(&#x27;.input-group&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;.el-select&#x27;).should(&#x27;be.visible&#x27;);\n // 检查图表区域\n cy.get(&#x27;.echartBox&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;659ab643-cf7f-4d2b-b354-83121d6377d1&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够通过分析按钮打开对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够通过分析按钮打开对话框&quot;,&quot;duration&quot;:323,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 点击更换周期分析按钮\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\n// 验证对话框打开\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;.el-dialog__title&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期分析&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;92d73050-733b-43b9-a397-7322dc8b0ee7&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够关闭分析对话框&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够关闭分析对话框&quot;,&quot;duration&quot;:15595,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击关闭按钮\ncy.get(&#x27;.dustListDialog .el-dialog__headerbtn&#x27;).click();\n// 验证对话框关闭\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: Expected &lt;div.el-dialog.dustListDialog&gt; not to exist in the DOM, but it was continuously found.\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:160:30)&quot;},&quot;uuid&quot;:&quot;d135d91d-a6df-4d7a-b723-0f00f4e0f40b&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该能够切换除尘器选择&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该能够切换除尘器选择&quot;,&quot;duration&quot;:15625,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 打开对话框\ncy.get(&#x27;[data-testid=\&quot;collector-analysis-button\&quot;]&#x27;).click();\ncy.get(&#x27;.dustListDialog&#x27;).should(&#x27;be.visible&#x27;);\n// 点击除尘器选择器\ncy.get(&#x27;.dustListDialog .el-select&#x27;).click();\n// 等待下拉选项出现\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;be.visible&#x27;);\n// 选择第一个选项(如果存在)\ncy.get(&#x27;.el-select-dropdown .el-select-dropdown__item&#x27;).first().click();\n// 验证选择器关闭\ncy.get(&#x27;.el-select-dropdown&#x27;).should(&#x27;not.exist&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-7002-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-7002-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-7002-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15050ms: `cy.click()` failed because this element is not visible:\n\n`&lt;li id=\&quot;el-id-7002-10\&quot; class=\&quot;el-select-dropdown__item\&quot; role=\&quot;option\&quot; aria-selected=\&quot;false\&quot;&gt;...&lt;/li&gt;`\n\nThis element `&lt;li#el-id-7002-10.el-select-dropdown__item&gt;` is not visible because its parent `&lt;div#el-id-7002-9.el-popper.is-pure.is-light.el-tooltip.el-select__popper&gt;` has CSS property: `display: none`\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isStrictlyVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144971:10)\n at runAllChecks (http://localhost:3000/__cypress/runner/cypress_runner.js:113271:26)\n at retryActionability (http://localhost:3000/__cypress/runner/cypress_runner.js:113339:16)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:175:68)&quot;},&quot;uuid&quot;:&quot;96462f95-77ba-4629-a091-e3ff28894913&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格分页功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格分页功能&quot;,&quot;duration&quot;:296,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查分页组件是否存在\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 查找分页组件\n cy.get(&#x27;.el-pagination&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1532e072-e3fb-472d-8fbd-1112a50c0ac8&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格列标题&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格列标题&quot;,&quot;duration&quot;:268,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查表格列标题\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).within(() =&gt; {\n // 检查主要列标题\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;序号&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;除尘器名称&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;仓室&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋位置(排/列)&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;布袋更换提醒时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换时间&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换人&#x27;);\n cy.get(&#x27;.el-table__header&#x27;).should(&#x27;contain&#x27;, &#x27;更换周期(与上次更换比)&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;d1fd767d-99fa-4fc2-b5ed-f23e1e22325a&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理空数据状态&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该处理空数据状态&quot;,&quot;duration&quot;:1531,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 输入一个不存在的搜索条件\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;不存在的仓室&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待搜索结果\ncy.wait(1000);\n// 验证表格仍然可见(即使没有数据)\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e9327791-7939-4882-9230-70902155dcce&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面响应式设计&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面响应式设计&quot;,&quot;duration&quot;:309,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸\nconst viewports = [{\n width: 1920,\n height: 1080\n},\n// 桌面\n{\n width: 1280,\n height: 720\n},\n// 笔记本\n{\n width: 768,\n height: 1024\n},\n// 平板\n{\n width: 375,\n height: 667\n} // 手机\n];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n // 验证主要组件仍然可见\n cy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-list-search-form\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;collector-table-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;7db59e87-0f51-49bb-9e8a-7cde62eac04d&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证搜索表单的输入验证&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证搜索表单的输入验证&quot;,&quot;duration&quot;:805,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试输入框的清除功能\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-compart-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).type(&#x27;测试输入&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).clear();\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-input\&quot;]&#x27;).should(&#x27;have.value&#x27;, &#x27;&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;45e27cd4-40e4-47d1-9ea4-bb79b086f712&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证表格数据的交互性&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证表格数据的交互性&quot;,&quot;duration&quot;:509,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待表格加载\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查除尘器名称链接的样式\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;health-score&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-duster-name-link\&quot;]&#x27;).first().should(&#x27;have.class&#x27;, &#x27;green-color&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;770d88f7-a2a2-41bb-832a-36649d7d4c79&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证页面加载性能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证页面加载性能&quot;,&quot;duration&quot;:255,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录页面加载时间\ncy.window().then(win =&gt; {\n const performance = win.performance;\n const navigation = performance.getEntriesByType(&#x27;navigation&#x27;)[0];\n // 验证页面加载时间在合理范围内(小于10秒)\n expect(navigation.loadEventEnd - navigation.loadEventStart).to.be.lessThan(10000);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1d8685e8-a851-4887-9a22-3adf29acbde4&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证错误处理&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证错误处理&quot;,&quot;duration&quot;:15490,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误(通过拦截API请求)\ncy.intercept(&#x27;GET&#x27;, &#x27;**/bag/cycle/getReplaceListPage&#x27;, {\n statusCode: 500,\n body: {\n error: &#x27;服务器错误&#x27;\n }\n}).as(&#x27;getCollectorListError&#x27;);\n// 触发搜索操作\ncy.get(&#x27;[data-testid=\&quot;collector-search-button\&quot;]&#x27;).click();\n// 等待错误响应\ncy.wait(&#x27;@getCollectorListError&#x27;);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait&quot;,&quot;estack&quot;:&quot;CypressError: Timed out retrying after 15000ms: `cy.wait()` timed out waiting `15000ms` for the 1st request to the route: `getCollectorListError`. No request ever occurred.\n\nhttps://on.cypress.io/wait\n at cypressErr (http://localhost:3000/__cypress/runner/cypress_runner.js:76065:18)\n at Object.errByPath (http://localhost:3000/__cypress/runner/cypress_runner.js:76119:10)\n at checkForXhr (http://localhost:3000/__cypress/runner/cypress_runner.js:135342:84)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:135368:28)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise.attempt.Promise.try (http://localhost:3000/__cypress/runner/cypress_runner.js:4338:29)\n at whenStable (http://localhost:3000/__cypress/runner/cypress_runner.js:143744:68)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:143685:14)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromise0 (http://localhost:3000/__cypress/runner/cypress_runner.js:1644:10)\n at Promise._settlePromises (http://localhost:3000/__cypress/runner/cypress_runner.js:1724:18)\n at Promise._fulfill (http://localhost:3000/__cypress/runner/cypress_runner.js:1668:18)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:5473:46)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/collector-list.cy.js:283:7)&quot;},&quot;uuid&quot;:&quot;3cb9113c-9930-4b97-a208-6a32d70dc04e&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证数据刷新功能&quot;,&quot;fullTitle&quot;:&quot;布袋周期管理功能测试 应该验证数据刷新功能&quot;,&quot;duration&quot;:2278,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始数据\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 等待一段时间后验证页面仍然响应\ncy.wait(2000);\n// 验证页面仍然可用\ncy.get(&#x27;[data-testid=\&quot;collector-list-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;collector-common-table\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;720b6db3-0997-4491-8cf5-31b9618fa001&quot;,&quot;parentUUID&quot;:&quot;9c37de1b-967a-4dc8-ac81-bc535594f0e9&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;f56b6b82-e68f-4b6d-9b56-9bcc71204bb2&quot;,&quot;02b518a6-65c4-4b44-8dd1-d83188bfab51&quot;,&quot;12ca1272-ab21-4063-b9b1-9a733720ec36&quot;,&quot;4561f0e2-0bfa-4d32-aec3-09149678c84d&quot;,&quot;659ab643-cf7f-4d2b-b354-83121d6377d1&quot;,&quot;92d73050-733b-43b9-a397-7322dc8b0ee7&quot;,&quot;1532e072-e3fb-472d-8fbd-1112a50c0ac8&quot;,&quot;d1fd767d-99fa-4fc2-b5ed-f23e1e22325a&quot;,&quot;e9327791-7939-4882-9230-70902155dcce&quot;,&quot;7db59e87-0f51-49bb-9e8a-7cde62eac04d&quot;,&quot;45e27cd4-40e4-47d1-9ea4-bb79b086f712&quot;,&quot;770d88f7-a2a2-41bb-832a-36649d7d4c79&quot;,&quot;1d8685e8-a851-4887-9a22-3adf29acbde4&quot;,&quot;720b6db3-0997-4491-8cf5-31b9618fa001&quot;],&quot;failures&quot;:[&quot;a93521d3-819f-4524-990c-14462ee93017&quot;,&quot;d0053d2e-7d26-4856-b306-a89d9b8f735f&quot;,&quot;d135d91d-a6df-4d7a-b723-0f00f4e0f40b&quot;,&quot;96462f95-77ba-4629-a091-e3ff28894913&quot;,&quot;3cb9113c-9930-4b97-a208-6a32d70dc04e&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:88341,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162053.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162053.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:8,&quot;tests&quot;:13,&quot;passes&quot;:3,&quot;pending&quot;:0,&quot;failures&quot;:10,&quot;start&quot;:&quot;2025-09-01T08:20:55.419Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:20:58.957Z&quot;,&quot;duration&quot;:3538,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:23.076923076923077,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;f904e7f0-89e1-4ae3-bb24-a09afc3e2fb0&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;be99f3c8-02a3-4425-b8eb-2a0b08cd24d3&quot;,&quot;title&quot;:&quot;首页API接口正确性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;ccdec70a-8206-470b-a2f3-d8b4008e9166&quot;,&quot;title&quot;:&quot;健康度概览接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度概览数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该成功获取健康度概览数据&quot;,&quot;duration&quot;:89,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证数据结构(如果有数据)\n if (response.body.data) {\n const data = response.body.data;\n // 健康度数据应该包含数值类型的字段\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的健康度字段\n if (data.average !== undefined) {\n expect(data.average).to.be.a(&#x27;number&#x27;);\n expect(data.average).to.be.at.least(0);\n expect(data.average).to.be.at.most(100);\n }\n if (data.bag !== undefined) {\n expect(data.bag).to.be.a(&#x27;number&#x27;);\n expect(data.bag).to.be.at.least(0);\n expect(data.bag).to.be.at.most(100);\n }\n if (data.pulseValve !== undefined) {\n expect(data.pulseValve).to.be.a(&#x27;number&#x27;);\n expect(data.pulseValve).to.be.at.least(0);\n expect(data.pulseValve).to.be.at.most(100);\n }\n if (data.poppetValve !== undefined) {\n expect(data.poppetValve).to.be.a(&#x27;number&#x27;);\n expect(data.poppetValve).to.be.at.least(0);\n expect(data.poppetValve).to.be.at.most(100);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:41:38)&quot;},&quot;uuid&quot;:&quot;5f541378-95ea-4433-955f-89d88825483d&quot;,&quot;parentUUID&quot;:&quot;ccdec70a-8206-470b-a2f3-d8b4008e9166&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度概览接口的错误响应&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该处理健康度概览接口的错误响应&quot;,&quot;duration&quot;:71,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟服务器错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;,\n data: null\n }\n}).as(&#x27;healthOverviewError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(500);\n expect(response.body.code).to.equal(500);\n expect(response.body.message).to.contain(&#x27;错误&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected 200 to equal 500&quot;,&quot;estack&quot;:&quot;AssertionError: expected 200 to equal 500\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:105:35)&quot;,&quot;diff&quot;:&quot;- 200\n+ 500\n&quot;},&quot;uuid&quot;:&quot;54b82946-8d50-436b-a297-e9e1b8a735fa&quot;,&quot;parentUUID&quot;:&quot;ccdec70a-8206-470b-a2f3-d8b4008e9166&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;5f541378-95ea-4433-955f-89d88825483d&quot;,&quot;54b82946-8d50-436b-a297-e9e1b8a735fa&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:160,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;f0ee2598-2c65-47d9-8b98-8562daacb308&quot;,&quot;title&quot;:&quot;健康度统计接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度统计数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该成功获取健康度统计数据&quot;,&quot;duration&quot;:103,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证图表数据结构\n if (response.body.data) {\n const data = response.body.data;\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的图表数据字段\n if (data.xAxis) {\n expect(data.xAxis).to.be.an(&#x27;array&#x27;);\n }\n if (data.series) {\n expect(data.series).to.be.an(&#x27;array&#x27;);\n }\n if (data.categories) {\n expect(data.categories).to.be.an(&#x27;array&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:126:38)&quot;},&quot;uuid&quot;:&quot;ea52aee5-a882-4414-83ef-79b46f91835f&quot;,&quot;parentUUID&quot;:&quot;f0ee2598-2c65-47d9-8b98-8562daacb308&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度统计接口的超时&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该处理健康度统计接口的超时&quot;,&quot;duration&quot;:77,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟超时\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/statistic&#x27;, req =&gt; {\n req.reply(res =&gt; {\n return new Promise(resolve =&gt; {\n setTimeout(() =&gt; resolve(res.send({\n statusCode: 408\n })), 6000);\n });\n });\n}).as(&#x27;healthStatisticTimeout&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n timeout: 5000,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该处理超时情况\n expect([408, 504]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:178:30)&quot;},&quot;uuid&quot;:&quot;abc86932-8c90-4274-ad7f-b684b6af2d57&quot;,&quot;parentUUID&quot;:&quot;f0ee2598-2c65-47d9-8b98-8562daacb308&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;ea52aee5-a882-4414-83ef-79b46f91835f&quot;,&quot;abc86932-8c90-4274-ad7f-b684b6af2d57&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:180,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;ac87726d-8cdf-425e-9731-6366c2cece42&quot;,&quot;title&quot;:&quot;异常监控接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取异常监控数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该成功获取异常监控数据&quot;,&quot;duration&quot;:102,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证异常监控数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的异常监控字段\n if (item.time) {\n expect(item.time).to.be.a(&#x27;string&#x27;);\n }\n if (item.level) {\n expect(item.level).to.be.a(&#x27;string&#x27;);\n }\n if (item.message) {\n expect(item.message).to.be.a(&#x27;string&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:197:38)&quot;},&quot;uuid&quot;:&quot;472c0634-e171-4d70-b9ae-f22980b0647f&quot;,&quot;parentUUID&quot;:&quot;ac87726d-8cdf-425e-9731-6366c2cece42&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证异常监控数据的完整性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该验证异常监控数据的完整性&quot;,&quot;duration&quot;:35,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n // 验证数据量合理性\n expect(data.length).to.be.at.most(1000); // 单次返回不超过1000条\n // 验证时间戳格式(如果存在)\n data.forEach(item =&gt; {\n if (item.timestamp) {\n expect(new Date(item.timestamp).getTime()).to.be.a(&#x27;number&#x27;);\n }\n if (item.createTime) {\n expect(new Date(item.createTime).getTime()).to.be.a(&#x27;number&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;6b922783-ab7a-4cfc-9b09-71c849a6894f&quot;,&quot;parentUUID&quot;:&quot;ac87726d-8cdf-425e-9731-6366c2cece42&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;6b922783-ab7a-4cfc-9b09-71c849a6894f&quot;],&quot;failures&quot;:[&quot;472c0634-e171-4d70-b9ae-f22980b0647f&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:137,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;fd70ae62-76b8-4b61-920d-1de9dcd59050&quot;,&quot;title&quot;:&quot;除尘器告警接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取除尘器告警数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该成功获取除尘器告警数据&quot;,&quot;duration&quot;:117,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证告警数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的告警字段\n if (item.alarmLevel) {\n expect(item.alarmLevel).to.be.a(&#x27;string&#x27;);\n }\n if (item.alarmType) {\n expect(item.alarmType).to.be.a(&#x27;string&#x27;);\n }\n if (item.deviceName) {\n expect(item.deviceName).to.be.a(&#x27;string&#x27;);\n }\n if (item.location) {\n expect(item.location).to.be.an(&#x27;object&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:282:38)&quot;},&quot;uuid&quot;:&quot;dad163f8-72bc-4492-a595-b9972967b443&quot;,&quot;parentUUID&quot;:&quot;fd70ae62-76b8-4b61-920d-1de9dcd59050&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证告警数据的地理位置信息&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该验证告警数据的地理位置信息&quot;,&quot;duration&quot;:44,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n data.forEach(item =&gt; {\n // 验证地理位置信息\n if (item.location) {\n const location = item.location;\n if (location.latitude) {\n expect(location.latitude).to.be.a(&#x27;number&#x27;);\n expect(location.latitude).to.be.at.least(-90);\n expect(location.latitude).to.be.at.most(90);\n }\n if (location.longitude) {\n expect(location.longitude).to.be.a(&#x27;number&#x27;);\n expect(location.longitude).to.be.at.least(-180);\n expect(location.longitude).to.be.at.most(180);\n }\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;43f10f02-0c6d-4871-953d-cdfeb77dfb19&quot;,&quot;parentUUID&quot;:&quot;fd70ae62-76b8-4b61-920d-1de9dcd59050&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;43f10f02-0c6d-4871-953d-cdfeb77dfb19&quot;],&quot;failures&quot;:[&quot;dad163f8-72bc-4492-a595-b9972967b443&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:161,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;22b93a42-b0b9-4353-aebf-e7b9001a688f&quot;,&quot;title&quot;:&quot;接口并发访问测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该能够同时访问所有首页接口&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口并发访问测试 应该能够同时访问所有首页接口&quot;,&quot;duration&quot;:61,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;const requests = [cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n})];\n// 并发执行所有请求\nCypress.Promise.all(requests).then(responses =&gt; {\n // 验证所有请求都成功\n responses.forEach((response, index) =&gt; {\n expect(response.status).to.equal(200);\n expect(response.body.code).to.equal(200);\n // 验证响应时间合理\n expect(response.duration).to.be.lessThan(10000);\n });\n // 验证总体响应时间\n const totalTime = responses.reduce((sum, resp) =&gt; sum + resp.duration, 0);\n expect(totalTime).to.be.lessThan(20000); // 总时间不超过20秒\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1255b52b-8a11-40fa-a945-3c7b35014a22&quot;,&quot;parentUUID&quot;:&quot;22b93a42-b0b9-4353-aebf-e7b9001a688f&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;1255b52b-8a11-40fa-a945-3c7b35014a22&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:61,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;89d2ea35-46a4-40bd-99f4-24223185c2d4&quot;,&quot;title&quot;:&quot;接口错误处理测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确处理无效的TOKEN&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理无效的TOKEN&quot;,&quot;duration&quot;:112,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: &#x27;invalid_token_12345&#x27;,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:417:30)&quot;},&quot;uuid&quot;:&quot;e609baa9-83bc-41ca-8231-f656524e710b&quot;,&quot;parentUUID&quot;:&quot;89d2ea35-46a4-40bd-99f4-24223185c2d4&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理缺少TOKEN的请求&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理缺少TOKEN的请求&quot;,&quot;duration&quot;:90,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:431:30)&quot;},&quot;uuid&quot;:&quot;f4ae741c-2ec9-4aac-bbce-0ac91e42d8a4&quot;,&quot;parentUUID&quot;:&quot;89d2ea35-46a4-40bd-99f4-24223185c2d4&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理网络错误&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理网络错误&quot;,&quot;duration&quot;:95,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n forceNetworkError: true\n}).as(&#x27;networkError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n retryOnNetworkFailure: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 网络错误应该被正确处理\n expect(response).to.exist;\n}).catch(error =&gt; {\n // 或者抛出网络错误异常\n expect(error.message).to.contain(&#x27;network&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function&quot;,&quot;estack&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:453:16)&quot;},&quot;uuid&quot;:&quot;0a0aa681-c28c-47c4-9f22-5cc536d38b8c&quot;,&quot;parentUUID&quot;:&quot;89d2ea35-46a4-40bd-99f4-24223185c2d4&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;e609baa9-83bc-41ca-8231-f656524e710b&quot;,&quot;f4ae741c-2ec9-4aac-bbce-0ac91e42d8a4&quot;,&quot;0a0aa681-c28c-47c4-9f22-5cc536d38b8c&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:297,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;a909b601-5217-4989-b373-7ee1ebac8ed1&quot;,&quot;title&quot;:&quot;接口数据一致性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该验证多次调用返回数据的一致性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口数据一致性测试 应该验证多次调用返回数据的一致性&quot;,&quot;duration&quot;:127,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;let firstResponse;\n// 第一次调用\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n firstResponse = response.body;\n expect(response.status).to.equal(200);\n}).then(() =&gt; {\n // 短时间内第二次调用\n cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n }).then(response =&gt; {\n expect(response.status).to.equal(200);\n // 验证数据结构一致性\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证数据类型一致性\n if (firstResponse.data &amp;&amp; response.body.data) {\n expect(typeof response.body.data).to.equal(typeof firstResponse.data);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:488:40)&quot;},&quot;uuid&quot;:&quot;ef94511d-357f-4248-9f70-b34eee6c11da&quot;,&quot;parentUUID&quot;:&quot;a909b601-5217-4989-b373-7ee1ebac8ed1&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;ef94511d-357f-4248-9f70-b34eee6c11da&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:127,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162058.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162058.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:10,&quot;passes&quot;:9,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-01T08:21:00.997Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:22:04.903Z&quot;,&quot;duration&quot;:63906,&quot;testsRegistered&quot;:10,&quot;passPercent&quot;:90,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;16f5e1e2-a6f4-493b-bb2c-9ac40ac8068f&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;title&quot;:&quot;仪表板功能测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该显示仪表板的所有核心组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示仪表板的所有核心组件&quot;,&quot;duration&quot;:1403,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查主容器\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查头部区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查消息框\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查指标框\ncy.get(&#x27;[data-testid=\&quot;dashboard-indicators-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图区域\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;12880830-c744-499b-929e-671ed973c0ea&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示健康度指标&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示健康度指标&quot;,&quot;duration&quot;:1199,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.verifyHealthIndicators();\n// 检查健康度数值格式\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;).and(&#x27;contain&#x27;, &#x27;%&#x27;);\n// 检查进度条\ncy.get(&#x27;[data-testid=\&quot;dashboard-bag-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-pulse-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-poppet-valve-progress\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;876b468e-a18c-469c-883f-ba162301352f&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该加载并显示图表数据&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该加载并显示图表数据&quot;,&quot;duration&quot;:1166,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 等待图表组件加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查图表是否有内容(这里需要根据实际图表实现调整)\ncy.get(&#x27;[data-testid=\&quot;dashboard-chart-line\&quot;]&#x27;).within(() =&gt; {\n // 检查图表容器内是否有内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;46643329-6d45-47e5-970f-463010f9490f&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该显示地图组件&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该显示地图组件&quot;,&quot;duration&quot;:1176,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查地图组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 检查地图是否有内容\ncy.get(&#x27;[data-testid=\&quot;dashboard-map-svg\&quot;]&#x27;).within(() =&gt; {\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gt&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e6153cc7-ed98-44fd-850f-b9e9dd3d2799&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该响应数据更新&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该响应数据更新&quot;,&quot;duration&quot;:3179,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 记录初始健康度值\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const initialValue = $el.text();\n // 等待一段时间,检查数据是否可能更新\n cy.wait(2000);\n // 验证元素仍然存在并且可能有更新\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;692bb57e-db48-4585-b7f5-ed9934aee19b&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理消息列表&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理消息列表&quot;,&quot;duration&quot;:1183,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查消息组件\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n// 如果有消息项,检查其结构\ncy.get(&#x27;[data-testid=\&quot;dashboard-msg-item\&quot;]&#x27;).within(() =&gt; {\n // 检查是否有消息内容\n cy.get(&#x27;*&#x27;).should(&#x27;have.length.gte&#x27;, 0);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;ea6c7579-23f6-4451-a751-531ed9cf8daf&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证布局响应式&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证布局响应式&quot;,&quot;duration&quot;:2685,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 测试不同屏幕尺寸下的布局\nconst viewports = [{\n width: 1920,\n height: 1080\n}, {\n width: 1280,\n height: 720\n}, {\n width: 1024,\n height: 768\n}];\nviewports.forEach(viewport =&gt; {\n cy.viewport(viewport.width, viewport.height);\n cy.wait(500);\n // 验证主要组件在不同尺寸下仍然可见\n cy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-header\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n cy.get(&#x27;[data-testid=\&quot;dashboard-map-box\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;79ee0892-01eb-4cf8-8fa0-7bd97a56686f&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证颜色主题&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该验证颜色主题&quot;,&quot;duration&quot;:1173,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 检查健康度指标的颜色是否根据数值变化\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).then($el =&gt; {\n const healthScore = parseInt($el.text().replace(&#x27;%&#x27;, &#x27;&#x27;));\n // 根据健康度检查颜色\n if (healthScore &gt;= 90) {\n cy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;have.css&#x27;, &#x27;color&#x27;).and(&#x27;not.equal&#x27;, &#x27;rgba(0, 0, 0, 0)&#x27;);\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;625f1efb-3b94-43b0-9da7-dc967e7b2971&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理数据加载状态&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该处理数据加载状态&quot;,&quot;duration&quot;:1783,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 重新加载页面检查加载状态\ncy.reload();\n// 等待页面完全加载\ncy.waitForPageLoad();\n// 验证所有关键元素都已加载\ncy.get(&#x27;[data-testid=\&quot;dashboard-container\&quot;]&#x27;).should(&#x27;be.visible&#x27;);\ncy.get(&#x27;[data-testid=\&quot;dashboard-health-score\&quot;]&#x27;).should(&#x27;be.visible&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;e5e32c97-0317-4b90-9b1f-e0b102018f9a&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理无权限用户的重定向&quot;,&quot;fullTitle&quot;:&quot;仪表板功能测试 应该正确处理无权限用户的重定向&quot;,&quot;duration&quot;:16277,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 清除localStorage模拟无权限状态\ncy.window().then(win =&gt; {\n win.localStorage.clear();\n win.sessionStorage.clear();\n // 清除所有cookie\n cy.clearCookies();\n});\n// 尝试访问仪表板,应该被重定向到登录页\ncy.visit(&#x27;/#/dashboard&#x27;);\ncy.url().should(&#x27;include&#x27;, &#x27;/#/login&#x27;);&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: Timed out retrying after 15000ms: expected &#x27;http://localhost:3000/#/dashboard&#x27; to include &#x27;/#/login&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard.cy.js:157:13)&quot;},&quot;uuid&quot;:&quot;78482e26-b6d7-4d78-9fa0-c9cbd71e3d88&quot;,&quot;parentUUID&quot;:&quot;a63c6d06-e6bc-4843-8e22-0eb5bb08e5f2&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;12880830-c744-499b-929e-671ed973c0ea&quot;,&quot;876b468e-a18c-469c-883f-ba162301352f&quot;,&quot;46643329-6d45-47e5-970f-463010f9490f&quot;,&quot;e6153cc7-ed98-44fd-850f-b9e9dd3d2799&quot;,&quot;692bb57e-db48-4585-b7f5-ed9934aee19b&quot;,&quot;ea6c7579-23f6-4451-a751-531ed9cf8daf&quot;,&quot;79ee0892-01eb-4cf8-8fa0-7bd97a56686f&quot;,&quot;625f1efb-3b94-43b0-9da7-dc967e7b2971&quot;,&quot;e5e32c97-0317-4b90-9b1f-e0b102018f9a&quot;],&quot;failures&quot;:[&quot;78482e26-b6d7-4d78-9fa0-c9cbd71e3d88&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:31224,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162204.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162204.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:8,&quot;tests&quot;:13,&quot;passes&quot;:3,&quot;pending&quot;:0,&quot;failures&quot;:10,&quot;start&quot;:&quot;2025-09-01T08:28:58.357Z&quot;,&quot;end&quot;:&quot;2025-09-01T08:29:01.865Z&quot;,&quot;duration&quot;:3508,&quot;testsRegistered&quot;:13,&quot;passPercent&quot;:23.076923076923077,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;e888b606-b95f-4661-ada9-470e29b72196&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/dashboard-api.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;94d6d4fe-6eaa-4545-9d9a-f633d820aa08&quot;,&quot;title&quot;:&quot;首页API接口正确性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;229e1e03-0793-4936-a81e-436d847b149b&quot;,&quot;title&quot;:&quot;健康度概览接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度概览数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该成功获取健康度概览数据&quot;,&quot;duration&quot;:95,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证数据结构(如果有数据)\n if (response.body.data) {\n const data = response.body.data;\n // 健康度数据应该包含数值类型的字段\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的健康度字段\n if (data.average !== undefined) {\n expect(data.average).to.be.a(&#x27;number&#x27;);\n expect(data.average).to.be.at.least(0);\n expect(data.average).to.be.at.most(100);\n }\n if (data.bag !== undefined) {\n expect(data.bag).to.be.a(&#x27;number&#x27;);\n expect(data.bag).to.be.at.least(0);\n expect(data.bag).to.be.at.most(100);\n }\n if (data.pulseValve !== undefined) {\n expect(data.pulseValve).to.be.a(&#x27;number&#x27;);\n expect(data.pulseValve).to.be.at.least(0);\n expect(data.pulseValve).to.be.at.most(100);\n }\n if (data.poppetValve !== undefined) {\n expect(data.poppetValve).to.be.a(&#x27;number&#x27;);\n expect(data.poppetValve).to.be.at.least(0);\n expect(data.poppetValve).to.be.at.most(100);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:41:38)&quot;},&quot;uuid&quot;:&quot;e7a50392-531f-4a26-b131-738db865377d&quot;,&quot;parentUUID&quot;:&quot;229e1e03-0793-4936-a81e-436d847b149b&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度概览接口的错误响应&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度概览接口测试 应该处理健康度概览接口的错误响应&quot;,&quot;duration&quot;:88,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟服务器错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n statusCode: 500,\n body: {\n code: 500,\n message: &#x27;服务器内部错误&#x27;,\n data: null\n }\n}).as(&#x27;healthOverviewError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(500);\n expect(response.body.code).to.equal(500);\n expect(response.body.message).to.contain(&#x27;错误&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected 200 to equal 500&quot;,&quot;estack&quot;:&quot;AssertionError: expected 200 to equal 500\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:105:35)&quot;,&quot;diff&quot;:&quot;- 200\n+ 500\n&quot;},&quot;uuid&quot;:&quot;4186cdc3-11e6-45dd-a756-3ce2ba4b92d9&quot;,&quot;parentUUID&quot;:&quot;229e1e03-0793-4936-a81e-436d847b149b&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;e7a50392-531f-4a26-b131-738db865377d&quot;,&quot;4186cdc3-11e6-45dd-a756-3ce2ba4b92d9&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:183,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;43fc8648-f768-47cb-a233-c99eddee8f59&quot;,&quot;title&quot;:&quot;健康度统计接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取健康度统计数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该成功获取健康度统计数据&quot;,&quot;duration&quot;:104,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证图表数据结构\n if (response.body.data) {\n const data = response.body.data;\n expect(data).to.be.an(&#x27;object&#x27;);\n // 验证可能的图表数据字段\n if (data.xAxis) {\n expect(data.xAxis).to.be.an(&#x27;array&#x27;);\n }\n if (data.series) {\n expect(data.series).to.be.an(&#x27;array&#x27;);\n }\n if (data.categories) {\n expect(data.categories).to.be.an(&#x27;array&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:126:38)&quot;},&quot;uuid&quot;:&quot;ec26ce0d-1e69-4c90-807a-a8a26e4ccdc9&quot;,&quot;parentUUID&quot;:&quot;43fc8648-f768-47cb-a233-c99eddee8f59&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该处理健康度统计接口的超时&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 健康度统计接口测试 应该处理健康度统计接口的超时&quot;,&quot;duration&quot;:87,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟超时\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/statistic&#x27;, req =&gt; {\n req.reply(res =&gt; {\n return new Promise(resolve =&gt; {\n setTimeout(() =&gt; resolve(res.send({\n statusCode: 408\n })), 6000);\n });\n });\n}).as(&#x27;healthStatisticTimeout&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n timeout: 5000,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该处理超时情况\n expect([408, 504]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 408, 504 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:178:30)&quot;},&quot;uuid&quot;:&quot;bd5bded6-134f-4150-8986-b60aebc8a75d&quot;,&quot;parentUUID&quot;:&quot;43fc8648-f768-47cb-a233-c99eddee8f59&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;ec26ce0d-1e69-4c90-807a-a8a26e4ccdc9&quot;,&quot;bd5bded6-134f-4150-8986-b60aebc8a75d&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:191,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;d7a48fc9-d1a4-4595-9259-1ad76ac63c32&quot;,&quot;title&quot;:&quot;异常监控接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取异常监控数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该成功获取异常监控数据&quot;,&quot;duration&quot;:95,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证异常监控数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的异常监控字段\n if (item.time) {\n expect(item.time).to.be.a(&#x27;string&#x27;);\n }\n if (item.level) {\n expect(item.level).to.be.a(&#x27;string&#x27;);\n }\n if (item.message) {\n expect(item.message).to.be.a(&#x27;string&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:197:38)&quot;},&quot;uuid&quot;:&quot;7da508dc-e612-4890-907d-9d7e832062c6&quot;,&quot;parentUUID&quot;:&quot;d7a48fc9-d1a4-4595-9259-1ad76ac63c32&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证异常监控数据的完整性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 异常监控接口测试 应该验证异常监控数据的完整性&quot;,&quot;duration&quot;:38,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n // 验证数据量合理性\n expect(data.length).to.be.at.most(1000); // 单次返回不超过1000条\n // 验证时间戳格式(如果存在)\n data.forEach(item =&gt; {\n if (item.timestamp) {\n expect(new Date(item.timestamp).getTime()).to.be.a(&#x27;number&#x27;);\n }\n if (item.createTime) {\n expect(new Date(item.createTime).getTime()).to.be.a(&#x27;number&#x27;);\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;2106a703-e24e-40ee-a503-f4ec304c9c77&quot;,&quot;parentUUID&quot;:&quot;d7a48fc9-d1a4-4595-9259-1ad76ac63c32&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;2106a703-e24e-40ee-a503-f4ec304c9c77&quot;],&quot;failures&quot;:[&quot;7da508dc-e612-4890-907d-9d7e832062c6&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:133,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;ef6ee4b8-8a89-421d-ac25-981a77341871&quot;,&quot;title&quot;:&quot;除尘器告警接口测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该成功获取除尘器告警数据&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该成功获取除尘器告警数据&quot;,&quot;duration&quot;:112,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 验证响应状态码\n expect(response.status).to.equal(200);\n // 验证响应体结构\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证成功响应码\n expect(response.body.code).to.equal(200);\n // 验证告警数据结构\n if (response.body.data) {\n const data = response.body.data;\n if (Array.isArray(data)) {\n // 如果是数组,验证数组项结构\n data.forEach(item =&gt; {\n expect(item).to.be.an(&#x27;object&#x27;);\n // 验证可能的告警字段\n if (item.alarmLevel) {\n expect(item.alarmLevel).to.be.a(&#x27;string&#x27;);\n }\n if (item.alarmType) {\n expect(item.alarmType).to.be.a(&#x27;string&#x27;);\n }\n if (item.deviceName) {\n expect(item.deviceName).to.be.a(&#x27;string&#x27;);\n }\n if (item.location) {\n expect(item.location).to.be.an(&#x27;object&#x27;);\n }\n });\n } else {\n expect(data).to.be.an(&#x27;object&#x27;);\n }\n }\n // 验证响应时间\n expect(response.duration).to.be.lessThan(5000);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:282:38)&quot;},&quot;uuid&quot;:&quot;d0a006c3-3b4d-4868-b0f0-9d3c1cad09ae&quot;,&quot;parentUUID&quot;:&quot;ef6ee4b8-8a89-421d-ac25-981a77341871&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该验证告警数据的地理位置信息&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 除尘器告警接口测试 应该验证告警数据的地理位置信息&quot;,&quot;duration&quot;:57,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n expect(response.status).to.equal(200);\n if (response.body.data &amp;&amp; Array.isArray(response.body.data)) {\n const data = response.body.data;\n data.forEach(item =&gt; {\n // 验证地理位置信息\n if (item.location) {\n const location = item.location;\n if (location.latitude) {\n expect(location.latitude).to.be.a(&#x27;number&#x27;);\n expect(location.latitude).to.be.at.least(-90);\n expect(location.latitude).to.be.at.most(90);\n }\n if (location.longitude) {\n expect(location.longitude).to.be.a(&#x27;number&#x27;);\n expect(location.longitude).to.be.at.least(-180);\n expect(location.longitude).to.be.at.most(180);\n }\n }\n });\n }\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;4ffb7406-ab0c-4552-b0cf-4136e6c39455&quot;,&quot;parentUUID&quot;:&quot;ef6ee4b8-8a89-421d-ac25-981a77341871&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;4ffb7406-ab0c-4552-b0cf-4136e6c39455&quot;],&quot;failures&quot;:[&quot;d0a006c3-3b4d-4868-b0f0-9d3c1cad09ae&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:169,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;45ff79e4-4ad6-4b08-ab25-e3d6175f2423&quot;,&quot;title&quot;:&quot;接口并发访问测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该能够同时访问所有首页接口&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口并发访问测试 应该能够同时访问所有首页接口&quot;,&quot;duration&quot;:58,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;const requests = [cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/statistic&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/exception/monitor&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}), cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/duster/alarm&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n})];\n// 并发执行所有请求\nCypress.Promise.all(requests).then(responses =&gt; {\n // 验证所有请求都成功\n responses.forEach((response, index) =&gt; {\n expect(response.status).to.equal(200);\n expect(response.body.code).to.equal(200);\n // 验证响应时间合理\n expect(response.duration).to.be.lessThan(10000);\n });\n // 验证总体响应时间\n const totalTime = responses.reduce((sum, resp) =&gt; sum + resp.duration, 0);\n expect(totalTime).to.be.lessThan(20000); // 总时间不超过20秒\n});&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;1b07e5de-a9a4-463f-abbb-4712c7e84173&quot;,&quot;parentUUID&quot;:&quot;45ff79e4-4ad6-4b08-ab25-e3d6175f2423&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;1b07e5de-a9a4-463f-abbb-4712c7e84173&quot;],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:58,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;4719e362-bf73-44fa-9bf7-f8f751098736&quot;,&quot;title&quot;:&quot;接口错误处理测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该正确处理无效的TOKEN&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理无效的TOKEN&quot;,&quot;duration&quot;:95,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;TOKEN&#x27;: &#x27;invalid_token_12345&#x27;,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:417:30)&quot;},&quot;uuid&quot;:&quot;a7bd9b40-c80d-4884-b9b8-d1a5cc51a2d9&quot;,&quot;parentUUID&quot;:&quot;4719e362-bf73-44fa-9bf7-f8f751098736&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理缺少TOKEN的请求&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理缺少TOKEN的请求&quot;,&quot;duration&quot;:103,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n headers: {\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 应该返回认证错误\n expect([401, 403]).to.include(response.status);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200&quot;,&quot;estack&quot;:&quot;AssertionError: expected [ 401, 403 ] to include 200\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:431:30)&quot;},&quot;uuid&quot;:&quot;31271665-6dd0-4f55-99c0-114821b5b6b6&quot;,&quot;parentUUID&quot;:&quot;4719e362-bf73-44fa-9bf7-f8f751098736&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;应该正确处理网络错误&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口错误处理测试 应该正确处理网络错误&quot;,&quot;duration&quot;:91,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;// 模拟网络错误\ncy.intercept(&#x27;GET&#x27;, &#x27;**/api/home/health/overview&#x27;, {\n forceNetworkError: true\n}).as(&#x27;networkError&#x27;);\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n failOnStatusCode: false,\n retryOnNetworkFailure: false,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n // 网络错误应该被正确处理\n expect(response).to.exist;\n}).catch(error =&gt; {\n // 或者抛出网络错误异常\n expect(error.message).to.contain(&#x27;network&#x27;);\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function&quot;,&quot;estack&quot;:&quot;TypeError: cy.request(...).then(...).catch is not a function\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:453:16)&quot;},&quot;uuid&quot;:&quot;4b050385-2682-4f50-9bea-58bf2737f13b&quot;,&quot;parentUUID&quot;:&quot;4719e362-bf73-44fa-9bf7-f8f751098736&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;a7bd9b40-c80d-4884-b9b8-d1a5cc51a2d9&quot;,&quot;31271665-6dd0-4f55-99c0-114821b5b6b6&quot;,&quot;4b050385-2682-4f50-9bea-58bf2737f13b&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:289,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000},{&quot;uuid&quot;:&quot;0768c108-c9d3-4897-b284-68251d46ae2b&quot;,&quot;title&quot;:&quot;接口数据一致性测试&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;应该验证多次调用返回数据的一致性&quot;,&quot;fullTitle&quot;:&quot;首页API接口正确性测试 接口数据一致性测试 应该验证多次调用返回数据的一致性&quot;,&quot;duration&quot;:127,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;let firstResponse;\n// 第一次调用\ncy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n}).then(response =&gt; {\n firstResponse = response.body;\n expect(response.status).to.equal(200);\n}).then(() =&gt; {\n // 短时间内第二次调用\n cy.request({\n method: &#x27;GET&#x27;,\n url: &#x27;/api/home/health/overview&#x27;,\n headers: {\n &#x27;TOKEN&#x27;: authToken,\n &#x27;Content-Type&#x27;: &#x27;application/json&#x27;\n }\n }).then(response =&gt; {\n expect(response.status).to.equal(200);\n // 验证数据结构一致性\n expect(response.body).to.have.property(&#x27;code&#x27;);\n expect(response.body).to.have.property(&#x27;data&#x27;);\n expect(response.body).to.have.property(&#x27;message&#x27;);\n // 验证数据类型一致性\n if (firstResponse.data &amp;&amp; response.body.data) {\n expect(typeof response.body.data).to.equal(typeof firstResponse.data);\n }\n });\n});&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;&quot;,&quot;estack&quot;:&quot;AssertionError: expected &#x27;&lt;!doctype html&gt;\\n&lt;html lang=\&quot;en\&quot;&gt;\\n\\n&lt;head&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/@vite/client\&quot;&gt;&lt;/script&gt;\\n\\n &lt;meta charset=\&quot;UTF-8\&quot; /&gt;\\n &lt;link rel=\&quot;icon\&quot; type=\&quot;image/svg+xml\&quot; href=\&quot;/vite.svg\&quot; /&gt;\\n &lt;meta name=\&quot;viewport\&quot; content=\&quot;width=device-width, initial-scale=1.0\&quot; /&gt;\\n &lt;script src=\&quot;/tailwindcss/index.js\&quot;&gt;&lt;/script&gt;\\n &lt;link rel=\&quot;stylesheet\&quot; href=\&quot;/tailwindcss/index.css\&quot;&gt;\\n &lt;title&gt;DCTOM&lt;/title&gt;\\n &lt;style type=\&quot;text/tailwindcss\&quot;&gt;\\n @layer utilities {\\n .content-auto {\\n content-visibility: auto;\\n }\\n .diagonal-pattern {\\n background-image: repeating-linear-gradient(\\n 45deg,\\n rgba(6, 241, 14, 0.829),\\n rgba(6, 241, 14, 0.829) 10px,\\n rgba(6, 241, 14, 0.829) 15px,\\n rgba(255, 255, 255, 0.1) 20px\\n );\\n background-size: 28px 28px;\\n }\\n .diagonal-pattern-animation {\\n animation: slide 1s linear infinite;\\n }\\n @keyframes slide {\\n 0% {\\n background-position: 0 0;\\n }\\n 100% {\\n background-position: 28px 0;\\n }\\n }\\n }\\n &lt;/style&gt;\\n&lt;/head&gt;\\n\\n&lt;body&gt;\\n &lt;div id=\&quot;app\&quot;&gt;&lt;/div&gt;\\n &lt;script type=\&quot;module\&quot; src=\&quot;/src/main.js\&quot;&gt;&lt;/script&gt;\\n&lt;/body&gt;\\n\\n&lt;/html&gt;&#x27; to have property &#x27;code&#x27;\n at Context.eval (webpack://dctomproject/./cypress/e2e/dashboard-api.cy.js:488:40)&quot;},&quot;uuid&quot;:&quot;2b0fef6d-3461-4c61-9e78-f04c6161f80d&quot;,&quot;parentUUID&quot;:&quot;0768c108-c9d3-4897-b284-68251d46ae2b&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[],&quot;failures&quot;:[&quot;2b0fef6d-3461-4c61-9e78-f04c6161f80d&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:127,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162901.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09012025_162901.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:2,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-02T01:33:26.125Z&quot;,&quot;end&quot;:&quot;2025-09-02T01:33:48.994Z&quot;,&quot;duration&quot;:22869,&quot;testsRegistered&quot;:2,&quot;passPercent&quot;:50,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;8bae2f11-f252-491a-837d-c74d1572556a&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;b4095b36-e359-42cd-9f7c-50da145b3df8&quot;,&quot;title&quot;:&quot;template spec&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;passes&quot;,&quot;fullTitle&quot;:&quot;template spec passes&quot;,&quot;duration&quot;:1651,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.visit(&#x27;https://example.cypress.io&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;58ea6f27-d2fb-478e-86ab-a4900b8c3c13&quot;,&quot;parentUUID&quot;:&quot;b4095b36-e359-42cd-9f7c-50da145b3df8&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;test1&quot;,&quot;fullTitle&quot;:&quot;template spec test1&quot;,&quot;duration&quot;:1209,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;/* ==== Generated with Cypress Studio ==== */\ncy.visit(&#x27;http://localhost:3000/&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).clear(&#x27;z&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;zongheng_admin&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).clear(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).clear(&#x27;8&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;8888&#x27;);\ncy.get(&#x27;.el-checkbox__label&#x27;).click();\ncy.get(&#x27;.el-checkbox__original&#x27;).check();\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;menu-item-dust-overview\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-add-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-285&#x27;).click();\ncy.get(&#x27;#el-id-7502-97 &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-286&#x27;).clear(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-286&#x27;).type(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).clear(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).type(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-289&#x27;).click();\ncy.get(&#x27;.el-dialog__headerbtn &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-search-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;:nth-child(1) &gt; .el-table_1_column_10 &gt; .cell &gt; [data-testid=\&quot;dust-view-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-monitoring-status-matrix\&quot;] &gt; .left &gt; :nth-child(1) &gt; :nth-child(1)&#x27;).click();\ncy.get(&#x27;.el-select__suffix &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;#el-id-7502-313 &gt; span&#x27;).click();\n/* ==== End Cypress Studio ==== */&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)&quot;},&quot;uuid&quot;:&quot;f7fd903c-575c-48a3-b5db-2f9d1fdd3901&quot;,&quot;parentUUID&quot;:&quot;b4095b36-e359-42cd-9f7c-50da145b3df8&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;58ea6f27-d2fb-478e-86ab-a4900b8c3c13&quot;],&quot;failures&quot;:[&quot;f7fd903c-575c-48a3-b5db-2f9d1fdd3901&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:2860,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_093348.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_093348.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:2,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-02T01:33:13.291Z&quot;,&quot;end&quot;:&quot;2025-09-02T01:33:21.444Z&quot;,&quot;duration&quot;:8153,&quot;testsRegistered&quot;:2,&quot;passPercent&quot;:50,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;f18a73a3-f766-45eb-b8a9-54d327c8cd97&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;b08d0fe5-99c2-4e84-8063-f358d2c8fc6e&quot;,&quot;title&quot;:&quot;template spec&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;passes&quot;,&quot;fullTitle&quot;:&quot;template spec passes&quot;,&quot;duration&quot;:1552,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.visit(&#x27;https://example.cypress.io&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;57a4f280-853c-47a8-91c7-b3d5daf05f24&quot;,&quot;parentUUID&quot;:&quot;b08d0fe5-99c2-4e84-8063-f358d2c8fc6e&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;test1&quot;,&quot;fullTitle&quot;:&quot;template spec test1&quot;,&quot;duration&quot;:1204,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;/* ==== Generated with Cypress Studio ==== */\ncy.visit(&#x27;http://localhost:3000/&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).clear(&#x27;z&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;zongheng_admin&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).clear(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).clear(&#x27;8&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;8888&#x27;);\ncy.get(&#x27;.el-checkbox__label&#x27;).click();\ncy.get(&#x27;.el-checkbox__original&#x27;).check();\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;menu-item-dust-overview\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-add-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-285&#x27;).click();\ncy.get(&#x27;#el-id-7502-97 &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-286&#x27;).clear(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-286&#x27;).type(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).clear(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).type(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-289&#x27;).click();\ncy.get(&#x27;.el-dialog__headerbtn &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-search-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;:nth-child(1) &gt; .el-table_1_column_10 &gt; .cell &gt; [data-testid=\&quot;dust-view-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-monitoring-status-matrix\&quot;] &gt; .left &gt; :nth-child(1) &gt; :nth-child(1)&#x27;).click();\ncy.get(&#x27;.el-select__suffix &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;#el-id-7502-313 &gt; span&#x27;).click();\n/* ==== End Cypress Studio ==== */&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)&quot;},&quot;uuid&quot;:&quot;7a7be8fb-3858-46cd-884c-349dd1de3ec4&quot;,&quot;parentUUID&quot;:&quot;b08d0fe5-99c2-4e84-8063-f358d2c8fc6e&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;57a4f280-853c-47a8-91c7-b3d5daf05f24&quot;],&quot;failures&quot;:[&quot;7a7be8fb-3858-46cd-884c-349dd1de3ec4&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:2756,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_093321.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_093321.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:2,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-02T01:53:52.655Z&quot;,&quot;end&quot;:&quot;2025-09-02T01:54:00.170Z&quot;,&quot;duration&quot;:7515,&quot;testsRegistered&quot;:2,&quot;passPercent&quot;:50,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;22f811c6-8cbb-4c99-a2ea-acce437390e6&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;5532d3c1-9627-4bc3-9cf1-3dea7515b2fe&quot;,&quot;title&quot;:&quot;template spec&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;passes&quot;,&quot;fullTitle&quot;:&quot;template spec passes&quot;,&quot;duration&quot;:1370,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.visit(&#x27;https://example.cypress.io&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;09558a63-0e23-4fb8-b747-59cfe98e4a56&quot;,&quot;parentUUID&quot;:&quot;5532d3c1-9627-4bc3-9cf1-3dea7515b2fe&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;test1&quot;,&quot;fullTitle&quot;:&quot;template spec test1&quot;,&quot;duration&quot;:1205,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;/* ==== Generated with Cypress Studio ==== */\ncy.visit(&#x27;http://localhost:3000/&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).clear(&#x27;z&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;zongheng_admin&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).clear(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).clear(&#x27;8&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;8888&#x27;);\ncy.get(&#x27;.el-checkbox__label&#x27;).click();\ncy.get(&#x27;.el-checkbox__original&#x27;).check();\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;menu-item-dust-overview\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-add-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-285&#x27;).click();\ncy.get(&#x27;#el-id-7502-97 &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-286&#x27;).clear(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-286&#x27;).type(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).clear(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).type(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-289&#x27;).click();\ncy.get(&#x27;.el-dialog__headerbtn &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-search-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;:nth-child(1) &gt; .el-table_1_column_10 &gt; .cell &gt; [data-testid=\&quot;dust-view-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-monitoring-status-matrix\&quot;] &gt; .left &gt; :nth-child(1) &gt; :nth-child(1)&#x27;).click();\ncy.get(&#x27;.el-select__suffix &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;#el-id-7502-313 &gt; span&#x27;).click();\n/* ==== End Cypress Studio ==== */&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)&quot;},&quot;uuid&quot;:&quot;db95fbfa-3327-447d-a65a-ba555d923ade&quot;,&quot;parentUUID&quot;:&quot;5532d3c1-9627-4bc3-9cf1-3dea7515b2fe&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;09558a63-0e23-4fb8-b747-59cfe98e4a56&quot;],&quot;failures&quot;:[&quot;db95fbfa-3327-447d-a65a-ba555d923ade&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:2575,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_095400.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_095400.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
......@@ -5,9 +5,9 @@
"passes": 1,
"pending": 0,
"failures": 1,
"start": "2025-09-02T01:33:13.291Z",
"end": "2025-09-02T01:33:21.444Z",
"duration": 8153,
"start": "2025-09-02T01:53:52.655Z",
"end": "2025-09-02T01:54:00.170Z",
"duration": 7515,
"testsRegistered": 2,
"passPercent": 50,
"pendingPercent": 0,
......@@ -18,7 +18,7 @@
},
"results": [
{
"uuid": "f18a73a3-f766-45eb-b8a9-54d327c8cd97",
"uuid": "22f811c6-8cbb-4c99-a2ea-acce437390e6",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
......@@ -27,7 +27,7 @@
"tests": [],
"suites": [
{
"uuid": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"title": "template spec",
"fullFile": "",
"file": "",
......@@ -38,7 +38,7 @@
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1552,
"duration": 1370,
"state": "passed",
"speed": "fast",
"pass": true,
......@@ -47,8 +47,8 @@
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "57a4f280-853c-47a8-91c7-b3d5daf05f24",
"parentUUID": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "09558a63-0e23-4fb8-b747-59cfe98e4a56",
"parentUUID": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"isHook": false,
"skipped": false
},
......@@ -56,7 +56,7 @@
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1204,
"duration": 1205,
"state": "failed",
"speed": null,
"pass": false,
......@@ -69,22 +69,22 @@
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "7a7be8fb-3858-46cd-884c-349dd1de3ec4",
"parentUUID": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "db95fbfa-3327-447d-a65a-ba555d923ade",
"parentUUID": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"57a4f280-853c-47a8-91c7-b3d5daf05f24"
"09558a63-0e23-4fb8-b747-59cfe98e4a56"
],
"failures": [
"7a7be8fb-3858-46cd-884c-349dd1de3ec4"
"db95fbfa-3327-447d-a65a-ba555d923ade"
],
"pending": [],
"skipped": [],
"duration": 2756,
"duration": 2575,
"root": false,
"rootEmpty": false,
"_timeout": 2000
......
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:2,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-02T02:01:50.724Z&quot;,&quot;end&quot;:&quot;2025-09-02T02:01:58.591Z&quot;,&quot;duration&quot;:7867,&quot;testsRegistered&quot;:2,&quot;passPercent&quot;:50,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;2a482d30-b676-4901-ab1c-871aff43ac38&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;0d22799a-32d2-4e3d-b618-c96281390836&quot;,&quot;title&quot;:&quot;template spec&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;passes&quot;,&quot;fullTitle&quot;:&quot;template spec passes&quot;,&quot;duration&quot;:1679,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.visit(&#x27;https://example.cypress.io&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee&quot;,&quot;parentUUID&quot;:&quot;0d22799a-32d2-4e3d-b618-c96281390836&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;test1&quot;,&quot;fullTitle&quot;:&quot;template spec test1&quot;,&quot;duration&quot;:1241,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;/* ==== Generated with Cypress Studio ==== */\ncy.visit(&#x27;http://localhost:3000/&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).clear(&#x27;z&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;zongheng_admin&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).clear(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).clear(&#x27;8&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;8888&#x27;);\ncy.get(&#x27;.el-checkbox__label&#x27;).click();\ncy.get(&#x27;.el-checkbox__original&#x27;).check();\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;menu-item-dust-overview\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-add-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-285&#x27;).click();\ncy.get(&#x27;#el-id-7502-97 &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-286&#x27;).clear(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-286&#x27;).type(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).clear(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).type(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-289&#x27;).click();\ncy.get(&#x27;.el-dialog__headerbtn &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-search-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;:nth-child(1) &gt; .el-table_1_column_10 &gt; .cell &gt; [data-testid=\&quot;dust-view-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-monitoring-status-matrix\&quot;] &gt; .left &gt; :nth-child(1) &gt; :nth-child(1)&#x27;).click();\ncy.get(&#x27;.el-select__suffix &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;#el-id-7502-313 &gt; span&#x27;).click();\n/* ==== End Cypress Studio ==== */&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)&quot;},&quot;uuid&quot;:&quot;4ea99dce-ceeb-48b2-9108-bb3a747618fc&quot;,&quot;parentUUID&quot;:&quot;0d22799a-32d2-4e3d-b618-c96281390836&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee&quot;],&quot;failures&quot;:[&quot;4ea99dce-ceeb-48b2-9108-bb3a747618fc&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:2920,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_100158.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_100158.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
......@@ -5,9 +5,9 @@
"passes": 1,
"pending": 0,
"failures": 1,
"start": "2025-09-02T01:33:26.125Z",
"end": "2025-09-02T01:33:48.994Z",
"duration": 22869,
"start": "2025-09-02T02:01:50.724Z",
"end": "2025-09-02T02:01:58.591Z",
"duration": 7867,
"testsRegistered": 2,
"passPercent": 50,
"pendingPercent": 0,
......@@ -18,7 +18,7 @@
},
"results": [
{
"uuid": "8bae2f11-f252-491a-837d-c74d1572556a",
"uuid": "2a482d30-b676-4901-ab1c-871aff43ac38",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
......@@ -27,7 +27,7 @@
"tests": [],
"suites": [
{
"uuid": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "0d22799a-32d2-4e3d-b618-c96281390836",
"title": "template spec",
"fullFile": "",
"file": "",
......@@ -38,7 +38,7 @@
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1651,
"duration": 1679,
"state": "passed",
"speed": "fast",
"pass": true,
......@@ -47,8 +47,8 @@
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "58ea6f27-d2fb-478e-86ab-a4900b8c3c13",
"parentUUID": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee",
"parentUUID": "0d22799a-32d2-4e3d-b618-c96281390836",
"isHook": false,
"skipped": false
},
......@@ -56,7 +56,7 @@
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1209,
"duration": 1241,
"state": "failed",
"speed": null,
"pass": false,
......@@ -66,25 +66,25 @@
"code": "/* ==== Generated with Cypress Studio ==== */\ncy.visit('http://localhost:3000/');\ncy.get('[data-testid=\"login-username-input\"]').clear('z');\ncy.get('[data-testid=\"login-username-input\"]').type('zongheng_admin');\ncy.get('[data-testid=\"login-password-input\"]').click();\ncy.get('[data-testid=\"login-password-input\"]').clear('9%#F46vt');\ncy.get('[data-testid=\"login-password-input\"]').type('9%#F46vt');\ncy.get('[data-testid=\"login-captcha-input\"]').clear('8');\ncy.get('[data-testid=\"login-captcha-input\"]').type('8888');\ncy.get('.el-checkbox__label').click();\ncy.get('.el-checkbox__original').check();\ncy.get('[data-testid=\"login-submit-button\"]').click();\ncy.get('[data-testid=\"menu-item-dust-overview\"] > span').click();\ncy.get('[data-testid=\"dust-add-button\"] > span').click();\ncy.get('#el-id-7502-285').click();\ncy.get('#el-id-7502-97 > span').click();\ncy.get('#el-id-7502-286').clear('1');\ncy.get('#el-id-7502-286').type('1');\ncy.get('#el-id-7502-287').clear('2');\ncy.get('#el-id-7502-287').type('2');\ncy.get('#el-id-7502-289').click();\ncy.get('.el-dialog__headerbtn > .el-icon > svg').click();\ncy.get('[data-testid=\"dust-search-button\"] > span').click();\ncy.get(':nth-child(1) > .el-table_1_column_10 > .cell > [data-testid=\"dust-view-button\"]').click();\ncy.get('[data-testid=\"dust-monitoring-status-matrix\"] > .left > :nth-child(1) > :nth-child(1)').click();\ncy.get('.el-select__suffix > .el-icon > svg').click();\ncy.get('#el-id-7502-313 > span').click();\n/* ==== End Cypress Studio ==== */",
"err": {
"message": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "f7fd903c-575c-48a3-b5db-2f9d1fdd3901",
"parentUUID": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "4ea99dce-ceeb-48b2-9108-bb3a747618fc",
"parentUUID": "0d22799a-32d2-4e3d-b618-c96281390836",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"58ea6f27-d2fb-478e-86ab-a4900b8c3c13"
"5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee"
],
"failures": [
"f7fd903c-575c-48a3-b5db-2f9d1fdd3901"
"4ea99dce-ceeb-48b2-9108-bb3a747618fc"
],
"pending": [],
"skipped": [],
"duration": 2860,
"duration": 2920,
"root": false,
"rootEmpty": false,
"_timeout": 2000
......
<!doctype html>
<html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>DC-TOM 测试报告</title><link rel="stylesheet" href="assets/app.css"/></head><body data-raw="{&quot;stats&quot;:{&quot;suites&quot;:1,&quot;tests&quot;:2,&quot;passes&quot;:1,&quot;pending&quot;:0,&quot;failures&quot;:1,&quot;start&quot;:&quot;2025-09-02T02:17:55.835Z&quot;,&quot;end&quot;:&quot;2025-09-02T02:18:04.393Z&quot;,&quot;duration&quot;:8558,&quot;testsRegistered&quot;:2,&quot;passPercent&quot;:50,&quot;pendingPercent&quot;:0,&quot;other&quot;:0,&quot;hasOther&quot;:false,&quot;skipped&quot;:0,&quot;hasSkipped&quot;:false},&quot;results&quot;:[{&quot;uuid&quot;:&quot;508a3340-e4cd-4111-9586-9b47bbf68e3c&quot;,&quot;title&quot;:&quot;&quot;,&quot;fullFile&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;file&quot;:&quot;cypress/e2e/spec.cy.js&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[],&quot;suites&quot;:[{&quot;uuid&quot;:&quot;e0b5a598-a6b0-4909-aab7-6ce00608292b&quot;,&quot;title&quot;:&quot;template spec&quot;,&quot;fullFile&quot;:&quot;&quot;,&quot;file&quot;:&quot;&quot;,&quot;beforeHooks&quot;:[],&quot;afterHooks&quot;:[],&quot;tests&quot;:[{&quot;title&quot;:&quot;passes&quot;,&quot;fullTitle&quot;:&quot;template spec passes&quot;,&quot;duration&quot;:1638,&quot;state&quot;:&quot;passed&quot;,&quot;speed&quot;:&quot;fast&quot;,&quot;pass&quot;:true,&quot;fail&quot;:false,&quot;pending&quot;:false,&quot;code&quot;:&quot;cy.visit(&#x27;https://example.cypress.io&#x27;);&quot;,&quot;err&quot;:{},&quot;uuid&quot;:&quot;87c72104-3595-4ac3-b64f-229a7c0faa29&quot;,&quot;parentUUID&quot;:&quot;e0b5a598-a6b0-4909-aab7-6ce00608292b&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false},{&quot;title&quot;:&quot;test1&quot;,&quot;fullTitle&quot;:&quot;template spec test1&quot;,&quot;duration&quot;:1277,&quot;state&quot;:&quot;failed&quot;,&quot;pass&quot;:false,&quot;fail&quot;:true,&quot;pending&quot;:false,&quot;code&quot;:&quot;/* ==== Generated with Cypress Studio ==== */\ncy.visit(&#x27;http://localhost:3000/&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).clear(&#x27;z&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-username-input\&quot;]&#x27;).type(&#x27;zongheng_admin&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).clear(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-password-input\&quot;]&#x27;).type(&#x27;9%#F46vt&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).clear(&#x27;8&#x27;);\ncy.get(&#x27;[data-testid=\&quot;login-captcha-input\&quot;]&#x27;).type(&#x27;8888&#x27;);\ncy.get(&#x27;.el-checkbox__label&#x27;).click();\ncy.get(&#x27;.el-checkbox__original&#x27;).check();\ncy.get(&#x27;[data-testid=\&quot;login-submit-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;menu-item-dust-overview\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-add-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-285&#x27;).click();\ncy.get(&#x27;#el-id-7502-97 &gt; span&#x27;).click();\ncy.get(&#x27;#el-id-7502-286&#x27;).clear(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-286&#x27;).type(&#x27;1&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).clear(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-287&#x27;).type(&#x27;2&#x27;);\ncy.get(&#x27;#el-id-7502-289&#x27;).click();\ncy.get(&#x27;.el-dialog__headerbtn &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-search-button\&quot;] &gt; span&#x27;).click();\ncy.get(&#x27;:nth-child(1) &gt; .el-table_1_column_10 &gt; .cell &gt; [data-testid=\&quot;dust-view-button\&quot;]&#x27;).click();\ncy.get(&#x27;[data-testid=\&quot;dust-monitoring-status-matrix\&quot;] &gt; .left &gt; :nth-child(1) &gt; :nth-child(1)&#x27;).click();\ncy.get(&#x27;.el-select__suffix &gt; .el-icon &gt; svg&#x27;).click();\ncy.get(&#x27;#el-id-7502-313 &gt; span&#x27;).click();\n/* ==== End Cypress Studio ==== */&quot;,&quot;err&quot;:{&quot;message&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with&quot;,&quot;estack&quot;:&quot;CypressError: `cy.check()` failed because this element is not visible:\n\n`&lt;input class=\&quot;el-checkbox__original\&quot; type=\&quot;checkbox\&quot; value=\&quot;记住密码\&quot;&gt;`\n\nThis element `&lt;input.el-checkbox__original&gt;` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at &lt;unknown&gt; (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)&quot;},&quot;uuid&quot;:&quot;fb19130c-5e56-4ecd-92de-f16961118cc7&quot;,&quot;parentUUID&quot;:&quot;e0b5a598-a6b0-4909-aab7-6ce00608292b&quot;,&quot;isHook&quot;:false,&quot;skipped&quot;:false}],&quot;suites&quot;:[],&quot;passes&quot;:[&quot;87c72104-3595-4ac3-b64f-229a7c0faa29&quot;],&quot;failures&quot;:[&quot;fb19130c-5e56-4ecd-92de-f16961118cc7&quot;],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:2915,&quot;root&quot;:false,&quot;rootEmpty&quot;:false,&quot;_timeout&quot;:2000}],&quot;passes&quot;:[],&quot;failures&quot;:[],&quot;pending&quot;:[],&quot;skipped&quot;:[],&quot;duration&quot;:0,&quot;root&quot;:true,&quot;rootEmpty&quot;:true,&quot;_timeout&quot;:2000}],&quot;meta&quot;:{&quot;mocha&quot;:{&quot;version&quot;:&quot;7.0.1&quot;},&quot;mochawesome&quot;:{&quot;options&quot;:{&quot;quiet&quot;:false,&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;saveHtml&quot;:true,&quot;saveJson&quot;:true,&quot;consoleReporter&quot;:&quot;spec&quot;,&quot;useInlineDiffs&quot;:false,&quot;code&quot;:true},&quot;version&quot;:&quot;7.1.3&quot;},&quot;marge&quot;:{&quot;options&quot;:{&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;overwrite&quot;:false,&quot;html&quot;:true,&quot;json&quot;:true,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;},&quot;version&quot;:&quot;6.2.0&quot;}}}" data-config="{&quot;reportFilename&quot;:&quot;mochawesome&quot;,&quot;reportDir&quot;:&quot;cypress/reports&quot;,&quot;reportTitle&quot;:&quot;DC-TOM Cypress Tests&quot;,&quot;reportPageTitle&quot;:&quot;DC-TOM 测试报告&quot;,&quot;inline&quot;:false,&quot;inlineAssets&quot;:false,&quot;cdn&quot;:false,&quot;charts&quot;:false,&quot;enableCharts&quot;:false,&quot;code&quot;:true,&quot;enableCode&quot;:true,&quot;autoOpen&quot;:false,&quot;overwrite&quot;:false,&quot;timestamp&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;ts&quot;:&quot;mmddyyyy_HHMMss&quot;,&quot;showPassed&quot;:true,&quot;showFailed&quot;:true,&quot;showPending&quot;:true,&quot;showSkipped&quot;:false,&quot;showHooks&quot;:&quot;failed&quot;,&quot;saveJson&quot;:true,&quot;saveHtml&quot;:true,&quot;dev&quot;:false,&quot;assetsDir&quot;:&quot;cypress/reports/assets&quot;,&quot;jsonFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_101804.json&quot;,&quot;htmlFile&quot;:&quot;/Users/cw/Desktop/BME/dc-tom/cypress/reports/mochawesome_09022025_101804.html&quot;}"><div id="report"></div><script src="assets/app.js"></script></body></html>
\ No newline at end of file
{
"stats": {
"suites": 1,
"tests": 2,
"passes": 1,
"pending": 0,
"failures": 1,
"start": "2025-09-02T02:17:55.835Z",
"end": "2025-09-02T02:18:04.393Z",
"duration": 8558,
"testsRegistered": 2,
"passPercent": 50,
"pendingPercent": 0,
"other": 0,
"hasOther": false,
"skipped": 0,
"hasSkipped": false
},
"results": [
{
"uuid": "508a3340-e4cd-4111-9586-9b47bbf68e3c",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
"beforeHooks": [],
"afterHooks": [],
"tests": [],
"suites": [
{
"uuid": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"title": "template spec",
"fullFile": "",
"file": "",
"beforeHooks": [],
"afterHooks": [],
"tests": [
{
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1638,
"state": "passed",
"speed": "fast",
"pass": true,
"fail": false,
"pending": false,
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "87c72104-3595-4ac3-b64f-229a7c0faa29",
"parentUUID": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"isHook": false,
"skipped": false
},
{
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1277,
"state": "failed",
"speed": null,
"pass": false,
"fail": true,
"pending": false,
"context": null,
"code": "/* ==== Generated with Cypress Studio ==== */\ncy.visit('http://localhost:3000/');\ncy.get('[data-testid=\"login-username-input\"]').clear('z');\ncy.get('[data-testid=\"login-username-input\"]').type('zongheng_admin');\ncy.get('[data-testid=\"login-password-input\"]').click();\ncy.get('[data-testid=\"login-password-input\"]').clear('9%#F46vt');\ncy.get('[data-testid=\"login-password-input\"]').type('9%#F46vt');\ncy.get('[data-testid=\"login-captcha-input\"]').clear('8');\ncy.get('[data-testid=\"login-captcha-input\"]').type('8888');\ncy.get('.el-checkbox__label').click();\ncy.get('.el-checkbox__original').check();\ncy.get('[data-testid=\"login-submit-button\"]').click();\ncy.get('[data-testid=\"menu-item-dust-overview\"] > span').click();\ncy.get('[data-testid=\"dust-add-button\"] > span').click();\ncy.get('#el-id-7502-285').click();\ncy.get('#el-id-7502-97 > span').click();\ncy.get('#el-id-7502-286').clear('1');\ncy.get('#el-id-7502-286').type('1');\ncy.get('#el-id-7502-287').clear('2');\ncy.get('#el-id-7502-287').type('2');\ncy.get('#el-id-7502-289').click();\ncy.get('.el-dialog__headerbtn > .el-icon > svg').click();\ncy.get('[data-testid=\"dust-search-button\"] > span').click();\ncy.get(':nth-child(1) > .el-table_1_column_10 > .cell > [data-testid=\"dust-view-button\"]').click();\ncy.get('[data-testid=\"dust-monitoring-status-matrix\"] > .left > :nth-child(1) > :nth-child(1)').click();\ncy.get('.el-select__suffix > .el-icon > svg').click();\ncy.get('#el-id-7502-313 > span').click();\n/* ==== End Cypress Studio ==== */",
"err": {
"message": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "fb19130c-5e56-4ecd-92de-f16961118cc7",
"parentUUID": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"87c72104-3595-4ac3-b64f-229a7c0faa29"
],
"failures": [
"fb19130c-5e56-4ecd-92de-f16961118cc7"
],
"pending": [],
"skipped": [],
"duration": 2915,
"root": false,
"rootEmpty": false,
"_timeout": 2000
}
],
"passes": [],
"failures": [],
"pending": [],
"skipped": [],
"duration": 0,
"root": true,
"rootEmpty": true,
"_timeout": 2000
}
],
"meta": {
"mocha": {
"version": "7.0.1"
},
"mochawesome": {
"options": {
"quiet": false,
"reportFilename": "mochawesome",
"saveHtml": true,
"saveJson": true,
"consoleReporter": "spec",
"useInlineDiffs": false,
"code": true
},
"version": "7.1.3"
},
"marge": {
"options": {
"reportDir": "cypress/reports",
"overwrite": false,
"html": true,
"json": true,
"timestamp": "mmddyyyy_HHMMss",
"reportTitle": "DC-TOM Cypress Tests",
"reportPageTitle": "DC-TOM 测试报告"
},
"version": "6.2.0"
}
}
}
\ No newline at end of file
#!/bin/bash
# DC-TOM 测试报告统计数据解析脚本
# 从 mochawesome JSON 报告中提取统计信息,生成统计摘要
set -e
# 颜色输出
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
# 配置
REPORTS_DIR="cypress/reports"
PUBLIC_DIR="public"
STATS_FILE="$PUBLIC_DIR/test-stats.json"
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查依赖
check_dependencies() {
if ! command -v jq &> /dev/null; then
log_warning "jq 未安装,将使用简化的 JSON 解析"
return 1
fi
return 0
}
# 使用 jq 解析统计信息(如果可用)
extract_stats_with_jq() {
local json_file=$1
local output_file=$2
if [ ! -f "$json_file" ]; then
log_error "JSON 文件不存在: $json_file"
return 1
fi
log_info "使用 jq 解析统计信息: $json_file"
# 提取基础统计信息
local stats=$(jq '.stats' "$json_file")
local start_time=$(jq -r '.stats.start' "$json_file")
local end_time=$(jq -r '.stats.end' "$json_file")
# 计算成功率和失败率
local total_tests=$(jq -r '.stats.tests' "$json_file")
local passes=$(jq -r '.stats.passes' "$json_file")
local failures=$(jq -r '.stats.failures' "$json_file")
local pending=$(jq -r '.stats.pending' "$json_file")
local duration=$(jq -r '.stats.duration' "$json_file")
# 转换时间格式
local start_formatted=""
local end_formatted=""
local duration_formatted=""
if [ "$start_time" != "null" ] && [ -n "$start_time" ]; then
start_formatted=$(date -j -f "%Y-%m-%dT%H:%M:%S" "${start_time%.*}" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "$start_time")
fi
if [ "$end_time" != "null" ] && [ -n "$end_time" ]; then
end_formatted=$(date -j -f "%Y-%m-%dT%H:%M:%S" "${end_time%.*}" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "$end_time")
fi
if [ "$duration" != "null" ] && [ -n "$duration" ]; then
# 转换毫秒为秒
local seconds=$((duration / 1000))
local minutes=$((seconds / 60))
local remaining_seconds=$((seconds % 60))
if [ $minutes -gt 0 ]; then
duration_formatted="${minutes}${remaining_seconds}秒"
else
duration_formatted="${seconds}秒"
fi
fi
# 计算百分比
local pass_percent=0
local fail_percent=0
if [ "$total_tests" -gt 0 ]; then
pass_percent=$(echo "scale=1; $passes * 100 / $total_tests" | bc 2>/dev/null || echo "0")
fail_percent=$(echo "scale=1; $failures * 100 / $total_tests" | bc 2>/dev/null || echo "0")
fi
# 生成统计摘要
cat > "$output_file" << EOF
{
"summary": {
"totalTests": $total_tests,
"passes": $passes,
"failures": $failures,
"pending": $pending,
"passPercent": $pass_percent,
"failPercent": $fail_percent,
"duration": $duration,
"durationFormatted": "$duration_formatted"
},
"timing": {
"startTime": "$start_time",
"endTime": "$end_time",
"startFormatted": "$start_formatted",
"endFormatted": "$end_formatted"
},
"details": $stats,
"generatedAt": "$(date '+%Y-%m-%d %H:%M:%S')",
"sourceFile": "$json_file"
}
EOF
return 0
}
# 简化的 JSON 解析(不依赖 jq)
extract_stats_simple() {
local json_file=$1
local output_file=$2
if [ ! -f "$json_file" ]; then
log_error "JSON 文件不存在: $json_file"
return 1
fi
log_info "使用简化解析器解析统计信息: $json_file"
# 使用 grep 和 sed 提取基本信息
local total_tests=$(grep -o '"tests":[[:space:]]*[0-9]*' "$json_file" | head -1 | cut -d':' -f2 | tr -d ' ')
local passes=$(grep -o '"passes":[[:space:]]*[0-9]*' "$json_file" | head -1 | cut -d':' -f2 | tr -d ' ')
local failures=$(grep -o '"failures":[[:space:]]*[0-9]*' "$json_file" | head -1 | cut -d':' -f2 | tr -d ' ')
local pending=$(grep -o '"pending":[[:space:]]*[0-9]*' "$json_file" | head -1 | cut -d':' -f2 | tr -d ' ')
local duration=$(grep -o '"duration":[[:space:]]*[0-9]*' "$json_file" | head -1 | cut -d':' -f2 | tr -d ' ')
# 设置默认值
total_tests=${total_tests:-0}
passes=${passes:-0}
failures=${failures:-0}
pending=${pending:-0}
duration=${duration:-0}
# 计算百分比
local pass_percent=0
local fail_percent=0
if [ "$total_tests" -gt 0 ]; then
pass_percent=$((passes * 100 / total_tests))
fail_percent=$((failures * 100 / total_tests))
fi
# 格式化时间
local duration_formatted=""
if [ "$duration" -gt 0 ]; then
local seconds=$((duration / 1000))
local minutes=$((seconds / 60))
local remaining_seconds=$((seconds % 60))
if [ $minutes -gt 0 ]; then
duration_formatted="${minutes}${remaining_seconds}秒"
else
duration_formatted="${seconds}秒"
fi
fi
# 生成简化的统计摘要
cat > "$output_file" << EOF
{
"summary": {
"totalTests": $total_tests,
"passes": $passes,
"failures": $failures,
"pending": $pending,
"passPercent": $pass_percent,
"failPercent": $fail_percent,
"duration": $duration,
"durationFormatted": "$duration_formatted"
},
"timing": {
"startTime": "",
"endTime": "",
"startFormatted": "",
"endFormatted": ""
},
"generatedAt": "$(date '+%Y-%m-%d %H:%M:%S')",
"sourceFile": "$json_file",
"note": "使用简化解析器生成"
}
EOF
return 0
}
# 解析所有报告并生成汇总统计
analyze_all_reports() {
log_info "分析所有测试报告..."
# 确保输出目录存在
mkdir -p "$PUBLIC_DIR"
# 查找最新的合并报告
local merged_report="$PUBLIC_DIR/reports/merged-report.json"
if [ -f "$merged_report" ]; then
log_info "发现合并报告: $merged_report"
# 尝试使用 jq 解析,失败则使用简化解析
if check_dependencies; then
if extract_stats_with_jq "$merged_report" "$STATS_FILE"; then
log_success "统计信息提取完成(使用 jq)"
else
log_warning "jq 解析失败,尝试简化解析"
extract_stats_simple "$merged_report" "$STATS_FILE"
fi
else
extract_stats_simple "$merged_report" "$STATS_FILE"
fi
else
log_warning "未找到合并报告,查找单个报告文件..."
# 查找最新的单个报告文件
local latest_report=$(find "$REPORTS_DIR" -name "*.json" -type f | head -1)
if [ -n "$latest_report" ] && [ -f "$latest_report" ]; then
log_info "发现单个报告: $latest_report"
if check_dependencies; then
if extract_stats_with_jq "$latest_report" "$STATS_FILE"; then
log_success "统计信息提取完成(使用 jq)"
else
extract_stats_simple "$latest_report" "$STATS_FILE"
fi
else
extract_stats_simple "$latest_report" "$STATS_FILE"
fi
else
log_error "未找到任何测试报告文件"
# 生成空的统计文件
cat > "$STATS_FILE" << EOF
{
"summary": {
"totalTests": 0,
"passes": 0,
"failures": 0,
"pending": 0,
"passPercent": 0,
"failPercent": 0,
"duration": 0,
"durationFormatted": "0秒"
},
"timing": {
"startTime": "",
"endTime": "",
"startFormatted": "",
"endFormatted": ""
},
"generatedAt": "$(date '+%Y-%m-%d %H:%M:%S')",
"sourceFile": "无",
"note": "未找到测试报告"
}
EOF
return 1
fi
fi
return 0
}
# 显示统计摘要
show_stats_summary() {
if [ ! -f "$STATS_FILE" ]; then
log_error "统计文件不存在: $STATS_FILE"
return 1
fi
log_info "测试统计摘要:"
echo
# 尝试使用 jq 格式化输出
if check_dependencies; then
local total=$(jq -r '.summary.totalTests' "$STATS_FILE")
local passes=$(jq -r '.summary.passes' "$STATS_FILE")
local failures=$(jq -r '.summary.failures' "$STATS_FILE")
local pass_percent=$(jq -r '.summary.passPercent' "$STATS_FILE")
local duration=$(jq -r '.summary.durationFormatted' "$STATS_FILE")
local generated=$(jq -r '.generatedAt' "$STATS_FILE")
echo "📊 测试概览:"
echo " 总测试数: $total"
echo " 通过数量: $passes"
echo " 失败数量: $failures"
echo " 成功率: $pass_percent%"
echo " 执行时间: $duration"
echo " 生成时间: $generated"
echo
# 根据成功率显示状态
local pass_num=$(echo "$pass_percent" | cut -d'.' -f1)
if [ "$pass_num" -eq 100 ]; then
echo -e "${GREEN}✅ 所有测试通过!${NC}"
elif [ "$pass_num" -ge 80 ]; then
echo -e "${YELLOW}⚠️ 大部分测试通过,请关注失败的测试${NC}"
else
echo -e "${RED}❌ 测试失败率较高,需要立即处理${NC}"
fi
else
# 简化显示
echo "📊 测试统计文件已生成: $STATS_FILE"
echo "请使用支持 JSON 的工具查看详细信息"
fi
echo
}
# 显示使用说明
show_usage() {
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " analyze 分析测试报告并生成统计信息(默认)"
echo " show 显示统计摘要"
echo " help 显示此帮助信息"
echo ""
echo "功能:"
echo " - 从 mochawesome JSON 报告中提取测试统计信息"
echo " - 生成结构化的统计摘要文件"
echo " - 支持自动检测和解析最新的测试报告"
echo " - 兼容有/无 jq 工具的环境"
echo ""
echo "输出文件:"
echo " $STATS_FILE"
echo ""
echo "示例:"
echo " $0 analyze # 分析并生成统计信息"
echo " $0 show # 显示统计摘要"
}
# 主函数
main() {
local action=${1:-"analyze"}
echo "========================================"
echo " DC-TOM 测试统计分析工具"
echo "========================================"
echo
case $action in
"analyze")
analyze_all_reports
show_stats_summary
;;
"show")
show_stats_summary
;;
"help"|"-h"|"--help")
show_usage
;;
*)
log_error "未知操作: $action"
show_usage
exit 1
;;
esac
}
# 运行主函数
main "$@"
\ No newline at end of file
......@@ -20,6 +20,7 @@ BUILD_DIR="dist"
REPORTS_DIR="cypress/reports"
PUBLIC_DIR="public"
VITE_PORT="3000"
MAX_REPORTS_TO_KEEP=3 # 保留最近的报告数量
# 日志函数
log_info() {
......@@ -142,6 +143,74 @@ stop_server() {
fi
}
# 清理历史报告,保留最近的 N 次测试结果
cleanup_old_reports() {
local keep_count=${1:-$MAX_REPORTS_TO_KEEP}
log_info "清理历史测试报告,保留最近 $keep_count 次结果..."
# 清理 cypress/reports 目录中的历史报告
if [ -d "$REPORTS_DIR" ]; then
log_info "清理 $REPORTS_DIR 目录..."
# 清理 HTML 报告文件(按时间戳排序)
local html_files=($REPORTS_DIR/mochawesome_*.html)
if [ ${#html_files[@]} -gt 0 ] && [ -f "${html_files[0]}" ]; then
log_info "发现 ${#html_files[@]} 个 HTML 报告文件"
# 按文件修改时间排序,保留最新的
printf '%s\n' "${html_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)) | while read file; do
log_info "删除旧 HTML 报告: $(basename "$file")"
rm -f "$file"
done
fi
# 清理 JSON 报告文件
local json_files=($REPORTS_DIR/mochawesome_*.json)
if [ ${#json_files[@]} -gt 0 ] && [ -f "${json_files[0]}" ]; then
log_info "发现 ${#json_files[@]} 个 JSON 报告文件"
printf '%s\n' "${json_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)) | while read file; do
log_info "删除旧 JSON 报告: $(basename "$file")"
rm -f "$file"
done
fi
fi
# 清理测试视频
if [ -d "cypress/videos" ]; then
log_info "清理测试视频..."
local video_files=(cypress/videos/*.mp4)
if [ ${#video_files[@]} -gt 0 ] && [ -f "${video_files[0]}" ]; then
log_info "发现 ${#video_files[@]} 个视频文件"
printf '%s\n' "${video_files[@]}" | xargs ls -t | tail -n +$((keep_count + 1)) | while read file; do
log_info "删除旧视频: $(basename "$file")"
rm -f "$file"
done
fi
fi
# 清理截图目录(按目录修改时间)
if [ -d "cypress/screenshots" ]; then
log_info "清理失败截图..."
# 获取所有截图子目录
local screenshot_dirs=(cypress/screenshots/*/)
if [ ${#screenshot_dirs[@]} -gt 0 ] && [ -d "${screenshot_dirs[0]}" ]; then
log_info "发现 ${#screenshot_dirs[@]} 个截图目录"
printf '%s\n' "${screenshot_dirs[@]}" | xargs ls -td | tail -n +$((keep_count + 1)) | while read dir; do
log_info "删除旧截图目录: $(basename "$dir")"
rm -rf "$dir"
done
fi
fi
log_success "历史报告清理完成,保留最近 $keep_count 次测试结果"
}
# 运行 Cypress 测试
run_cypress_tests() {
local test_type=$1
......@@ -151,6 +220,9 @@ run_cypress_tests() {
log_info "==================== $test_name ===================="
log_info "开始运行 $test_name ..."
# 清理历史报告(在测试运行前)
cleanup_old_reports
# 创建报告目录
mkdir -p "$REPORTS_DIR/$test_type"
......@@ -235,6 +307,16 @@ generate_reports() {
log_warning "HTML报告生成失败"
}
# 提取统计信息
log_info "提取测试统计信息..."
if [ -f "./extract-stats.sh" ]; then
./extract-stats.sh analyze > /dev/null 2>&1 || {
log_warning "统计信息提取失败"
}
else
log_warning "统计提取脚本不存在"
fi
# 生成分类报告
log_info "生成分类测试报告..."
for test_dir in "$REPORTS_DIR"/*; do
......@@ -271,7 +353,32 @@ generate_reports() {
# 生成索引页面
log_info "生成报告索引页面..."
cat > "$PUBLIC_DIR/index.html" << 'EOF'
if [ -f "report-template.html" ]; then
# 复制报告模板
cp "report-template.html" "$PUBLIC_DIR/index.html"
# 如果存在统计数据文件,将其嵌入到HTML中
if [ -f "$PUBLIC_DIR/test-stats.json" ]; then
log_info "嵌入统计数据到报告模板..."
# 读取统计数据并转义特殊字符
stats_json=$(cat "$PUBLIC_DIR/test-stats.json" | sed 's/"/\\"/g' | tr -d '\n\r')
# 替换HTML中的内嵌数据占位符
sed -i.bak "s|<!-- 这里可以通过服务器端或构建脚本注入真实的统计数据 -->|$stats_json|g" "$PUBLIC_DIR/index.html"
# 删除备份文件
rm -f "$PUBLIC_DIR/index.html.bak"
log_success "统计数据已嵌入到报告模板"
else
log_warning "统计数据文件不存在,使用默认模板"
fi
log_success "使用增强型报告模板"
else
log_warning "未找到报告模板,使用默认模板"
cat > "$PUBLIC_DIR/index.html" << 'EOF'
<!DOCTYPE html>
<html>
<head>
......@@ -330,6 +437,7 @@ generate_reports() {
</body>
</html>
EOF
fi
log_success "测试报告生成完成!"
log_info "报告位置: $PUBLIC_DIR/"
......@@ -378,6 +486,7 @@ show_usage() {
echo " basic - 基础测试 (spec)"
echo " full - 完整测试套件 (spec)"
echo " all - 运行所有测试类型 (默认)"
echo " cleanup - 只清理历史报告,不运行测试"
echo ""
echo "使用前提:"
echo " - 请确保已运行 'npm install' 安装项目依赖"
......@@ -387,7 +496,12 @@ show_usage() {
echo " npm install # 先安装依赖"
echo " $0 basic # 只运行基础测试"
echo " $0 full # 运行完整测试"
echo " $0 cleanup # 只清理历史报告"
echo " $0 # 运行所有测试"
echo ""
echo "清理策略:"
echo " - 自动保留最近 $MAX_REPORTS_TO_KEEP 次测试结果"
echo " - 清理内容包括: HTML/JSON 报告、测试视频、失败截图"
}
# 主函数
......@@ -404,6 +518,12 @@ main() {
show_usage
exit 0
;;
"cleanup")
log_info "清理模式: 只清理历史报告"
cleanup_old_reports
log_success "清理完成!"
exit 0
;;
"basic"|"full"|"all")
;;
*)
......
......@@ -16,6 +16,11 @@
"cy:run:full": "cypress run --browser chrome --headless --spec 'cypress/e2e/*.cy.js'",
"cy:run:generated": "cypress run --browser chrome --headless --spec 'cypress/e2e/generated/*.cy.js'",
"test:reports": "mochawesome-merge cypress/reports/**/*.json -o merged-report.json && marge merged-report.json --reportDir reports --inline",
"cleanup:reports": "./cleanup-reports.sh",
"cleanup:reports:1": "./cleanup-reports.sh 1",
"cleanup:reports:5": "./cleanup-reports.sh 5",
"stats:extract": "./extract-stats.sh analyze",
"stats:show": "./extract-stats.sh show",
"ci:local": "./local-ci.sh",
"ci:basic": "./local-ci.sh basic",
"ci:full": "./local-ci.sh full",
......
<!DOCTYPE html>
<html>
<head>
<title>DC-TOM 本地测试报告</title>
<title>DC-TOM 测试报告仪表盘</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 移除 Chart.js CDN,使用纯 CSS 解决方案 -->
<style>
body { font-family: Arial, sans-serif; margin: 40px; background-color: #f5f5f5; }
.header { text-align: center; margin-bottom: 30px; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
.container { max-width: 800px; margin: 0 auto; }
.links { list-style: none; padding: 0; }
.links li { margin: 15px 0; background: white; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
.links a { text-decoration: none; color: #007cba; font-size: 18px; display: block; padding: 20px; border-radius: 8px; transition: background-color 0.2s; }
.links a:hover { background-color: #f0f8ff; text-decoration: none; }
.icon { margin-right: 10px; font-size: 20px; }
.description { color: #666; font-size: 14px; margin-top: 5px; }
.local-note { background: #fff3cd; color: #856404; padding: 15px; border-radius: 8px; margin-bottom: 20px; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container { max-width: 1200px; margin: 0 auto; }
.header {
text-align: center;
color: white;
margin-bottom: 30px;
padding: 20px;
}
.header h1 { font-size: 2.5em; margin-bottom: 10px; }
.header p { font-size: 1.1em; opacity: 0.9; }
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: white;
border-radius: 12px;
padding: 20px;
text-align: center;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
.stat-card:hover { transform: translateY(-5px); }
.stat-number {
font-size: 2.5em;
font-weight: bold;
margin-bottom: 5px;
}
.stat-label {
color: #666;
font-size: 1.1em;
margin-bottom: 10px;
}
.stat-change {
font-size: 0.9em;
padding: 4px 8px;
border-radius: 4px;
}
.stat-success { color: #27ae60; }
.stat-danger { color: #e74c3c; }
.stat-warning { color: #f39c12; }
.stat-info { color: #3498db; }
.charts-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-bottom: 30px;
}
.chart-container {
background: white;
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.chart-title {
font-size: 1.3em;
font-weight: bold;
margin-bottom: 15px;
text-align: center;
}
/* 纯 CSS 饼图样式 */
.simple-pie-chart {
position: relative;
width: 200px;
height: 200px;
border-radius: 50%;
margin: 20px auto;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2em;
font-weight: bold;
color: white;
text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
}
.chart-legend {
display: flex;
justify-content: center;
gap: 20px;
margin-top: 15px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
}
.legend-color {
width: 16px;
height: 16px;
border-radius: 3px;
}
.network-status {
text-align: center;
padding: 10px;
margin-bottom: 20px;
border-radius: 8px;
font-weight: bold;
}
.status-online {
background: #e8f5e8;
color: #2e7d32;
border: 1px solid #4caf50;
}
.status-offline {
background: #fff3e0;
color: #f57c00;
border: 1px solid #ff9800;
}
.links-section {
background: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.links-title {
font-size: 1.5em;
font-weight: bold;
margin-bottom: 20px;
text-align: center;
}
.links-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 15px;
}
.link-item {
display: flex;
align-items: center;
padding: 15px;
border: 2px solid #f0f0f0;
border-radius: 8px;
text-decoration: none;
color: #333;
transition: all 0.3s ease;
}
.link-item:hover {
border-color: #667eea;
background-color: #f8f9ff;
transform: translateX(5px);
}
.link-icon {
font-size: 2em;
margin-right: 15px;
width: 50px;
text-align: center;
}
.link-content h3 {
margin-bottom: 5px;
color: #333;
}
.link-content p {
color: #666;
font-size: 0.9em;
}
.footer {
text-align: center;
color: white;
margin-top: 30px;
opacity: 0.8;
}
.loading {
text-align: center;
color: #666;
font-style: italic;
}
@media (max-width: 768px) {
.charts-section { grid-template-columns: 1fr; }
.header h1 { font-size: 2em; }
.stat-number { font-size: 2em; }
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🧪 DC-TOM Cypress 本地测试报告</h1>
<p><strong>项目:</strong> dctomproject | <strong>环境:</strong> 本地开发</p>
<p><strong>生成时间:</strong> <script>document.write(new Date().toLocaleString());</script></p>
<h1>🧪 DC-TOM 测试报告仪表盘</h1>
<p>dctomproject | 本地开发环境 | <span id="current-time"></span></p>
</div>
<div class="local-note">
<strong>📝 本地测试说明:</strong> 此报告由本地 CI 脚本生成,用于在 GitLab Runner 不可用时进行测试验证。
<!-- 添加网络状态指示器 -->
<div id="network-status" class="network-status status-offline">
🔄 正在加载统计数据...
</div>
<ul class="links">
<li>
<a href="reports/merged-report.html">
<span class="icon">📊</span>完整测试报告
<div class="description">查看详细的测试执行结果、通过率统计和失败原因分析</div>
<div class="stats-grid" id="stats-grid">
<div class="stat-card">
<div class="stat-number stat-info" id="total-tests">加载中...</div>
<div class="stat-label">测试用例总数</div>
<div class="stat-change" id="total-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-success" id="passed-tests">加载中...</div>
<div class="stat-label">通过测试</div>
<div class="stat-change" id="passed-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-danger" id="failed-tests">加载中...</div>
<div class="stat-label">失败测试</div>
<div class="stat-change" id="failed-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-warning" id="success-rate">加载中...</div>
<div class="stat-label">成功率</div>
<div class="stat-change" id="rate-change"></div>
</div>
</div>
<div class="charts-section">
<div class="chart-container">
<div class="chart-title">测试结果分布</div>
<!-- 替换 canvas 为纯 CSS 图表 -->
<div id="simple-chart">
<div class="simple-pie-chart" id="pie-chart">
<span id="chart-center-text">数据加载中...</span>
</div>
<div class="chart-legend" id="chart-legend">
<!-- 图例将通过 JavaScript 动态生成 -->
</div>
</div>
</div>
<div class="chart-container">
<div class="chart-title">执行时间信息</div>
<div id="timing-info" class="loading">加载中...</div>
</div>
</div>
<div class="links-section">
<div class="links-title">📁 报告和资源</div>
<div class="links-grid">
<a href="reports/merged-report.html" class="link-item">
<div class="link-icon">📈</div>
<div class="link-content">
<h3>详细测试报告</h3>
<p>查看完整的测试执行结果和失败分析</p>
</div>
</a>
</li>
<li>
<a href="reports/basic/">
<span class="icon">🔧</span>基础功能测试
<div class="description">spec.cy.js 测试文件的执行结果</div>
<a href="reports/basic/" class="link-item">
<div class="link-icon">🔧</div>
<div class="link-content">
<h3>基础功能测试</h3>
<p>spec.cy.js 测试文件的执行结果</p>
</div>
</a>
</li>
<li>
<a href="assets/videos/">
<span class="icon">🎥</span>测试执行视频
<div class="description">观看完整的测试执行过程录像</div>
<a href="assets/videos/" class="link-item">
<div class="link-icon">🎥</div>
<div class="link-content">
<h3>测试执行视频</h3>
<p>观看完整的测试执行过程录像</p>
</div>
</a>
</li>
<li>
<a href="assets/screenshots/">
<span class="icon">📸</span>失败截图
<div class="description">查看测试失败时的页面截图,便于问题定位</div>
<a href="assets/screenshots/" class="link-item">
<div class="link-icon">📸</div>
<div class="link-content">
<h3>失败截图</h3>
<p>查看测试失败时的页面截图</p>
</div>
</a>
</li>
</ul>
</div>
</div>
<div class="footer">
<p>🛠️ 由 DC-TOM 本地 CI 脚本生成 | 更新时间: <span id="generated-time"></span></p>
</div>
</div>
<script>
// 内嵌的统计数据,用于替代外部JSON文件
let statsData = null;
// 设置当前时间
document.getElementById('current-time').textContent = new Date().toLocaleString('zh-CN');
// 检查是否在本地文件系统中运行
function isFileProtocol() {
return window.location.protocol === 'file:';
}
// 尝试从多个源加载统计数据
async function loadStats() {
const networkStatus = document.getElementById('network-status');
try {
// 如果是 file:// 协议,使用内嵌数据
if (isFileProtocol()) {
networkStatus.textContent = '📁 本地文件模式 - 使用内嵌数据';
networkStatus.className = 'network-status status-offline';
await loadEmbeddedStats();
return;
}
// 尝试加载 JSON 文件
networkStatus.textContent = '🌐 正在加载统计数据...';
networkStatus.className = 'network-status status-online';
const response = await fetch('test-stats.json?t=' + Date.now());
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
networkStatus.textContent = '✅ 数据加载成功';
networkStatus.className = 'network-status status-online';
// 更新统计数据
updateStatCards(data);
updateCharts(data);
updateTimingInfo(data);
// 设置生成时间
document.getElementById('generated-time').textContent = data.generatedAt || '未知';
} catch (error) {
console.error('加载统计数据失败:', error);
networkStatus.textContent = '⚠️ 数据加载失败,使用示例数据';
networkStatus.className = 'network-status status-offline';
// 使用示例数据
await loadEmbeddedStats();
}
}
// 加载内嵌的示例数据
async function loadEmbeddedStats() {
// 从当前页面的script标签中提取数据,或使用默认示例数据
const defaultData = {
summary: {
totalTests: 6,
passes: 3,
failures: 3,
pending: 0,
passPercent: 50,
failPercent: 50,
duration: 1451738,
durationFormatted: "24分11秒"
},
timing: {
startTime: "",
endTime: "",
startFormatted: "",
endFormatted: ""
},
generatedAt: new Date().toLocaleString('zh-CN'),
sourceFile: "内嵌数据",
note: "离线模式 - 使用内嵌示例数据"
};
// 尝试从页面中读取真实数据(由脚本注入)
const dataElement = document.getElementById('embedded-stats-data');
if (dataElement && dataElement.textContent) {
try {
const embeddedData = JSON.parse(dataElement.textContent);
statsData = embeddedData;
} catch (e) {
console.warn('解析内嵌数据失败,使用默认数据');
statsData = defaultData;
}
} else {
statsData = defaultData;
}
// 更新界面
updateStatCards(statsData);
updateCharts(statsData);
updateTimingInfo(statsData);
document.getElementById('generated-time').textContent = statsData.generatedAt || '未知';
}
function updateStatCards(data) {
const summary = data.summary || {};
document.getElementById('total-tests').textContent = summary.totalTests || 0;
document.getElementById('passed-tests').textContent = summary.passes || 0;
document.getElementById('failed-tests').textContent = summary.failures || 0;
document.getElementById('success-rate').textContent = (summary.passPercent || 0) + '%';
// 根据成功率设置颜色
const rate = summary.passPercent || 0;
const rateElement = document.getElementById('success-rate');
if (rate === 100) {
rateElement.className = 'stat-number stat-success';
} else if (rate >= 80) {
rateElement.className = 'stat-number stat-warning';
} else {
rateElement.className = 'stat-number stat-danger';
}
}
// 使用CSS样式创建简单的饼图(替代Chart.js)
function updateCharts(data) {
const summary = data.summary || {};
const pieChart = document.getElementById('pie-chart');
const chartLegend = document.getElementById('chart-legend');
const centerText = document.getElementById('chart-center-text');
const passes = summary.passes || 0;
const failures = summary.failures || 0;
const pending = summary.pending || 0;
const total = passes + failures + pending;
if (total === 0) {
centerText.textContent = '暂无数据';
pieChart.style.background = '#f0f0f0';
return;
}
// 计算角度
const passAngle = (passes / total) * 360;
const failAngle = (failures / total) * 360;
const pendingAngle = (pending / total) * 360;
// 创建圆锥渐变背景
let gradientStops = [];
let currentAngle = 0;
if (passes > 0) {
gradientStops.push(`#27ae60 ${currentAngle}deg ${currentAngle + passAngle}deg`);
currentAngle += passAngle;
}
if (failures > 0) {
gradientStops.push(`#e74c3c ${currentAngle}deg ${currentAngle + failAngle}deg`);
currentAngle += failAngle;
}
if (pending > 0) {
gradientStops.push(`#f39c12 ${currentAngle}deg ${currentAngle + pendingAngle}deg`);
}
pieChart.style.background = `conic-gradient(${gradientStops.join(', ')})`;
centerText.textContent = `${total} 个测试`;
// 更新图例
chartLegend.innerHTML = `
${passes > 0 ? `<div class="legend-item">
<div class="legend-color" style="background: #27ae60;"></div>
<span>通过 (${passes})</span>
</div>` : ''}
${failures > 0 ? `<div class="legend-item">
<div class="legend-color" style="background: #e74c3c;"></div>
<span>失败 (${failures})</span>
</div>` : ''}
${pending > 0 ? `<div class="legend-item">
<div class="legend-color" style="background: #f39c12;"></div>
<span>待处理 (${pending})</span>
</div>` : ''}
`;
}
function updateTimingInfo(data) {
const summary = data.summary || {};
const timing = data.timing || {};
const timingHTML = `
<div style="text-align: left; font-size: 1.1em;">
<p><strong>执行时间:</strong> ${summary.durationFormatted || '未知'}</p>
<p><strong>开始时间:</strong> ${timing.startFormatted || '未知'}</p>
<p><strong>结束时间:</strong> ${timing.endFormatted || '未知'}</p>
<div style="margin-top: 15px; padding: 15px; background: #f8f9fa; border-radius: 8px;">
<strong>执行状态:</strong>
${getExecutionStatus(summary)}
</div>
${data.note ? `<div style="margin-top: 10px; font-size: 0.9em; color: #666;">
<em>📝 ${data.note}</em>
</div>` : ''}
</div>
`;
document.getElementById('timing-info').innerHTML = timingHTML;
}
function getExecutionStatus(summary) {
const rate = summary.passPercent || 0;
if (rate === 100) {
return '<span style="color: #27ae60;">✅ 所有测试通过</span>';
} else if (rate >= 80) {
return '<span style="color: #f39c12;">⚠️ 大部分测试通过</span>';
} else {
return '<span style="color: #e74c3c;">❌ 需要关注失败测试</span>';
}
}
// 页面加载完成后加载数据
document.addEventListener('DOMContentLoaded', loadStats);
</script>
<!-- 用于存储内嵌统计数据的隐藏元素 -->
<script id="embedded-stats-data" type="application/json">
{"summary":{"totalTests":6,"passes":3,"failures":3,"pending":0,"passPercent":50,"failPercent":50,"duration":1451738,"durationFormatted":"24分11秒"},"timing":{"startTime":"","endTime":"","startFormatted":"","endFormatted":""},"generatedAt":"2025-09-02 10:18:05","sourceFile":"public/reports/merged-report.json","note":"使用简化解析器生成"}
</script>
</body>
</html>
</html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"stats": {
"suites": 2,
"tests": 4,
"passes": 2,
"suites": 3,
"tests": 6,
"passes": 3,
"pending": 0,
"failures": 2,
"testsRegistered": 4,
"failures": 3,
"testsRegistered": 6,
"passPercent": 50,
"pendingPercent": 0,
"other": 0,
"hasOther": false,
"skipped": 0,
"hasSkipped": false,
"start": "2025-09-02T01:33:13.291Z",
"end": "2025-09-02T01:33:48.994Z",
"duration": 35703
"start": "2025-09-02T01:53:52.655Z",
"end": "2025-09-02T02:18:04.393Z",
"duration": 1451738
},
"results": [
{
"uuid": "f18a73a3-f766-45eb-b8a9-54d327c8cd97",
"uuid": "22f811c6-8cbb-4c99-a2ea-acce437390e6",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
......@@ -27,7 +27,7 @@
"tests": [],
"suites": [
{
"uuid": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"title": "template spec",
"fullFile": "",
"file": "",
......@@ -38,7 +38,7 @@
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1552,
"duration": 1370,
"state": "passed",
"speed": "fast",
"pass": true,
......@@ -47,8 +47,8 @@
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "57a4f280-853c-47a8-91c7-b3d5daf05f24",
"parentUUID": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "09558a63-0e23-4fb8-b747-59cfe98e4a56",
"parentUUID": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"isHook": false,
"skipped": false
},
......@@ -56,7 +56,7 @@
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1204,
"duration": 1205,
"state": "failed",
"speed": null,
"pass": false,
......@@ -69,22 +69,22 @@
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "7a7be8fb-3858-46cd-884c-349dd1de3ec4",
"parentUUID": "b08d0fe5-99c2-4e84-8063-f358d2c8fc6e",
"uuid": "db95fbfa-3327-447d-a65a-ba555d923ade",
"parentUUID": "5532d3c1-9627-4bc3-9cf1-3dea7515b2fe",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"57a4f280-853c-47a8-91c7-b3d5daf05f24"
"09558a63-0e23-4fb8-b747-59cfe98e4a56"
],
"failures": [
"7a7be8fb-3858-46cd-884c-349dd1de3ec4"
"db95fbfa-3327-447d-a65a-ba555d923ade"
],
"pending": [],
"skipped": [],
"duration": 2756,
"duration": 2575,
"root": false,
"rootEmpty": false,
"_timeout": 2000
......@@ -100,7 +100,7 @@
"_timeout": 2000
},
{
"uuid": "8bae2f11-f252-491a-837d-c74d1572556a",
"uuid": "2a482d30-b676-4901-ab1c-871aff43ac38",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
......@@ -109,7 +109,7 @@
"tests": [],
"suites": [
{
"uuid": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "0d22799a-32d2-4e3d-b618-c96281390836",
"title": "template spec",
"fullFile": "",
"file": "",
......@@ -120,7 +120,7 @@
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1651,
"duration": 1679,
"state": "passed",
"speed": "fast",
"pass": true,
......@@ -129,8 +129,8 @@
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "58ea6f27-d2fb-478e-86ab-a4900b8c3c13",
"parentUUID": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee",
"parentUUID": "0d22799a-32d2-4e3d-b618-c96281390836",
"isHook": false,
"skipped": false
},
......@@ -138,7 +138,7 @@
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1209,
"duration": 1241,
"state": "failed",
"speed": null,
"pass": false,
......@@ -148,25 +148,107 @@
"code": "/* ==== Generated with Cypress Studio ==== */\ncy.visit('http://localhost:3000/');\ncy.get('[data-testid=\"login-username-input\"]').clear('z');\ncy.get('[data-testid=\"login-username-input\"]').type('zongheng_admin');\ncy.get('[data-testid=\"login-password-input\"]').click();\ncy.get('[data-testid=\"login-password-input\"]').clear('9%#F46vt');\ncy.get('[data-testid=\"login-password-input\"]').type('9%#F46vt');\ncy.get('[data-testid=\"login-captcha-input\"]').clear('8');\ncy.get('[data-testid=\"login-captcha-input\"]').type('8888');\ncy.get('.el-checkbox__label').click();\ncy.get('.el-checkbox__original').check();\ncy.get('[data-testid=\"login-submit-button\"]').click();\ncy.get('[data-testid=\"menu-item-dust-overview\"] > span').click();\ncy.get('[data-testid=\"dust-add-button\"] > span').click();\ncy.get('#el-id-7502-285').click();\ncy.get('#el-id-7502-97 > span').click();\ncy.get('#el-id-7502-286').clear('1');\ncy.get('#el-id-7502-286').type('1');\ncy.get('#el-id-7502-287').clear('2');\ncy.get('#el-id-7502-287').type('2');\ncy.get('#el-id-7502-289').click();\ncy.get('.el-dialog__headerbtn > .el-icon > svg').click();\ncy.get('[data-testid=\"dust-search-button\"] > span').click();\ncy.get(':nth-child(1) > .el-table_1_column_10 > .cell > [data-testid=\"dust-view-button\"]').click();\ncy.get('[data-testid=\"dust-monitoring-status-matrix\"] > .left > :nth-child(1) > :nth-child(1)').click();\ncy.get('.el-select__suffix > .el-icon > svg').click();\ncy.get('#el-id-7502-313 > span').click();\n/* ==== End Cypress Studio ==== */",
"err": {
"message": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "4ea99dce-ceeb-48b2-9108-bb3a747618fc",
"parentUUID": "0d22799a-32d2-4e3d-b618-c96281390836",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"5eb141ba-9a4c-4d32-ab5d-c8b37a2ebbee"
],
"failures": [
"4ea99dce-ceeb-48b2-9108-bb3a747618fc"
],
"pending": [],
"skipped": [],
"duration": 2920,
"root": false,
"rootEmpty": false,
"_timeout": 2000
}
],
"passes": [],
"failures": [],
"pending": [],
"skipped": [],
"duration": 0,
"root": true,
"rootEmpty": true,
"_timeout": 2000
},
{
"uuid": "508a3340-e4cd-4111-9586-9b47bbf68e3c",
"title": "",
"fullFile": "cypress/e2e/spec.cy.js",
"file": "cypress/e2e/spec.cy.js",
"beforeHooks": [],
"afterHooks": [],
"tests": [],
"suites": [
{
"uuid": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"title": "template spec",
"fullFile": "",
"file": "",
"beforeHooks": [],
"afterHooks": [],
"tests": [
{
"title": "passes",
"fullTitle": "template spec passes",
"timedOut": null,
"duration": 1638,
"state": "passed",
"speed": "fast",
"pass": true,
"fail": false,
"pending": false,
"context": null,
"code": "cy.visit('https://example.cypress.io');",
"err": {},
"uuid": "87c72104-3595-4ac3-b64f-229a7c0faa29",
"parentUUID": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"isHook": false,
"skipped": false
},
{
"title": "test1",
"fullTitle": "template spec test1",
"timedOut": null,
"duration": 1277,
"state": "failed",
"speed": null,
"pass": false,
"fail": true,
"pending": false,
"context": null,
"code": "/* ==== Generated with Cypress Studio ==== */\ncy.visit('http://localhost:3000/');\ncy.get('[data-testid=\"login-username-input\"]').clear('z');\ncy.get('[data-testid=\"login-username-input\"]').type('zongheng_admin');\ncy.get('[data-testid=\"login-password-input\"]').click();\ncy.get('[data-testid=\"login-password-input\"]').clear('9%#F46vt');\ncy.get('[data-testid=\"login-password-input\"]').type('9%#F46vt');\ncy.get('[data-testid=\"login-captcha-input\"]').clear('8');\ncy.get('[data-testid=\"login-captcha-input\"]').type('8888');\ncy.get('.el-checkbox__label').click();\ncy.get('.el-checkbox__original').check();\ncy.get('[data-testid=\"login-submit-button\"]').click();\ncy.get('[data-testid=\"menu-item-dust-overview\"] > span').click();\ncy.get('[data-testid=\"dust-add-button\"] > span').click();\ncy.get('#el-id-7502-285').click();\ncy.get('#el-id-7502-97 > span').click();\ncy.get('#el-id-7502-286').clear('1');\ncy.get('#el-id-7502-286').type('1');\ncy.get('#el-id-7502-287').clear('2');\ncy.get('#el-id-7502-287').type('2');\ncy.get('#el-id-7502-289').click();\ncy.get('.el-dialog__headerbtn > .el-icon > svg').click();\ncy.get('[data-testid=\"dust-search-button\"] > span').click();\ncy.get(':nth-child(1) > .el-table_1_column_10 > .cell > [data-testid=\"dust-view-button\"]').click();\ncy.get('[data-testid=\"dust-monitoring-status-matrix\"] > .left > :nth-child(1) > :nth-child(1)').click();\ncy.get('.el-select__suffix > .el-icon > svg').click();\ncy.get('#el-id-7502-313 > span').click();\n/* ==== End Cypress Studio ==== */",
"err": {
"message": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with",
"estack": "CypressError: `cy.check()` failed because this element is not visible:\n\n`<input class=\"el-checkbox__original\" type=\"checkbox\" value=\"记住密码\">`\n\nThis element `<input.el-checkbox__original>` is not visible because it has an effective width and height of: `0 x 0` pixels.\n\nFix this problem, or use `{force: true}` to disable error checking.\n\nhttps://on.cypress.io/element-cannot-be-interacted-with\n at runVisibilityCheck (http://localhost:3000/__cypress/runner/cypress_runner.js:144957:58)\n at Object.isVisible (http://localhost:3000/__cypress/runner/cypress_runner.js:144968:10)\n at checkOrUncheckEl (http://localhost:3000/__cypress/runner/cypress_runner.js:112342:24)\n at tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at Object.gotValue (http://localhost:3000/__cypress/runner/cypress_runner.js:6499:18)\n at Object.gotAccum (http://localhost:3000/__cypress/runner/cypress_runner.js:6488:25)\n at Object.tryCatcher (http://localhost:3000/__cypress/runner/cypress_runner.js:1830:23)\n at module.exports.Promise._settlePromiseFromHandler (http://localhost:3000/__cypress/runner/cypress_runner.js:1542:31)\n at module.exports.Promise._settlePromise (http://localhost:3000/__cypress/runner/cypress_runner.js:1599:18)\n at module.exports.Promise._settlePromiseCtx (http://localhost:3000/__cypress/runner/cypress_runner.js:1636:10)\n at _drainQueueStep (http://localhost:3000/__cypress/runner/cypress_runner.js:2434:12)\n at _drainQueue (http://localhost:3000/__cypress/runner/cypress_runner.js:2423:9)\n at Async._drainQueues (http://localhost:3000/__cypress/runner/cypress_runner.js:2439:5)\n at <unknown> (http://localhost:3000/__cypress/runner/cypress_runner.js:2309:14)\nFrom Your Spec Code:\n at Context.eval (webpack://dctomproject/./cypress/e2e/spec.cy.js:18:37)",
"diff": null
},
"uuid": "f7fd903c-575c-48a3-b5db-2f9d1fdd3901",
"parentUUID": "b4095b36-e359-42cd-9f7c-50da145b3df8",
"uuid": "fb19130c-5e56-4ecd-92de-f16961118cc7",
"parentUUID": "e0b5a598-a6b0-4909-aab7-6ce00608292b",
"isHook": false,
"skipped": false
}
],
"suites": [],
"passes": [
"58ea6f27-d2fb-478e-86ab-a4900b8c3c13"
"87c72104-3595-4ac3-b64f-229a7c0faa29"
],
"failures": [
"f7fd903c-575c-48a3-b5db-2f9d1fdd3901"
"fb19130c-5e56-4ecd-92de-f16961118cc7"
],
"pending": [],
"skipped": [],
"duration": 2860,
"duration": 2915,
"root": false,
"rootEmpty": false,
"_timeout": 2000
......
{
"summary": {
"totalTests": 6,
"passes": 3,
"failures": 3,
"pending": 0,
"passPercent": 50,
"failPercent": 50,
"duration": 1451738,
"durationFormatted": "24分11秒"
},
"timing": {
"startTime": "",
"endTime": "",
"startFormatted": "",
"endFormatted": ""
},
"generatedAt": "2025-09-02 10:18:05",
"sourceFile": "public/reports/merged-report.json",
"note": "使用简化解析器生成"
}
<!DOCTYPE html>
<html>
<head>
<title>DC-TOM 测试报告仪表盘</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 移除 Chart.js CDN,使用纯 CSS 解决方案 -->
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container { max-width: 1200px; margin: 0 auto; }
.header {
text-align: center;
color: white;
margin-bottom: 30px;
padding: 20px;
}
.header h1 { font-size: 2.5em; margin-bottom: 10px; }
.header p { font-size: 1.1em; opacity: 0.9; }
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: white;
border-radius: 12px;
padding: 20px;
text-align: center;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
.stat-card:hover { transform: translateY(-5px); }
.stat-number {
font-size: 2.5em;
font-weight: bold;
margin-bottom: 5px;
}
.stat-label {
color: #666;
font-size: 1.1em;
margin-bottom: 10px;
}
.stat-change {
font-size: 0.9em;
padding: 4px 8px;
border-radius: 4px;
}
.stat-success { color: #27ae60; }
.stat-danger { color: #e74c3c; }
.stat-warning { color: #f39c12; }
.stat-info { color: #3498db; }
.charts-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-bottom: 30px;
}
.chart-container {
background: white;
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.chart-title {
font-size: 1.3em;
font-weight: bold;
margin-bottom: 15px;
text-align: center;
}
.links-section {
background: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.links-title {
font-size: 1.5em;
font-weight: bold;
margin-bottom: 20px;
text-align: center;
}
.links-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 15px;
}
.link-item {
display: flex;
align-items: center;
padding: 15px;
border: 2px solid #f0f0f0;
border-radius: 8px;
text-decoration: none;
color: #333;
transition: all 0.3s ease;
}
.link-item:hover {
border-color: #667eea;
background-color: #f8f9ff;
transform: translateX(5px);
}
.link-icon {
font-size: 2em;
margin-right: 15px;
width: 50px;
text-align: center;
}
.link-content h3 {
margin-bottom: 5px;
color: #333;
}
.link-content p {
color: #666;
font-size: 0.9em;
}
.footer {
text-align: center;
color: white;
margin-top: 30px;
opacity: 0.8;
}
.loading {
text-align: center;
color: #666;
font-style: italic;
}
@media (max-width: 768px) {
.charts-section { grid-template-columns: 1fr; }
.header h1 { font-size: 2em; }
.stat-number { font-size: 2em; }
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🧪 DC-TOM 测试报告仪表盘</h1>
<p>dctomproject | 本地开发环境 | <span id="current-time"></span></p>
</div>
<div class="stats-grid" id="stats-grid">
<div class="stat-card">
<div class="stat-number stat-info" id="total-tests">加载中...</div>
<div class="stat-label">测试用例总数</div>
<div class="stat-change" id="total-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-success" id="passed-tests">加载中...</div>
<div class="stat-label">通过测试</div>
<div class="stat-change" id="passed-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-danger" id="failed-tests">加载中...</div>
<div class="stat-label">失败测试</div>
<div class="stat-change" id="failed-change"></div>
</div>
<div class="stat-card">
<div class="stat-number stat-warning" id="success-rate">加载中...</div>
<div class="stat-label">成功率</div>
<div class="stat-change" id="rate-change"></div>
</div>
</div>
<div class="charts-section">
<div class="chart-container">
<div class="chart-title">测试结果分布</div>
<div id="pieChart"></div>
</div>
<div class="chart-container">
<div class="chart-title">执行时间信息</div>
<div id="timing-info" class="loading">加载中...</div>
</div>
</div>
<div class="links-section">
<div class="links-title">📁 报告和资源</div>
<div class="links-grid">
<a href="reports/merged-report.html" class="link-item">
<div class="link-icon">📈</div>
<div class="link-content">
<h3>详细测试报告</h3>
<p>查看完整的测试执行结果和失败分析</p>
</div>
</a>
<a href="reports/basic/" class="link-item">
<div class="link-icon">🔧</div>
<div class="link-content">
<h3>基础功能测试</h3>
<p>spec.cy.js 测试文件的执行结果</p>
</div>
</a>
<a href="assets/videos/" class="link-item">
<div class="link-icon">🎥</div>
<div class="link-content">
<h3>测试执行视频</h3>
<p>观看完整的测试执行过程录像</p>
</div>
</a>
<a href="assets/screenshots/" class="link-item">
<div class="link-icon">📸</div>
<div class="link-content">
<h3>失败截图</h3>
<p>查看测试失败时的页面截图</p>
</div>
</a>
</div>
</div>
<div class="footer">
<p>🛠️ 由 DC-TOM 本地 CI 脚本生成 | 更新时间: <span id="generated-time"></span></p>
</div>
</div>
<script>
// 设置当前时间
document.getElementById('current-time').textContent = new Date().toLocaleString('zh-CN');
// 加载统计数据
async function loadStats() {
try {
const response = await fetch('test-stats.json');
const data = await response.json();
// 更新统计卡片
updateStatCards(data);
// 更新图表
updateCharts(data);
// 更新时间信息
updateTimingInfo(data);
// 设置生成时间
document.getElementById('generated-time').textContent = data.generatedAt || '未知';
} catch (error) {
console.error('加载统计数据失败:', error);
showErrorState();
}
}
function updateStatCards(data) {
const summary = data.summary || {};
document.getElementById('total-tests').textContent = summary.totalTests || 0;
document.getElementById('passed-tests').textContent = summary.passes || 0;
document.getElementById('failed-tests').textContent = summary.failures || 0;
document.getElementById('success-rate').textContent = (summary.passPercent || 0) + '%';
// 根据成功率设置颜色
const rate = summary.passPercent || 0;
const rateElement = document.getElementById('success-rate');
if (rate === 100) {
rateElement.className = 'stat-number stat-success';
} else if (rate >= 80) {
rateElement.className = 'stat-number stat-warning';
} else {
rateElement.className = 'stat-number stat-danger';
}
}
function updateCharts(data) {
const summary = data.summary || {};
const total = summary.totalTests || 1;
const passes = summary.passes || 0;
const failures = summary.failures || 0;
const pending = summary.pending || 0;
// 计算百分比
const passPercent = (passes / total) * 100;
const failPercent = (failures / total) * 100;
const pendingPercent = (pending / total) * 100;
// 创建纯 CSS 饼图
const pieChart = document.getElementById('pieChart');
if (pieChart) {
// 创建饼图容器
pieChart.innerHTML = `
<div style="position: relative; width: 200px; height: 200px; margin: 0 auto;">
<div style="
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(
#27ae60 0 ${passPercent}%,
#e74c3c ${passPercent}% ${passPercent + failPercent}%,
#f39c12 ${passPercent + failPercent}% 100%
);
display: flex;
align-items: center;
justify-content: center;
">
<div style="
width: 100px;
height: 100px;
background: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 18px;
">
${total}
</div>
</div>
<div style="margin-top: 15px; text-align: center;">
<div style="margin: 5px 0;">
<span style="display: inline-block; width: 12px; height: 12px; background: #27ae60; margin-right: 8px;"></span>
通过: ${passes} (${passPercent.toFixed(1)}%)
</div>
<div style="margin: 5px 0;">
<span style="display: inline-block; width: 12px; height: 12px; background: #e74c3c; margin-right: 8px;"></span>
失败: ${failures} (${failPercent.toFixed(1)}%)
</div>
${pending > 0 ? `
<div style="margin: 5px 0;">
<span style="display: inline-block; width: 12px; height: 12px; background: #f39c12; margin-right: 8px;"></span>
待处理: ${pending} (${pendingPercent.toFixed(1)}%)
</div>
` : ''}
</div>
</div>
`;
}
}
function updateTimingInfo(data) {
const summary = data.summary || {};
const timing = data.timing || {};
const timingHTML = `
<div style="text-align: left; font-size: 1.1em;">
<p><strong>执行时间:</strong> ${summary.durationFormatted || '未知'}</p>
<p><strong>开始时间:</strong> ${timing.startFormatted || '未知'}</p>
<p><strong>结束时间:</strong> ${timing.endFormatted || '未知'}</p>
<div style="margin-top: 15px; padding: 15px; background: #f8f9fa; border-radius: 8px;">
<strong>执行状态:</strong>
${getExecutionStatus(summary)}
</div>
</div>
`;
document.getElementById('timing-info').innerHTML = timingHTML;
}
function getExecutionStatus(summary) {
const rate = summary.passPercent || 0;
if (rate === 100) {
return '<span style="color: #27ae60;">✅ 所有测试通过</span>';
} else if (rate >= 80) {
return '<span style="color: #f39c12;">⚠️ 大部分测试通过</span>';
} else {
return '<span style="color: #e74c3c;">❌ 需要关注失败测试</span>';
}
}
function showErrorState() {
document.getElementById('total-tests').textContent = '加载失败';
document.getElementById('passed-tests').textContent = '-';
document.getElementById('failed-tests').textContent = '-';
document.getElementById('success-rate').textContent = '-';
document.getElementById('timing-info').innerHTML = '<p style="color: #e74c3c;">无法加载统计数据</p>';
}
// 页面加载完成后加载数据
document.addEventListener('DOMContentLoaded', loadStats);
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment