mirror of
https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
synced 2026-01-10 01:06:17 +00:00
feature: Improved element management and diagnostics during navigation to the homepage
This commit is contained in:
@@ -88,18 +88,44 @@ export default class BrowserFunc {
|
|||||||
this.bot.log(this.bot.isMobile, 'GO-HOME', `Page took ${readyResult.timeMs}ms to be ready (slow)`, 'warn')
|
this.bot.log(this.bot.isMobile, 'GO-HOME', `Page took ${readyResult.timeMs}ms to be ready (slow)`, 'warn')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IMPROVED: Wait for Custom Elements to be registered
|
||||||
|
try {
|
||||||
|
await page.evaluate(() => customElements.whenDefined('mee-card-group'), { timeout: 5000 })
|
||||||
|
} catch (error) {
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME', 'mee-card-group custom element not registered within 5s', 'warn')
|
||||||
|
}
|
||||||
|
|
||||||
for (let iteration = 1; iteration <= RETRY_LIMITS.GO_HOME_MAX; iteration++) {
|
for (let iteration = 1; iteration <= RETRY_LIMITS.GO_HOME_MAX; iteration++) {
|
||||||
await this.bot.utils.wait(500)
|
await this.bot.utils.wait(500)
|
||||||
await this.bot.browser.utils.tryDismissAllMessages(page)
|
await this.bot.browser.utils.tryDismissAllMessages(page)
|
||||||
|
|
||||||
// IMPROVED: Smart element waiting instead of fixed timeout
|
// IMPROVED: Try primary selector first with increased timeouts
|
||||||
const activitiesResult = await waitForElementSmart(page, SELECTORS.MORE_ACTIVITIES, {
|
let activitiesResult = await waitForElementSmart(page, SELECTORS.MORE_ACTIVITIES, {
|
||||||
initialTimeoutMs: 1000,
|
initialTimeoutMs: 3000, // FIXED: Increased from 1000ms to 3000ms
|
||||||
extendedTimeoutMs: 2000,
|
extendedTimeoutMs: 7000, // FIXED: Increased from 2000ms to 7000ms
|
||||||
state: 'attached',
|
state: 'attached',
|
||||||
logFn: (msg) => this.bot.log(this.bot.isMobile, 'GO-HOME', msg, 'log')
|
logFn: (msg) => this.bot.log(this.bot.isMobile, 'GO-HOME', msg, 'log')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// IMPROVED: Try fallback selectors if primary fails
|
||||||
|
if (!activitiesResult.found) {
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME', 'Primary selector failed, trying fallbacks...', 'log')
|
||||||
|
|
||||||
|
for (const fallbackSelector of SELECTORS.MORE_ACTIVITIES_FALLBACKS) {
|
||||||
|
activitiesResult = await waitForElementSmart(page, fallbackSelector, {
|
||||||
|
initialTimeoutMs: 2000,
|
||||||
|
extendedTimeoutMs: 3000,
|
||||||
|
state: 'attached',
|
||||||
|
logFn: (msg) => this.bot.log(this.bot.isMobile, 'GO-HOME', msg, 'log')
|
||||||
|
})
|
||||||
|
|
||||||
|
if (activitiesResult.found) {
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME', `Found activities using fallback: ${fallbackSelector}`, 'log')
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (activitiesResult.found) {
|
if (activitiesResult.found) {
|
||||||
this.bot.log(this.bot.isMobile, 'GO-HOME', 'Visited homepage successfully')
|
this.bot.log(this.bot.isMobile, 'GO-HOME', 'Visited homepage successfully')
|
||||||
break
|
break
|
||||||
@@ -111,6 +137,55 @@ export default class BrowserFunc {
|
|||||||
throw new Error('Account has been suspended!')
|
throw new Error('Account has been suspended!')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IMPROVED: Diagnostic logging to identify DOM structure changes
|
||||||
|
if (iteration <= 2) {
|
||||||
|
try {
|
||||||
|
const diagnosticInfo = await page.evaluate(() => {
|
||||||
|
const elementsWithActivitiesId = document.querySelectorAll('[id*="activit"]')
|
||||||
|
const meeCardGroups = document.querySelectorAll('mee-card-group')
|
||||||
|
const hasRoleList = document.querySelectorAll('[role="list"]')
|
||||||
|
|
||||||
|
return {
|
||||||
|
activitiesIdCount: elementsWithActivitiesId.length,
|
||||||
|
activitiesIds: Array.from(elementsWithActivitiesId).map(el => el.id).slice(0, 5),
|
||||||
|
meeCardGroupCount: meeCardGroups.length,
|
||||||
|
roleListCount: hasRoleList.length,
|
||||||
|
pageTitle: document.title,
|
||||||
|
bodyClasses: document.body.className
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME-DEBUG',
|
||||||
|
`DOM Diagnostic - Elements with 'activit': ${diagnosticInfo.activitiesIdCount}, ` +
|
||||||
|
`IDs: [${diagnosticInfo.activitiesIds.join(', ')}], ` +
|
||||||
|
`mee-card-group: ${diagnosticInfo.meeCardGroupCount}, ` +
|
||||||
|
`role=list: ${diagnosticInfo.roleListCount}`, 'warn')
|
||||||
|
} catch (error) {
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME-DEBUG', `Diagnostic failed: ${error}`, 'warn')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IMPROVED: Capture screenshot on final iteration for debugging
|
||||||
|
if (iteration === RETRY_LIMITS.GO_HOME_MAX) {
|
||||||
|
try {
|
||||||
|
const fs = await import('fs')
|
||||||
|
const path = await import('path')
|
||||||
|
const debugDir = path.join(process.cwd(), 'debug-screenshots')
|
||||||
|
|
||||||
|
if (!fs.existsSync(debugDir)) {
|
||||||
|
fs.mkdirSync(debugDir, { recursive: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-')
|
||||||
|
const screenshotPath = path.join(debugDir, `goHome-${this.bot.currentAccountEmail}-${timestamp}.png`)
|
||||||
|
await page.screenshot({ path: screenshotPath, fullPage: true })
|
||||||
|
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME', `Debug screenshot saved: ${screenshotPath}`, 'warn')
|
||||||
|
} catch (error) {
|
||||||
|
this.bot.log(this.bot.isMobile, 'GO-HOME', `Screenshot capture failed: ${error}`, 'warn')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Not suspended, just activities not loaded yet - continue to next iteration
|
// Not suspended, just activities not loaded yet - continue to next iteration
|
||||||
this.bot.log(this.bot.isMobile, 'GO-HOME', `Activities not found yet (iteration ${iteration}/${RETRY_LIMITS.GO_HOME_MAX}), retrying...`, 'warn')
|
this.bot.log(this.bot.isMobile, 'GO-HOME', `Activities not found yet (iteration ${iteration}/${RETRY_LIMITS.GO_HOME_MAX}), retrying...`, 'warn')
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,15 @@ export const SELECTORS = {
|
|||||||
// FIXED: Use more specific selector to avoid strict mode violation (2 elements with id='more-activities')
|
// FIXED: Use more specific selector to avoid strict mode violation (2 elements with id='more-activities')
|
||||||
// Target the mee-card-group element specifically, not the div wrapper
|
// Target the mee-card-group element specifically, not the div wrapper
|
||||||
MORE_ACTIVITIES: 'mee-card-group#more-activities[role="list"]',
|
MORE_ACTIVITIES: 'mee-card-group#more-activities[role="list"]',
|
||||||
|
// IMPROVED: Fallback selectors for MORE_ACTIVITIES in case Microsoft changes structure
|
||||||
|
MORE_ACTIVITIES_FALLBACKS: [
|
||||||
|
'#more-activities', // ID only (most permissive)
|
||||||
|
'mee-card-group#more-activities', // Without role attribute
|
||||||
|
'[id="more-activities"]', // Attribute selector
|
||||||
|
'mee-card-group[role="list"]', // Element type with role
|
||||||
|
'.daily-sets', // Class-based fallback
|
||||||
|
'main[data-bi-name="dashboard"]' // Dashboard root element
|
||||||
|
],
|
||||||
SUSPENDED_ACCOUNT: '#suspendedAccountHeader',
|
SUSPENDED_ACCOUNT: '#suspendedAccountHeader',
|
||||||
QUIZ_COMPLETE: '#quizCompleteContainer',
|
QUIZ_COMPLETE: '#quizCompleteContainer',
|
||||||
QUIZ_CREDITS: 'span.rqMCredits'
|
QUIZ_CREDITS: 'span.rqMCredits'
|
||||||
|
|||||||
Reference in New Issue
Block a user