Verbessere CAPTCHA-Handling im Login-Prozess: Füge detaillierte Protokollierung des CAPTCHA-Status hinzu und verbessere die Handhabung des CAPTCHA-Widgets.
All checks were successful
Code Analysis and Production Deploy / analyze (push) Successful in 4m38s
Code Analysis and Production Deploy / deploy-production (push) Has been skipped
Code Analysis and Production Deploy / deploy-test (push) Successful in 2m42s

This commit is contained in:
Torsten Schulz (local)
2026-09-04 16:07:18 +02:00
parent 02c1765214
commit 9a4eb77c56

View File

@@ -34,7 +34,10 @@ async function loginDirect(email, password) {
}
async function loginWithBrowser(email, password) {
const browser = await chromium.launch({ headless: true, args: ['--disable-dev-shm-usage'] })
const browser = await chromium.launch({
headless: true,
args: ['--no-sandbox', '--disable-dev-shm-usage']
})
try {
const page = await browser.newPage()
// Das myTT-CAPTCHA wird erst nach dem Laden der Seite erzeugt. Der Ablauf
@@ -60,10 +63,19 @@ async function loginWithBrowser(email, password) {
await page.locator('input[name="email"]').fill(email)
await page.locator('input[name="password"]').fill(password)
// Exakt wie in trainingstagebuch: Das Widget wird nach dem DOM-Load
// nachgeladen; ein sofortiges count() würde es häufig übersehen.
await page.waitForSelector('private-captcha', { timeout: 8_000 }).catch(() => {})
const captchaHost = page.locator('private-captcha').first()
const hasCaptcha = await captchaHost.count() > 0
console.info('[mytischtennis] CAPTCHA widget detected:', hasCaptcha)
if (hasCaptcha) {
await page.waitForTimeout(1_200)
// Ein echter Playwright-Klick erzeugt im Gegensatz zu element.click() ein
// vertrauenswürdiges Pointer-Ereignis für das Widget.
await captchaHost.click({ timeout: 5_000, force: true }).catch(error => {
console.warn('[mytischtennis] CAPTCHA pointer click failed:', error.message)
})
await page.evaluate(() => {
const host = document.querySelector('private-captcha')
const checkbox = host?.shadowRoot?.querySelector('#pc-checkbox')
@@ -77,7 +89,21 @@ async function loginWithBrowser(email, password) {
const clicked = document.querySelector('input[name="captcha_clicked"]')?.value?.toLowerCase() || ''
return token.length > 80 && (clicked === 'true' || clicked === '1')
}, { timeout: 32_000 }).catch(() => {})
const captchaReady = await page.evaluate(() => (document.querySelector('input[name="captcha"]')?.value?.trim().length || 0) > 80)
const captchaState = await page.evaluate(() => {
const host = document.querySelector('private-captcha')
const checkbox = host?.shadowRoot?.querySelector('#pc-checkbox')
const token = document.querySelector('input[name="captcha"]')?.value?.trim() || ''
return {
tokenLength: token.length,
clicked: document.querySelector('input[name="captcha_clicked"]')?.value || null,
shadowRoot: Boolean(host?.shadowRoot),
checkboxFound: Boolean(checkbox),
checkboxChecked: Boolean(checkbox?.checked),
widgetState: host?.getAttribute('data-state') || null
}
})
console.info('[mytischtennis] CAPTCHA state after wait:', captchaState)
const captchaReady = captchaState.tokenLength > 80
if (!captchaReady) throw new Error('CAPTCHA konnte nicht automatisch gelöst werden.')
await page.waitForTimeout(2_500)
}