BRANCHES

Branches and PRs

Convenience view. Source of truth is vault/agents/gx_branches/MY_BRANCHES.md — a separate branch-management agent owns it, tracks CI, opens PRs, and undrafts. Update that file first; this one mirrors it.

PRs

All merged. Every Playwright PR opened for this project has landed; the selenium_only backlog is down from 140 decorators to 8.

PRBranchHeadState
#23566playwright_rendering_rules_workflow_14287ccb92a9merged 2026-09-17
#23567playwright_column_definition_send_enter2675c865001merged 2026-09-17
#23568test_tool_conf_randomlines_symlink18f5bfb276cmerged 2026-09-17
#23589playwright_gesture_vocabulary_portbe218a455e3merged 2026-09-18
#23592playwright_unlock_invocation_grid_sample_sheetf2edee8c72emerged 2026-09-20
#23574playwright_neutral_key_press29018d7cd8amerged 2026-09-21
#23598playwright_unlock_histories_list0ba200bd303merged 2026-09-21
#23601playwright_unlock_tool_form0739e737fe7merged 2026-09-21
#23602playwright_unlock_uploads4d2fc929406merged 2026-09-21
#23603playwright_unlock_workflow_management66aa76fc613merged 2026-09-21
#23607playwright_unlock_workflow_run7da479e62f4merged 2026-09-21
#23611playwright_collection_builders5b93f94c5admerged 2026-09-22
#23621playwright_history_panel_collectionse2640d8e00emerged 2026-09-22
#23622playwright_history_paneld2cbb2493bcmerged 2026-09-22
#23623playwright_admin_app93fd626eacamerged 2026-09-22
#23624playwright_histories_published30598f1b3demerged 2026-09-22
#23644playwright_integration_selenium45a66ad6427merged 2026-09-23 — also carried hover_away()
#23706playwright_unlock_dataset2cb6655e8c8merged
#23707playwright_drag_and_drop_tests9db5deacaf6merged 2026-09-25
#23758playwright_rule_builder_group_count91761b4e563merged 2026-09-29
#23757playwright_history_sharing_login_redirect069624b8811merged 2026-09-29
#23756playwright_visualizations_igv2342c313524merged 2026-09-29
#23751command_palette_selenium_testsba4e8bc47e3merged 2026-09-29
#23737playwright_unlock_custom_tools5df55e741bamerged 2026-09-29

Pushed, no PR

All three rebased onto dev 914d816195b 2026-09-29 and force-pushed to the fork.

BranchHeadNotes
playwright_collection_edit_dbkey56701cb49fdDrops both decorators from test_collection_edit.py plus the now-unused import. Both quoted the same reason - .collection-edit-change-datatype-nav never becoming clickable - and that tab is v-if="isConfigLoaded && config.enable_celery_tasks". lib/galaxy_test/base/api.py turns celery on for framework-launched Galaxy; an ad hoc run.sh server leaves it off, so the tab never renders and both backends time out identically. Not a Playwright gap. No source change needed: 3/3 each under Playwright against a celery-enabled server, both pass under Selenium. Rebase was clean, diff unchanged at 1 file / 7-.
playwright_stock_tours_deferredba9fde03cc1Drops the bare selenium_only from test_core_deferred plus the now-unused import. The recorded failure (tour step 18 not finding the cat1 tool link) no longer reproduces. No source change needed: passes 3/3 under Playwright unchanged. Rebase was clean, diff unchanged at 1 file / 4-.
playwright_change_password0a573c64ffbUnlocks the last test_change_password.py decorator. The reason on it (Page.goto: net::ERR_ABORTED) was a real driver gap: FormGeneric.vue assigns window.location once its POST lands, which cancels the home() navigation the test had already started. navigate_to now retries once on ERR_ABORTED only - a server-side redirect never raises, so the retry cannot fight one - and the test waits for the success message instead of racing its own request. Selenium has the same gap and cannot be fixed the same way (its get() reports nothing, and a stranded navigation is indistinguishable from a redirect), so TestNavigateTo uses a Playwright-only fixture. The 2026-09-29 rebase conflicted: dev has since added its own push-state-later fixture button and TestCurrentUrl class at exactly the two spots this branch adds navigate-away-later and TestNavigateTo. Both sides are additive and both were kept, but keeping both broke the push-state-later listener chain (lost its }); and document) and left TestNavigateTo with no blank lines before it - repaired and folded into the original commit. The PR description predates this and needs a pass. Verified after: prettier + black clean, TestCurrentUrl green on all three backends alongside the new TestNavigateTo, test/unit/selenium/ 498 passed / 1 skipped / 3 failed (the known local TestConfiguredDriverSelenium failures, which reproduce on clean dev).

