"""DOM discovery for Teams Web — meeting chat and channel posts. Usage: .venv/bin/python scripts/discover_dom.py """ from pathlib import Path from playwright.sync_api import sync_playwright SESSION_DIR = str(Path.home() / ".teampulse" / "session") def main(): with sync_playwright() as p: browser = p.chromium.launch_persistent_context( SESSION_DIR, headless=False, args=["--no-sandbox"], ) page = browser.pages[0] if browser.pages else browser.new_page() page.goto("https://teams.microsoft.com") print("Navigiere im Browser zum Channel/Chat mit sichtbaren Nachrichten, dann Enter...") input() results = page.evaluate("""() => { const out = {}; // 1. All unique data-tid values on the page const tids = new Set(); document.querySelectorAll('[data-tid]').forEach(el => tids.add(el.getAttribute('data-tid'))); out.allDataTids = [...tids].sort(); // 2. Try common message selectors const msgSelectors = [ "[data-tid='chat-pane-message']", "[data-tid='channel-message-content']", "[data-tid='message-body']", "[data-tid='messageBody']", "[class*='fui-ChatMessage']:not([class*='Control'])", "[class*='message-body']", "[class*='messageBody']", "[class*='chatMessage']", "[class*='ChatMessage']", ]; out.msgSelectorHits = {}; msgSelectors.forEach(sel => { try { out.msgSelectorHits[sel] = document.querySelectorAll(sel).length; } catch(e) {} }); // 3. Find elements whose text contains known message content const knownTexts = ['Oliver Hofmann', '!stop', 'test', '!start']; out.knownTextMatches = []; document.querySelectorAll('*').forEach(el => { if (el.children.length > 0) return; const t = el.textContent.trim(); if (knownTexts.some(kt => t === kt || t.startsWith(kt))) { let p = el; const ancestors = []; for (let i = 0; i < 5 && p; i++) { ancestors.push({ tag: p.tagName, dataTid: p.getAttribute('data-tid'), cls: (p.className || '').substring(0, 80) }); p = p.parentElement; } out.knownTextMatches.push({ text: t.substring(0, 40), ancestors }); } }); out.knownTextMatches = out.knownTextMatches.slice(0, 10); return out; }""") print("\n--- Alle data-tid Werte auf der Seite ---") print(", ".join(results["allDataTids"])) print("\n--- Nachrichten-Selektoren ---") for sel, count in results["msgSelectorHits"].items(): if count > 0: print(f" ✓ {sel}: {count} Treffer") else: print(f" {sel}: 0") print("\n--- Elemente mit bekanntem Text ---") for match in results["knownTextMatches"]: print(f"\n Text: \"{match['text']}\"") for anc in match["ancestors"]: print(f" {anc['tag']} data-tid='{anc['dataTid']}' class='{anc['cls'][:60]}'") print("\nEnter zum Schließen...") input() browser.close() if __name__ == "__main__": main()