From 9283a3e9806f7f8c92640ab4458e41e1bcae17aa Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Wed, 5 Aug 2026 22:41:42 -0400 Subject: [PATCH] Paging clicks only visible controls: First/Prev are mobile-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Munchkin Big Box and Tang Garden hung 30s each on a "First Page" anchor that exists but is invisible: BGG renders every paging control twice, and the First/Prev pair lives only in the mobile set (
  • ). A desktop viewport can never click it. Paging now selects the first VISIBLE match, and returning to page 1 closes and reopens the sub-view (which always opens on page 1) instead of reaching for a control that isn't there. A test proves no hidden control is ever clicked — the fake picker raises if one is. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g --- data/upload_log.csv | 3 +++ docs/bgg-upload-flow.md | 15 ++++++++++----- src/bggpipe/upload.py | 38 ++++++++++++++++++++++++-------------- tests/test_upload.py | 40 ++++++++++++++++++++++++++++++++++------ 4 files changed, 71 insertions(+), 25 deletions(-) diff --git a/data/upload_log.csv b/data/upload_log.csv index 820e676..b642e2e 100644 --- a/data/upload_log.csv +++ b/data/upload_log.csv @@ -7,3 +7,6 @@ add,31260,,Agricola,297589,,added,2026-08-06T02:24:28+00:00, add,181304,,Mysterium,536289,,added_no_version,2026-08-06T02:24:34+00:00,version 'English edition 2018-2' not in picker; added without version add,312786,,Poetry for Neanderthals,514050,,added_no_version,2026-08-06T02:24:40+00:00,version 'English edition 2020' not in picker; added without version add,273240,,The Red Dragon Inn Smorgasbox,446069,,added,2026-08-06T02:24:46+00:00, +add,419687,,Munchkin Big Box,711400,,failed,2026-08-06T02:38:12+00:00,"TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role(""dialog"").locator(""ul.pagination a[title=\""First Page\""]"").first - locator resolved to ⇆⇆⇆⇆First ⇆⇆⇆ - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms" +add,252153,,Tang Garden,404702,,failed,2026-08-06T02:38:48+00:00,"TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role(""dialog"").locator(""ul.pagination a[title=\""First Page\""]"").first - locator resolved to ⇆⇆⇆⇆First ⇆⇆⇆ - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms" +add,255984,,Sleeping Gods,701034,,failed,2026-08-06T02:39:23+00:00,"TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role(""dialog"").locator(""ul.pagination a[title=\""First Page\""]"").first - locator resolved to ⇆⇆⇆⇆First ⇆⇆⇆ - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms" diff --git a/docs/bgg-upload-flow.md b/docs/bgg-upload-flow.md index 2f7b4dd..35a4ac5 100644 --- a/docs/bgg-upload-flow.md +++ b/docs/bgg-upload-flow.md @@ -121,11 +121,16 @@ earlier walkthrough had marked *verified*, and the parts marked `li:has(.summary-item-thumbnail)`. Plain `listitem` also catches the paging `
  • `s ("First", "Prev", "1", "…"). - **Paging is an AngularJS `