From 8ff99c0e9d4404042f58e37ddc0264ab47c37814 Mon Sep 17 00:00:00 2001 From: mardausdennis <71312763+mardausdennis@users.noreply.github.com> Date: Sun, 30 Aug 2026 18:14:19 +0200 Subject: [PATCH] cover the rewards urls the daily set actually uses Matching on bing.com/search alone was too narrow. Turn referrals into rewards is a real daily set activity that awards points and it points at a rewards url, so the filter skipped it and the run came up short without saying why. Three shapes now count, bing.com/search, bing.com/rewards and rewards.bing.com. The bing app promo from #45 sits on bingapp.microsoft.com and stays out of all three, which is what keeps that fix intact. Five tests, one per shape plus a mixed panel. --- src/element_selectors.py | 26 +++++++++++++--- tests/test_element_selectors.py | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/element_selectors.py b/src/element_selectors.py index 24d3381..0108590 100644 --- a/src/element_selectors.py +++ b/src/element_selectors.py @@ -182,21 +182,39 @@ class ElementSelectionUtils: Handing one of those back gets it clicked, which navigates away from rewards.bing.com, and every element captured beforehand then goes stale. - Activities always point at a Bing search, so match on that rather than on - position. If nothing matches, return nothing: clicking a promo is worse - than skipping the task, and the caller already reports the shortfall. + Matching on a Bing search alone was too narrow. "Turn referrals into + rewards" is a real daily set activity that awards points, and it points + at a rewards URL rather than a search. Three shapes have been observed: + + 1. `bing.com/search?q=...`, the classic search activity, + 2. `bing.com/rewards/...`, seen on daily sets alongside the searches, + 3. `rewards.bing.com/...`, the same activity written against the + rewards host. + + The Bing app promo behind #45 is on `bingapp.microsoft.com`, so it stays + out of all three, and so does anything else off those hosts. If nothing + matches, return nothing: clicking a promo is worse than skipping the + task, and the caller already reports the shortfall. """ activities = [] for link in self.get_sidebar_section().find_elements(By.TAG_NAME, "a"): try: - if "bing.com/search" in (link.get_dom_attribute("href") or ""): + if self._is_daily_set_activity(link.get_dom_attribute("href") or ""): activities.append(link) except StaleElementReferenceException: continue return activities + @staticmethod + def _is_daily_set_activity(href: str) -> bool: + """Whether an href in the daily set panel is an activity rather than a promo.""" + return any( + marker in href + for marker in ("bing.com/search", "bing.com/rewards", "rewards.bing.com/") + ) + # ------------------------------------------------------------------ # explore on bing (absent in en-US, present in some other markets) # ------------------------------------------------------------------ diff --git a/tests/test_element_selectors.py b/tests/test_element_selectors.py index 5e5b8a3..3db8431 100644 --- a/tests/test_element_selectors.py +++ b/tests/test_element_selectors.py @@ -190,5 +190,59 @@ class DailySetOpener(unittest.TestCase): selectors_for(driver).get_open_daily_set_button() +class DailySetActivityUrls(unittest.TestCase): + """Which hrefs in the panel count as activities and which are promos.""" + + def _links(self, *hrefs): + links = [FakeElement(text="activity", attributes={"href": h}) for h in hrefs] + panel = FakeElement( + attributes={"id": "react-aria-42"}, + children={(By.TAG_NAME, "a"): links}, + ) + + return FakeDriver(children={(By.TAG_NAME, "section"): [panel]}) + + def test_matches_a_plain_search_activity(self): + found = selectors_for( + self._links("https://www.bing.com/search?q=weather") + ).get_daily_set_elements() + + self.assertEqual(len(found), 1) + + def test_matches_a_rewards_path_activity(self): + # "Turn referrals into rewards" awards points and is not a search. + found = selectors_for( + self._links("https://www.bing.com/rewards/panelflyout") + ).get_daily_set_elements() + + self.assertEqual(len(found), 1) + + def test_matches_an_activity_on_the_rewards_host(self): + found = selectors_for( + self._links("https://rewards.bing.com/redeem/12345") + ).get_daily_set_elements() + + self.assertEqual(len(found), 1) + + def test_skips_the_bing_app_promo(self): + # The link behind #45. Clicking it leaves the rewards host and every + # element captured beforehand goes stale. + found = selectors_for( + self._links("https://bingapp.microsoft.com/bing?adjust=14u4j3kz") + ).get_daily_set_elements() + + self.assertEqual(found, []) + + def test_keeps_activities_and_drops_promos_from_the_same_panel(self): + found = selectors_for(self._links( + "https://bingapp.microsoft.com/bing?adjust=14u4j3kz", + "https://www.bing.com/search?q=news", + "https://www.bing.com/rewards/panelflyout", + "https://play.google.com/store/apps/details?id=com.microsoft.bing", + )).get_daily_set_elements() + + self.assertEqual(len(found), 2) + + if __name__ == "__main__": unittest.main()