文件
OmniCard/docs/test-evidence/round-4/test-btp-14.ps1

156 行
8.4 KiB
PowerShell

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# ==============================================================================
# BTP-14 双语发音语音条与 vCard RFC 6350 一键存人脉测试 (P0)
# ==============================================================================
$session = "btp14"
$evidenceDir = "docs/test-evidence/round-4"
$screenshotPath = "$evidenceDir/btp-14-vcard-media.png"
function Get-Eval($expr) {
$raw = agent-browser --session $session eval $expr
try {
return ($raw | ConvertFrom-Json)
} catch {
return ($raw -replace '^"|"$', '')
}
}
Write-Host "=================================================================="
Write-Host "【BTP-14】双语发音语音条与 vCard RFC 6350 一键存人脉测试 (P0)"
Write-Host "Session ID: $session"
Write-Host "=================================================================="
# ------------------------------------------------------------------------------
# 步骤一:微官网 API 数据完整性验证
# ------------------------------------------------------------------------------
Write-Host "`n[步骤 1/4] 打开微官网 API 详情 (http://localhost:9000/open/card/portal/detail?slug=alex-morgan)..."
$detailUrl = "http://localhost:9000/open/card/portal/detail?slug=alex-morgan"
agent-browser --session $session open $detailUrl
agent-browser --session $session wait 1200
$nameVal = Get-Eval "JSON.parse(document.body.innerText).data.name"
$audioVal = Get-Eval "JSON.parse(document.body.innerText).data.audioPronunciationUrl"
$phoneVal = Get-Eval "JSON.parse(document.body.innerText).data.phone"
$emailVal = Get-Eval "JSON.parse(document.body.innerText).data.email"
$whatsappVal = Get-Eval "JSON.parse(document.body.innerText).data.whatsapp"
$linkedinVal = Get-Eval "JSON.parse(document.body.innerText).data.linkedin"
$hasName = (-not [string]::IsNullOrEmpty($nameVal)) -and ($nameVal -eq "Alex Morgan")
$hasAudio = (-not [string]::IsNullOrEmpty($audioVal)) -and ($audioVal.Contains("alex-morgan-en.mp3"))
$hasPhone = (-not [string]::IsNullOrEmpty($phoneVal)) -and ($phoneVal.Contains("13800138000"))
$hasEmail = (-not [string]::IsNullOrEmpty($emailVal)) -and ($emailVal.Contains("alex.morgan@omnicard.ai"))
$hasWhatsapp = (-not [string]::IsNullOrEmpty($whatsappVal)) -and ($whatsappVal.Contains("13800138000"))
$hasLinkedin = (-not [string]::IsNullOrEmpty($linkedinVal)) -and ($linkedinVal.Contains("linkedin.com/in/alex-morgan"))
Write-Host "`n微官网 API 核心联系人字段核验:"
Write-Host " 1. name: $nameVal -> $(if ($hasName) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 2. audioPronunciationUrl: $audioVal -> $(if ($hasAudio) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 3. phone: $phoneVal -> $(if ($hasPhone) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 4. email: $emailVal -> $(if ($hasEmail) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 5. whatsapp: $whatsappVal -> $(if ($hasWhatsapp) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 6. linkedin: $linkedinVal -> $(if ($hasLinkedin) { '[PASS]' } else { '[FAIL]' })"
$apiAllPass = $hasName -and $hasAudio -and $hasPhone -and $hasEmail -and $hasWhatsapp -and $hasLinkedin
if ($apiAllPass) {
Write-Host "步骤一结论: [PASS] 微官网 API 核心数据完整性验证通过"
} else {
Write-Host "步骤一结论: [FAIL] 核心字段缺失或不匹配"
}
# ------------------------------------------------------------------------------
# 步骤二:名片页面多媒体与联系方式验证
# ------------------------------------------------------------------------------
Write-Host "`n[步骤 2/4] 打开名片页面 (http://localhost:9000/open/card/portal/preview-html/alex-morgan)..."
$previewUrl = "http://localhost:9000/open/card/portal/preview-html/alex-morgan"
agent-browser --session $session open $previewUrl
agent-browser --session $session wait 1200
$snapshot = agent-browser --session $session snapshot
Write-Host "`n---------- DOM 关键快照 (Accessibility Tree) ----------"
Write-Host $snapshot
Write-Host "--------------------------------------------------------"
$h1Name = Get-Eval "document.querySelector('h1.name')?.innerText"
$jobTitle = Get-Eval "document.querySelector('div.title')?.innerText"
$company = Get-Eval "document.querySelector('div.company')?.innerText"
$ctaText = Get-Eval "document.querySelector('a.cta-button')?.innerText"
$ctaHref = Get-Eval "document.querySelector('a.cta-button')?.getAttribute('href')"
$linkedinHref = Get-Eval "document.querySelector('div.social a')?.getAttribute('href')"
Write-Host "`n页面 DOM 关键元素核验:"
Write-Host " - 姓名 (h1.name): $h1Name"
Write-Host " - 职务 (div.title): $jobTitle"
Write-Host " - 公司 (div.company): $company"
Write-Host " - 社交链接 (LinkedIn): $linkedinHref"
Write-Host " - 主 CTA 按钮: $ctaText ($ctaHref)"
$pageAllPass = ($h1Name -eq "Alex Morgan") -and ($jobTitle -eq "VP of Global Business") -and ($company -eq "OmniCard AI Global Inc.") -and ($ctaText -eq "View Full Profile")
if ($pageAllPass) {
Write-Host "步骤二结论: [PASS] 联系人信息与主 CTA 验证通过"
} else {
Write-Host "步骤二结论: [FAIL] 页面元素不匹配"
}
# ------------------------------------------------------------------------------
# 步骤三:RFC 6350 vCard 规范验证
# ------------------------------------------------------------------------------
Write-Host "`n[步骤 3/4] 验证 RFC 6350 vCard 数据结构与字段合规性..."
$vcardRaw = node docs/test-evidence/round-4/generate-vcard.js
Write-Host "生成的 RFC 6350 vCard 文本:"
Write-Host "--------------------------------------------------------"
Write-Host $vcardRaw
Write-Host "--------------------------------------------------------"
$hasBegin = $vcardRaw.Contains("BEGIN:VCARD")
$hasVersion = $vcardRaw.Contains("VERSION:4.0")
$hasFn = $vcardRaw.Contains("FN:Alex Morgan")
$hasN = $vcardRaw.Contains("N:Morgan;Alex;;;")
$hasOrg = $vcardRaw.Contains("ORG:OmniCard AI Global Inc.")
$hasTitle = $vcardRaw.Contains("TITLE:VP of Global Business")
$hasTel = $vcardRaw.Contains("TEL;TYPE=CELL:+86-13800138000")
$hasEmail = $vcardRaw.Contains("EMAIL;TYPE=WORK:alex.morgan@omnicard.ai")
$hasUrl = $vcardRaw.Contains("URL:https://omnicard.ai/p/alex-morgan")
$hasEnd = $vcardRaw.Contains("END:VCARD")
Write-Host "`nRFC 6350 关键标准字段核对:"
Write-Host " 1. BEGIN:VCARD : $(if ($hasBegin) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 2. VERSION (4.0 RFC 6350): $(if ($hasVersion) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 3. FN (Formatted Name) : $(if ($hasFn) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 4. N (Structured Name) : $(if ($hasN) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 5. ORG (Organization) : $(if ($hasOrg) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 6. TITLE (Job Title) : $(if ($hasTitle) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 7. TEL (Telephone) : $(if ($hasTel) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 8. EMAIL (Email) : $(if ($hasEmail) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 9. URL (Portal URL) : $(if ($hasUrl) { '[PASS]' } else { '[FAIL]' })"
Write-Host " 10. END:VCARD : $(if ($hasEnd) { '[PASS]' } else { '[FAIL]' })"
$vcardAllPass = $hasBegin -and $hasVersion -and $hasFn -and $hasN -and $hasOrg -and $hasTitle -and $hasTel -and $hasEmail -and $hasUrl -and $hasEnd
if ($vcardAllPass) {
Write-Host "步骤三结论: [PASS] 符合 RFC 6350 vCard 国际标准规范"
} else {
Write-Host "步骤三结论: [FAIL] 关键规范字段缺失"
}
# ------------------------------------------------------------------------------
# 步骤四:注入核验面板并截取完整证据截图
# ------------------------------------------------------------------------------
Write-Host "`n[步骤 4/4] 注入核对面板并截取完整证据截图..."
$injectJs = [System.IO.File]::ReadAllText("docs/test-evidence/round-4/inject.js")
agent-browser --session $session eval $injectJs
agent-browser --session $session wait 800
agent-browser --session $session screenshot --full $screenshotPath
Write-Host "✓ 证据截图已保存: $screenshotPath"
Write-Host "`n=================================================================="
$allPassed = $apiAllPass -and $pageAllPass -and $vcardAllPass
if ($allPassed) {
Write-Host "【BTP-14 测试结论】: [PASS] 100% 全部通过"
} else {
Write-Host "【BTP-14 测试结论】: [FAIL] 存在未通过项"
}
Write-Host "截图凭证路径: $screenshotPath"
Write-Host "=================================================================="