diff --git a/src/teampulse/resolver.py b/src/teampulse/resolver.py index 63c86ec..ea85d77 100644 --- a/src/teampulse/resolver.py +++ b/src/teampulse/resolver.py @@ -45,31 +45,30 @@ class Resolver: encoding="utf-8", ) - def _find_and_click_sender(self, display_name: str) -> bool: - """Find the sender in the visible chat and click to open their profile card.""" + def _hover_sender(self, display_name: str) -> bool: + """Find the sender's avatar in the visible chat and hover to open the profile card.""" - # Strategy 1: find reply-message-header containing the name, click its avatar + # Strategy 1: reply-message-header (channel meetings) — hover the avatar for header in self._page.query_selector_all("[data-tid='reply-message-header']"): try: - name_spans = header.query_selector_all("span") - for span in name_spans: + for span in header.query_selector_all("span"): if span.inner_text().strip() == display_name: avatar = header.query_selector( "[data-tid='reply-message-header-avatar']" ) target = avatar or span target.scroll_into_view_if_needed() - target.click() + target.hover() return True except Exception: continue - # Strategy 2: message-author-name (private meeting chat) + # Strategy 2: message-author-name (private meeting chat) — hover the element for el in self._page.query_selector_all("[data-tid='message-author-name']"): try: if el.inner_text().strip() == display_name: el.scroll_into_view_if_needed() - el.click() + el.hover() return True except Exception: continue @@ -78,21 +77,21 @@ class Resolver: def _extract_email_from_profile(self, display_name: str) -> str | None: try: - clicked = self._find_and_click_sender(display_name) + hovered = self._hover_sender(display_name) except Exception as e: - print(f" Klick auf '{display_name}' fehlgeschlagen: {e}") + print(f" Hover auf '{display_name}' fehlgeschlagen: {e}") return None - if not clicked: + if not hovered: print(f" '{display_name}' nicht im sichtbaren Chat gefunden.") return None try: - # Wait for profile card container + # Wait for hover card container self._page.wait_for_selector(".lpc_ip_root_class", timeout=5000) except Exception: - print(f" Profilkarte für '{display_name}' öffnet sich nicht.") - self._page.keyboard.press("Escape") + print(f" Hover-Card für '{display_name}' erscheint nicht.") + self._page.mouse.move(0, 0) return None try: @@ -116,11 +115,12 @@ class Resolver: card_text = card.inner_text().strip()[:200] if card else "(leer)" print(f" Karte geöffnet, E-Mail nicht gefunden. Inhalt: {card_text!r}") - self._page.keyboard.press("Escape") + # Dismiss by moving mouse away + self._page.mouse.move(0, 0) time.sleep(0.5) return email except Exception as e: - print(f" Fehler beim Lesen der Profilkarte: {e}") - self._page.keyboard.press("Escape") + print(f" Fehler beim Lesen der Hover-Card: {e}") + self._page.mouse.move(0, 0) return None