From ca09f65803c405eabc68348bf46b4916c87f21da Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 26 Sep 2026 13:45:30 +0000 Subject: [PATCH] test(e2e): wait for Progress status before reading cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Void prksNavigate is correct, but progress_ids could accept the departing Progress group's non-loading tile. Commit the hash in navigate, require the requested status title before sampling ids, and drop the fixed 120ms sleep. Co-authored-by: Nikola Perović --- tests/e2e/test_work_metadata_offline.py | 31 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/tests/e2e/test_work_metadata_offline.py b/tests/e2e/test_work_metadata_offline.py index 4c2eccb6..13234fa2 100644 --- a/tests/e2e/test_work_metadata_offline.py +++ b/tests/e2e/test_work_metadata_offline.py @@ -433,12 +433,28 @@ def navigate(self, page, route): Never return prksNavigate's Promise from page.evaluate — Playwright awaits it, and a stuck leave/render wedges until the 300s watchdog. Exit metadata edit first so leave is not blocked on an unsaved-draft - confirm the test never clicks. + confirm the test never clicks. Wait for the canonical hash so callers + do not race the departing route's still-visible DOM. """ page.evaluate("""() => { if (typeof prksSetWorkDetailsMode === 'function') void prksSetWorkDetailsMode('view'); }""") page.evaluate("r => { void prksNavigate(r); }", route) + page.wait_for_function("r => location.hash === r", arg=route) + + def wait_progress_ready(self, page, status): + """Progress hash committed and the requested status group rendered.""" + route = '#/progress?status=' + quote(str(status), safe='') + page.wait_for_function( + """(args) => { + if (location.hash !== args.hash) return false; + const main = document.querySelector('.prks-tile--main'); + if (!main || main.querySelector('.prks-route-loading')) return false; + const title = main.querySelector('.prks-page-title'); + return !!title && title.textContent.indexOf(args.status) !== -1; + }""", + arg={'hash': route, 'status': str(status)}, + ) def recently_added(self, page): """Home -> Recently Added, warmed and rendered.""" @@ -884,13 +900,11 @@ def save_status(self, page): def progress_ids(self, page, status): """The Work ids Progress shows for one status group.""" self.navigate(page, '#/progress?status=' + quote(str(status), safe='')) - page.wait_for_function("""() => { - const el = document.querySelector('.prks-tile--main'); - return !!el && !el.querySelector('.prks-route-loading'); - }""") - page.wait_for_timeout(120) + self.wait_progress_ready(page, status) return page.evaluate( - "() => Array.from(document.querySelectorAll('[data-work-id]')).map(el => el.dataset.workId)") + """() => Array.from( + document.querySelectorAll('.prks-tile--main [data-work-id]') + ).map(el => el.dataset.workId)""") def card_badge(self, page, work_id): return page.evaluate("""id => { @@ -1942,8 +1956,7 @@ def test_entering_the_editor_before_hydration_still_shows_pending_values(self): def progress(self, page, status='In Progress'): self.navigate(page, '#/progress?status=' + quote(str(status), safe='')) - page.wait_for_function("() => location.hash.indexOf('/progress') !== -1") - page.wait_for_selector('.card-grid') + self.wait_progress_ready(page, status) def progress_excerpt(self, page, work_id): return page.evaluate("""id => {