Dropped

BranchWhy
playwright_hover_away (750f9c33f15)Already on dev. Rebasing it onto dev 914d816195b produced an empty branch - git skipped its only commit as previously applied. The content landed as c9d4e97f9fb, carried in by #23644. The fork ref and the prepared PR description are both stale; nothing to open.
playwright_navigate_to_selenium (ea73914180e)Recommended for dropping in MY_BRANCHES.md and now doubly stale - stacked on the pre-rebase playwright_change_password, which has been force-pushed twice since. It works (the contract test passes on all three backends, test/unit/selenium/ goes 495 -> 497 with no slowdown) but instrumentation showed the retry fires zero times across all of test_change_password.py, while costing an execute_script on every Selenium navigation plus a known false positive. Revisit only if a Selenium test is ever caught passing from the wrong page.

The parity stack

Three branches off dev 914d816195b, stacked in this order, each with its own red-to-green unit test in test/unit/selenium/test_has_driver.py. At the top of the stack test/unit/selenium/ gives 512 passed, 1 skipped, 3 failed - the 3 being the known local TestConfiguredDriverSelenium failures that reproduce on clean dev. mypy galaxy/selenium/ is clean.

BranchHeadNotes
playwright_window_abstraction99c53caa29fAdds visit_new_window() to the protocol, proxy and both impls, and runs test_workflow_management::test_view under Playwright - the last decorator needing new infrastructure. A context manager because that is the whole intent: look at the tab the page just opened, then close it and go back. It waits, so it can be called after the click that opens it. Playwright surfaces the tab as another Page on the same BrowserContext; expect_page() would have to be armed before the click, so the context is polled instead - through wait_for_timeout, since context.pages only grows while the sync driver is pumped and a plain sleep polls a frozen list.
playwright_text_table_parity2f4cf64a23ainnerText separates the cells of a row with a tab; Selenium’s rendered text gives each cell its own line. test_import_dataset_from_path reads a label/value table by splitting rows on newlines, so under Playwright every key came back as 'Name\t' - the recorded KeyError: 'Name', blamed on CI and left for investigation since 2017. PlaywrightElement.text now asks the browser whether the element is a table box, and only when a tab turned up at all, so a tab inside a pre stays put. 6/6 for the file under Playwright; the unblocked test passes under Selenium too.
playwright_scoped_css_parity7de48facebePlaywright matches a scoped selector relative to the element, so .stateless-tags button wanted a .stateless-tags inside the cell; the DOM matches against the document and keeps descendants, which is why Selenium finds a button in a cell that is itself the .stateless-tags. The decorator recorded this as the tag editor never rendering under Playwright - it renders, the selector just missed it. CSS locators now go through the browser’s querySelectorAll; xpath and the text engines are Playwright’s own and keep using it. 14/14 for test_histories_list.py under Playwright including test_tags.

Remaining selenium_only decorators

4 left in the tree, all covered by branches above except one. What is unclaimed on dev 914d816195b:

TestBlocker
test_history_pages::test_drag_drop_visual_feedbackasserts page-dragover-success mid-drag via action_chains(). Needs the held drag from GESTURE_ABSTRACTION_DESIGN.md’s remaining-work table - the only decorator left that needs new gesture vocabulary.

Landing the stack plus that one held-drag gesture finishes the goal in PROBLEMS_AND_GOALS.md, and closes the last of the three prerequisites the gesture design defers step 6 (deleting action_chains() from the protocol and proxy) behind.