feat: add auth flow to headfulDirect variant - click Sign-in, run AuthProcedure

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ValueOn AG 2026-02-16 23:15:25 +01:00
parent 2bb0dd20cc
commit 4c3a80dcfd

View file

@ -162,6 +162,10 @@ async function _runVariant(
}
});
// Auth state
let authAttempted = false;
let authSuccess: boolean | null = null;
if (variant.id === 'headfulDirect') {
// Variant 6: Navigate directly to /v2/ URL, bypassing launcher.html entirely
const directUrl = _buildDirectV2Url(meetingUrl);
@ -172,15 +176,39 @@ async function _runVariant(
timeout: 30000,
});
// Wait and log where Teams actually redirects to
await page.waitForTimeout(8000);
// Wait for initial page load
await page.waitForTimeout(5000);
const currentUrl = page.url();
_log('info', `After redirect: ${currentUrl.substring(0, 120)}`);
_log('info', `After initial load: ${currentUrl.substring(0, 120)}`);
if (currentUrl.includes('light-meetings')) {
_log('warn', 'Teams redirected /v2/ to light-meetings');
} else if (currentUrl.includes('/v2/')) {
_log('info', '/v2/ page loaded successfully!');
_log('info', '/v2/ page loaded — checking for Sign-in link');
// If we have credentials, attempt auth on the /v2/ page
if (botAccountEmail && botAccountPassword) {
authAttempted = true;
_log('info', `Attempting auth as ${botAccountEmail}`);
// Look for Sign-in link on the /v2/ pre-join page
const signInClicked = await _clickSignInLink(page, _log);
if (signInClicked) {
// Use AuthProcedure for the hybrid flow (inline modal → MS login → password)
authSuccess = await _attemptAuth(page, botAccountEmail, botAccountPassword);
_log(authSuccess ? 'info' : 'warn', `Auth result: ${authSuccess ? 'success' : 'failed'}`);
// Wait for page to settle after auth
await page.waitForTimeout(5000);
_log('info', `After auth, URL: ${page.url().substring(0, 120)}`);
} else {
_log('warn', 'No Sign-in link found on /v2/ page');
authSuccess = false;
}
} else {
_log('info', 'No credentials provided — skipping auth');
}
}
} else {
// Standard flow: resolve URL, navigate, click launcher
@ -197,16 +225,6 @@ async function _runVariant(
await page.waitForTimeout(5000);
}
// If this is the auth variant, attempt login
let authAttempted = false;
let authSuccess: boolean | null = null;
if (variant.id === 'headfulAuth' && botAccountEmail && botAccountPassword) {
authAttempted = true;
_log('info', `Attempting auth as ${botAccountEmail}`);
authSuccess = await _attemptAuth(page, botAccountEmail, botAccountPassword);
_log(authSuccess ? 'info' : 'warn', `Auth result: ${authSuccess ? 'success' : 'failed'}`);
}
// Detect page type and gather signals
const detection = await _detectPageType(page);
@ -662,6 +680,46 @@ async function _handleLauncher(page: Page): Promise<void> {
logger.info('[AuthTest] No launcher dialog found — may already be on pre-join page');
}
// ============================================================================
// SIGN-IN LINK CLICK
// ============================================================================
/**
* Click the "Sign in" link on the /v2/ pre-join page to initiate auth flow.
* Returns true if clicked successfully, false if not found.
*/
async function _clickSignInLink(
page: Page,
_log: (level: 'info' | 'warn' | 'error', msg: string) => void
): Promise<boolean> {
const signInSelectors = [
'button[data-tid="auth-sign-in-link"]',
'a[data-tid="auth-sign-in-link"]',
'button:has-text("Sign in")',
'a:has-text("Sign in")',
'button:has-text("Anmelden")',
'a:has-text("Anmelden")',
];
for (const selector of signInSelectors) {
try {
const element = await page.waitForSelector(selector, { timeout: 5000, state: 'visible' });
if (element) {
await element.click();
_log('info', `Clicked Sign-in link: ${selector}`);
// Wait for the inline modal or redirect to appear
await page.waitForTimeout(3000);
return true;
}
} catch {
// Continue to next selector
}
}
_log('warn', 'No Sign-in link found with any selector');
return false;
}
// ============================================================================
// PAGE TYPE DETECTION
// ============================================================================