diff --git a/search_analyzer.js b/search_analyzer.js index a8a6c0a..ff1946e 100644 --- a/search_analyzer.js +++ b/search_analyzer.js @@ -278,15 +278,64 @@ function processPage() { if (!window.location.href.includes('linkedin.com/search/results/')) return; - // Robustly find any
  • that contains a link to a LinkedIn profile - const allLis = Array.from(document.querySelectorAll('li')); - const cards = allLis.filter(li => li.querySelector('a[href*="/in/"]')); + console.log('[LJA] Attempting to find profile cards...'); + let cards = []; - console.log('[LJA] processPage found cards:', cards.length); + // Method 1: Try common structural wrappers for search results + let listItems = Array.from(document.querySelectorAll('ul > li')); + let validListItems = listItems.filter(li => li.innerText.length > 20 && li.querySelector('img')); + if (validListItems.length > 0) { + cards = validListItems; + console.log('[LJA] Found cards via ul > li with images:', cards.length); + } + + // Method 2: Try finding elements containing headlines + if (cards.length === 0) { + let subtitles = document.querySelectorAll('.entity-result__primary-subtitle, [class*="subtitle"], .linked-area'); + let validSubtitles = Array.from(subtitles).filter(s => s.innerText.trim().length > 5); + if (validSubtitles.length > 0) { + let uniqueCards = new Set(); + validSubtitles.forEach(s => { + let container = s.closest('li') || s.closest('div[data-chameleon-result-urn]') || s.parentElement.parentElement.parentElement; + if (container) uniqueCards.add(container); + }); + cards = Array.from(uniqueCards); + console.log('[LJA] Found cards via subtitles:', cards.length); + } + } + + // Method 3: Deep heuristic using profile links + if (cards.length === 0) { + let profileLinks = Array.from(document.querySelectorAll('a[href*="/in/"]')).filter(a => a.innerText.trim().length > 3 && !a.querySelector('img')); + console.log('[LJA] Profile links found:', profileLinks.length); + + let uniqueCards = new Set(); + profileLinks.forEach(link => { + let container = link.parentElement; + let bestContainer = null; + // Go up to 8 levels looking for a substantial block + for(let i = 0; i < 8; i++) { + if (!container) break; + // A good card container has significant text and usually buttons + if (container.innerText.length > 50 && container.querySelectorAll('button').length > 0) { + bestContainer = container; + } + container = container.parentElement; + } + if (bestContainer) uniqueCards.add(bestContainer); + }); + cards = Array.from(uniqueCards); + console.log('[LJA] Found cards via link heuristics:', cards.length); + } + + // Deduplicate cards just in case + cards = Array.from(new Set(cards)); if (cards.length > 0) { injectScanAllButton(); cards.forEach(injectScanButton); + } else { + console.log('[LJA] No cards could be identified on this page.'); } }