accounts/integration-test/superadmin-login/ui-test.sh

102 lines
2.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$ROOT_DIR"
if [ -f .env ]; then
set -a
# shellcheck disable=SC1091
source .env
set +a
echo "✅ 已读取 .env"
fi
if ! command -v node >/dev/null; then
echo "❌ 未找到 node请先安装" >&2
exit 1
fi
if ! command -v npx >/dev/null; then
echo "❌ 未找到 npx请先安装" >&2
exit 1
fi
UI_BASE_URL="${UI_BASE_URL:-${BASE_URL:-https://console.svc.plus}}"
LOGIN_EMAIL="${LOGIN_EMAIL:-admin@svc.plus}"
LOGIN_PASSWORD="${SUPERADMIN_PASSWORD:-}"
if [ -z "$LOGIN_PASSWORD" ]; then
echo "❌ 缺少 SUPERADMIN_PASSWORD可写入 .env" >&2
exit 1
fi
TMP_DIR="${TMPDIR:-/tmp}"
PLAYWRIGHT_TEST_DIR="${TMP_DIR}/xcontrol-playwright-login"
mkdir -p "$PLAYWRIGHT_TEST_DIR"
cat <<'TEST' > "$PLAYWRIGHT_TEST_DIR/login.spec.mjs"
import { test, expect } from '@playwright/test';
test.use({ screenshot: 'only-on-failure' });
test('superadmin login', async ({ page }) => {
const baseUrl = process.env.UI_BASE_URL || process.env.BASE_URL || 'https://console.svc.plus';
const email = process.env.LOGIN_EMAIL || 'admin@svc.plus';
const password = process.env.SUPERADMIN_PASSWORD;
if (!password) {
throw new Error('missing SUPERADMIN_PASSWORD');
}
await page.goto(`${baseUrl}/login`, { waitUntil: 'domcontentloaded' });
const emailByRole = page.getByRole('textbox', { name: /email|邮箱|账号|用户名|identifier/i });
const emailBySelector = page.locator(
'input[type="email"], input[name="email"], input[name="identifier"], input[placeholder*="邮箱"], input[placeholder*="Email"], input[type="text"]'
);
const emailInput = (await emailByRole.count()) > 0 ? emailByRole.first() : emailBySelector.first();
await expect(emailInput).toBeVisible({ timeout: 15000 });
await emailInput.fill(email);
const passwordInput = page.locator(
'input[type="password"], input[name="password"], input[placeholder*="密码"], input[placeholder*="Password"]'
);
await expect(passwordInput).toBeVisible({ timeout: 15000 });
await passwordInput.fill(password);
const submitBtn = page.locator(
'button[type="submit"], button:has-text("登录"), button:has-text("Log in"), button:has-text("Sign in")'
);
await expect(submitBtn).toBeVisible({ timeout: 15000 });
await submitBtn.click();
await page.waitForLoadState('networkidle');
await expect(page).not.toHaveURL(/login/);
});
TEST
cd "$PLAYWRIGHT_TEST_DIR"
if [ ! -f package.json ]; then
cat <<'PKG' > package.json
{
"name": "xcontrol-playwright-login",
"private": true,
"version": "0.0.0",
"type": "module",
"devDependencies": {
"@playwright/test": "^1.49.0"
}
}
PKG
fi
npm install --silent
npx playwright install chromium
UI_BASE_URL="$UI_BASE_URL" BASE_URL="$UI_BASE_URL" LOGIN_EMAIL="$LOGIN_EMAIL" SUPERADMIN_PASSWORD="$LOGIN_PASSWORD" \
npx playwright test login.spec.mjs
echo "✅ UI 登录测试通过"