# Instructions

- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.

# Test info

- Name: tests/ui/sitemap.spec.ts >> sitemap URL validation >> districts sitemap - sample URLs resolve
- Location: tests/ui/sitemap.spec.ts:305:7

# Error details

```
Error: Errors: Expected 200 for /districts/vi-00/, got 404

expect(received).toHaveLength(expected)

Expected length: 0
Received length: 1
Received array:  ["Expected 200 for /districts/vi-00/, got 404"]
```

# Page snapshot

```yaml
- generic [active] [ref=f5e1]:
  - banner [ref=f5e2]:
    - heading "California Congressional District 23" [level=1] [ref=f5e3]
    - paragraph [ref=f5e4]: Congressional District Profile
  - generic [ref=f5e5]:
    - generic [ref=f5e6]:
      - generic [ref=f5e7]: Not signed in
      - generic [ref=f5e9]:
        - link "Log in" [ref=f5e10] [cursor=pointer]:
          - /url: /outpost.goauthentik.io/start?rd=http%3A%2F%2Fpreview-us-elect-info.electinfo.svc.cluster.local%2Fdistricts%2Fca-23%2F
        - link "Create an account" [ref=f5e11] [cursor=pointer]:
          - /url: /signin/register?rd=http%3A%2F%2Fpreview-us-elect-info.electinfo.svc.cluster.local%2Fdistricts%2Fca-23%2F
    - toolbar "Member tools" [ref=f5e12]:
      - button "All cycles (Sign in to use the cycle facet)" [disabled] [ref=f5e13] [cursor=pointer]:
        - generic [ref=f5e17]: All cycles
      - button "Graph (Sign in to use Graph)" [disabled] [ref=f5e20] [cursor=pointer]:
        - generic [ref=f5e29]: Graph
  - generic [ref=f5e32]:
    - heading "Overview" [level=2] [ref=f5e33]
    - generic [ref=f5e34]:
      - term [ref=f5e35]: District ID
      - definition [ref=f5e36]: CA-23
      - term [ref=f5e37]: State
      - definition [ref=f5e38]:
        - link "California" [ref=f5e39] [cursor=pointer]:
          - /url: https://preview.elect.info/states/california/
      - term [ref=f5e40]: District Number
      - definition [ref=f5e41]: "23"
      - term [ref=f5e42]: Total Candidates
      - definition [ref=f5e43]: "94"
      - term [ref=f5e44]: Election Cycles
      - definition [ref=f5e45]:
        - generic [ref=f5e46]:
          - link "2026" [ref=f5e47] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2026/
          - text: ","
          - link "2024" [ref=f5e48] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2024/
          - text: ","
          - link "2022" [ref=f5e49] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2022/
          - text: ","
          - link "2020" [ref=f5e50] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2020/
          - text: ","
          - link "2018" [ref=f5e51] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2018/
          - text: ","
          - link "2016" [ref=f5e52] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2016/
          - text: ","
          - link "2014" [ref=f5e53] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2014/
          - text: ","
          - link "2012" [ref=f5e54] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2012/
          - text: ","
          - link "2010" [ref=f5e55] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2010/
          - text: ","
          - link "2008" [ref=f5e56] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2008/
          - text: ","
          - link "2006" [ref=f5e57] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2006/
          - text: ","
          - link "2004" [ref=f5e58] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2004/
          - text: ","
          - link "2002" [ref=f5e59] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2002/
          - text: ","
          - link "2000" [ref=f5e60] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/2000/
          - text: ","
          - link "1998" [ref=f5e61] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1998/
          - text: ","
          - link "1996" [ref=f5e62] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1996/
          - text: ","
          - link "1994" [ref=f5e63] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1994/
          - text: ","
          - link "1992" [ref=f5e64] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1992/
          - text: ","
          - link "1990" [ref=f5e65] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1990/
          - text: ","
          - link "1988" [ref=f5e66] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1988/
          - text: ","
          - link "1986" [ref=f5e67] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1986/
          - text: ","
          - link "1984" [ref=f5e68] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1984/
          - text: ","
          - link "1982" [ref=f5e69] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1982/
          - text: ","
          - link "1980" [ref=f5e70] [cursor=pointer]:
            - /url: https://preview.elect.info/elections/1980/
    - paragraph [ref=f5e71]:
      - link "View office details for U.S. Representative - California District 23" [ref=f5e72] [cursor=pointer]:
        - /url: https://preview.elect.info/offices/house/ca-23/
  - generic [ref=f5e73]:
    - heading "Demographics" [level=2] [ref=f5e74]
    - generic [ref=f5e75]:
      - term [ref=f5e76]: Total Citizen Population
      - definition [ref=f5e77]: 713,934
      - term [ref=f5e78]: Citizen Voting Age Population (CVAP)
      - definition [ref=f5e79]: 512,155
    - heading "Citizen Population by Race/Ethnicity" [level=3] [ref=f5e80]
    - table [ref=f5e81]:
      - rowgroup [ref=f5e82]:
        - row [ref=f5e83]:
          - columnheader "Group" [ref=f5e84]
          - columnheader "Citizens" [ref=f5e85]
          - columnheader "Share" [ref=f5e86]
      - rowgroup [ref=f5e87]:
        - row [ref=f5e88]:
          - cell "Non-Hispanic" [ref=f5e89]
          - cell "411,888" [ref=f5e90]
          - cell "57.7%" [ref=f5e91]
        - row [ref=f5e92]:
          - cell "Hispanic" [ref=f5e93]
          - cell "302,045" [ref=f5e94]
          - cell "42.3%" [ref=f5e95]
        - row [ref=f5e96]:
          - cell "White" [ref=f5e97]
          - cell "287,060" [ref=f5e98]
          - cell "40.2%" [ref=f5e99]
        - row [ref=f5e100]:
          - cell "Black" [ref=f5e101]
          - cell "60,607" [ref=f5e102]
          - cell "8.5%" [ref=f5e103]
        - row [ref=f5e104]:
          - cell "Asian" [ref=f5e105]
          - cell "26,444" [ref=f5e106]
          - cell "3.7%" [ref=f5e107]
        - row [ref=f5e108]:
          - cell "American Indian / Alaska Native" [ref=f5e109]
          - cell "2,826" [ref=f5e110]
          - cell "0.4%" [ref=f5e111]
        - row [ref=f5e112]:
          - cell "Native Hawaiian / Pacific Islander" [ref=f5e113]
          - cell "2,482" [ref=f5e114]
          - cell "0.3%" [ref=f5e115]
        - row [ref=f5e116]:
          - cell "Two or More Races" [ref=f5e117]
          - cell "6,072" [ref=f5e118]
          - cell "0.9%" [ref=f5e119]
    - heading "Citizen Voting Age Population by Race/Ethnicity" [level=3] [ref=f5e120]
    - table [ref=f5e121]:
      - rowgroup [ref=f5e122]:
        - row [ref=f5e123]:
          - columnheader "Group" [ref=f5e124]
          - columnheader "CVAP" [ref=f5e125]
          - columnheader "Share" [ref=f5e126]
      - rowgroup [ref=f5e127]:
        - row [ref=f5e128]:
          - cell "Non-Hispanic" [ref=f5e129]
          - cell "320,763" [ref=f5e130]
          - cell "62.6%" [ref=f5e131]
        - row [ref=f5e132]:
          - cell "Hispanic" [ref=f5e133]
          - cell "191,393" [ref=f5e134]
          - cell "37.4%" [ref=f5e135]
        - row [ref=f5e136]:
          - cell "White" [ref=f5e137]
          - cell "233,884" [ref=f5e138]
          - cell "45.7%" [ref=f5e139]
        - row [ref=f5e140]:
          - cell "Black" [ref=f5e141]
          - cell "49,863" [ref=f5e142]
          - cell "9.7%" [ref=f5e143]
        - row [ref=f5e144]:
          - cell "Asian" [ref=f5e145]
          - cell "24,990" [ref=f5e146]
          - cell "4.9%" [ref=f5e147]
        - row [ref=f5e148]:
          - cell "American Indian / Alaska Native" [ref=f5e149]
          - cell "8,314" [ref=f5e150]
          - cell "1.6%" [ref=f5e151]
        - row [ref=f5e152]:
          - cell "Native Hawaiian / Pacific Islander" [ref=f5e153]
          - cell "1,761" [ref=f5e154]
          - cell "0.3%" [ref=f5e155]
        - row [ref=f5e156]:
          - cell "Two or More Races" [ref=f5e157]
          - cell "3,430" [ref=f5e158]
          - cell "0.7%" [ref=f5e159]
    - paragraph [ref=f5e160]: "Source: Redistricting Data Hub / U.S. Census Bureau CVAP Special Tabulation."
  - generic [ref=f5e161]:
    - heading "Candidates" [level=2] [ref=f5e162]
    - generic [ref=f5e164]:
      - generic [ref=f5e165]:
        - generic [ref=f5e166]:
          - combobox "Search entities" [ref=f5e167]
          - status [ref=f5e168]
        - button "Search" [ref=f5e169] [cursor=pointer]
      - generic [ref=f5e170]:
        - heading "Candidates" [level=3] [ref=f5e172]
        - generic [ref=f5e173]:
          - link "OBERNOLTE, JAY REP | $2,451,875" [ref=f5e174] [cursor=pointer]:
            - /url: /politicians/fe60324c-43cb-e1e0-337e-eb0a6bbe0a2b/
            - generic [ref=f5e175]: OBERNOLTE, JAY
            - generic [ref=f5e176]: REP | $2,451,875
          - link "FERGUSON, ANITA PEREZ DEM | $367,519" [ref=f5e177] [cursor=pointer]:
            - /url: /politicians/6425356f-ba9b-6d5b-2de7-43b401a197ba/
            - generic [ref=f5e178]: FERGUSON, ANITA PEREZ
            - generic [ref=f5e179]: DEM | $367,519
          - link "CASE, MICHAEL W DEM | $149,623" [ref=f5e180] [cursor=pointer]:
            - /url: /politicians/783ad2fe-ed11-d537-5a88-44aee45552f3/
            - generic [ref=f5e181]: CASE, MICHAEL W
            - generic [ref=f5e182]: DEM | $149,623
          - link "ARMOR, DAVID REP | $126,122" [ref=f5e183] [cursor=pointer]:
            - /url: /politicians/e05ec2f1-3c05-74ab-28df-a5d53e213038/
            - generic [ref=f5e184]: ARMOR, DAVID
            - generic [ref=f5e185]: REP | $126,122
          - link "ROGERS, BETH REP | $58,986" [ref=f5e186] [cursor=pointer]:
            - /url: /politicians/fc8f37cd-0097-f10e-c978-438c93e2a741/
            - generic [ref=f5e187]: ROGERS, BETH
            - generic [ref=f5e188]: REP | $58,986
          - link "MARSHALL, DEREK DEM | $58,032" [ref=f5e189] [cursor=pointer]:
            - /url: /politicians/f2b914d4-5e39-e788-f493-0c0edcb52a13/
            - generic [ref=f5e190]: MARSHALL, DEREK
            - generic [ref=f5e191]: DEM | $58,032
          - link "PARRISH, CLAUDE REP | $39,474" [ref=f5e192] [cursor=pointer]:
            - /url: /politicians/9003fb45-6dd6-8a88-f60c-88103653e4a8/
            - generic [ref=f5e193]: PARRISH, CLAUDE
            - generic [ref=f5e194]: REP | $39,474
          - link "WOOLVERTON, GEORGE REP | $29,668" [ref=f5e195] [cursor=pointer]:
            - /url: /politicians/77997b15-5603-71b1-3739-c416c558a096/
            - generic [ref=f5e196]: WOOLVERTON, GEORGE
            - generic [ref=f5e197]: REP | $29,668
          - link "MANGONE, KIM DEM | $29,541" [ref=f5e198] [cursor=pointer]:
            - /url: /politicians/7f97174f-4b8b-0c0e-8eef-fc20902dc086/
            - generic [ref=f5e199]: MANGONE, KIM
            - generic [ref=f5e200]: DEM | $29,541
          - link "DAVIDSON, JOHN REP | $25,299" [ref=f5e201] [cursor=pointer]:
            - /url: /politicians/46edebdf-311a-7ca8-c9d0-debd15548898/
            - generic [ref=f5e202]: DAVIDSON, JOHN
            - generic [ref=f5e203]: REP | $25,299
          - link "MATTA, TATIANA DEM | $20,800" [ref=f5e204] [cursor=pointer]:
            - /url: /politicians/010d5a1d-f5cf-40e0-b922-844b65749e57/
            - generic [ref=f5e205]: MATTA, TATIANA
            - generic [ref=f5e206]: DEM | $20,800
          - link "REED, WENDY DEM | $12,347" [ref=f5e207] [cursor=pointer]:
            - /url: /politicians/997e64d9-9582-fcfb-60b4-bbeae41dc34f/
            - generic [ref=f5e208]: REED, WENDY
            - generic [ref=f5e209]: DEM | $12,347
          - link "GARCIA, RAUL DEM | $10,500" [ref=f5e210] [cursor=pointer]:
            - /url: /politicians/77dae8f2-52cc-e6cc-dc4d-31bbfd7aa2d5/
            - generic [ref=f5e211]: GARCIA, RAUL
            - generic [ref=f5e212]: DEM | $10,500
          - link "MARMILLION, VAL DEM | $9,588" [ref=f5e213] [cursor=pointer]:
            - /url: /politicians/4ee9361b-0c60-0d14-c8fc-893ec341d952/
            - generic [ref=f5e214]: MARMILLION, VAL
            - generic [ref=f5e215]: DEM | $9,588
          - link "READY, KEVIN EARL DEM | $9,228" [ref=f5e216] [cursor=pointer]:
            - /url: /politicians/4860663e-5f2d-eb3e-411f-b85c79b8a393/
            - generic [ref=f5e217]: READY, KEVIN EARL
            - generic [ref=f5e218]: DEM | $9,228
          - link "WATSON, THOMAS C REP | $7,700" [ref=f5e219] [cursor=pointer]:
            - /url: /politicians/228057bd-48ea-db3c-0931-bffcfe676a16/
            - generic [ref=f5e220]: WATSON, THOMAS C
            - generic [ref=f5e221]: REP | $7,700
          - link "REGAN, DONALD E REP | $5,547" [ref=f5e222] [cursor=pointer]:
            - /url: /politicians/8ccda760-6519-8396-ebbb-d300cb19b9e6/
            - generic [ref=f5e223]: REGAN, DONALD E
            - generic [ref=f5e224]: REP | $5,547
          - link "MATTHEWS, KAREN IND | $5,050" [ref=f5e225] [cursor=pointer]:
            - /url: /politicians/36fc8c9b-ae45-ff25-09b5-d66e2e21d7c6/
            - generic [ref=f5e226]: MATTHEWS, KAREN
            - generic [ref=f5e227]: IND | $5,050
          - link "WINCKLER, ROBERT MITCHELL PATRICK REP | $4,832" [ref=f5e228] [cursor=pointer]:
            - /url: /politicians/0760129d-392b-c71d-e290-644ca0a752d6/
            - generic [ref=f5e229]: WINCKLER, ROBERT MITCHELL PATRICK
            - generic [ref=f5e230]: REP | $4,832
          - link "GONZALEZ, DANIEL RICARDO DEM | $4,536" [ref=f5e231] [cursor=pointer]:
            - /url: /politicians/e4246b42-f46a-51ef-5e8f-4f1e3045ee05/
            - generic [ref=f5e232]: GONZALEZ, DANIEL RICARDO
            - generic [ref=f5e233]: DEM | $4,536
          - link "KOKKONEN, MATT REP | $4,000" [ref=f5e234] [cursor=pointer]:
            - /url: /politicians/6ff057c6-fa33-67e7-b5ae-ed16958b991e/
            - generic [ref=f5e235]: KOKKONEN, MATT
            - generic [ref=f5e236]: REP | $4,000
          - link "SHAKMAN, ROBERT ALLAN REP | $3,750" [ref=f5e237] [cursor=pointer]:
            - /url: /politicians/ac5fc203-6001-8f59-f114-697fd2b568e5/
            - generic [ref=f5e238]: SHAKMAN, ROBERT ALLAN
            - generic [ref=f5e239]: REP | $3,750
          - link "UNRUHE, ROBERT R DEM | $2,521" [ref=f5e240] [cursor=pointer]:
            - /url: /politicians/4b7ef00f-5894-43ad-1ed5-701817e64a71/
            - generic [ref=f5e241]: UNRUHE, ROBERT R
            - generic [ref=f5e242]: DEM | $2,521
          - link "AMATO, BRUNO DEM | $2,025" [ref=f5e243] [cursor=pointer]:
            - /url: /politicians/7b67f42f-64e1-f6fc-2681-531b97d9310f/
            - generic [ref=f5e244]: AMATO, BRUNO
            - generic [ref=f5e245]: DEM | $2,025
          - link "GREENE, JEFFREY BENNETT REP | $1,000" [ref=f5e246] [cursor=pointer]:
            - /url: /politicians/6c707478-9a3e-e4ac-8b84-af6cef684e03/
            - generic [ref=f5e247]: GREENE, JEFFREY BENNETT
            - generic [ref=f5e248]: REP | $1,000
          - link "CHAKALIAN, PAUL DEM | $500" [ref=f5e249] [cursor=pointer]:
            - /url: /politicians/650c8213-649b-bfdc-8c81-d339aa6cbf15/
            - generic [ref=f5e250]: CHAKALIAN, PAUL
            - generic [ref=f5e251]: DEM | $500
          - link "SWEENEY, KEVIN J DEM | $500" [ref=f5e252] [cursor=pointer]:
            - /url: /politicians/881c180c-f8f0-cfed-8659-4d52f1d0e78c/
            - generic [ref=f5e253]: SWEENEY, KEVIN J
            - generic [ref=f5e254]: DEM | $500
          - link "PHILLIPS, TERRY IND | $500" [ref=f5e255] [cursor=pointer]:
            - /url: /politicians/f3cd3733-91b4-a512-a577-ccbeeb3403ae/
            - generic [ref=f5e256]: PHILLIPS, TERRY
            - generic [ref=f5e257]: IND | $500
          - link "BARBARA, JOSEPH (JOE) REP | $300" [ref=f5e258] [cursor=pointer]:
            - /url: /politicians/703b5dff-8296-16df-8c7b-d6712992991e/
            - generic [ref=f5e259]: BARBARA, JOSEPH (JOE)
            - generic [ref=f5e260]: REP | $300
          - link "MAZZI, FRANK REP | $250" [ref=f5e261] [cursor=pointer]:
            - /url: /politicians/ca9ca4ab-e567-fd22-c0b8-be8f4556c3ec/
            - generic [ref=f5e262]: MAZZI, FRANK
            - generic [ref=f5e263]: REP | $250
          - link "HODGE, TESSA LYNN DEM | $250" [ref=f5e264] [cursor=pointer]:
            - /url: /politicians/ad47a02d-6b07-6d53-f9f8-cc7453fed175/
            - generic [ref=f5e265]: HODGE, TESSA LYNN
            - generic [ref=f5e266]: DEM | $250
          - link "RHODES, TAYLOR LIB" [ref=f5e267] [cursor=pointer]:
            - /url: /politicians/48c585cc-4f81-29fe-f8b7-2b45c3c958ce/
            - generic [ref=f5e268]: RHODES, TAYLOR
            - generic [ref=f5e269]: LIB
          - link "SANDOVAL, JESUS R DEM" [ref=f5e270] [cursor=pointer]:
            - /url: /politicians/3e72f589-2541-2a73-eb7e-75596aed7b62/
            - generic [ref=f5e271]: SANDOVAL, JESUS R
            - generic [ref=f5e272]: DEM
          - link "HILL, JAMES E LIB" [ref=f5e273] [cursor=pointer]:
            - /url: /politicians/3a69bee4-5f7c-6e87-d5b0-5f4a2451ff1a/
            - generic [ref=f5e274]: HILL, JAMES E
            - generic [ref=f5e275]: LIB
          - link "ANDERSON, EILEEN DEM" [ref=f5e276] [cursor=pointer]:
            - /url: /politicians/37dbbfc5-2c7b-503e-1cbb-0551310b2c62/
            - generic [ref=f5e277]: ANDERSON, EILEEN
            - generic [ref=f5e278]: DEM
          - link "DASTIG, WANDA DEM" [ref=f5e279] [cursor=pointer]:
            - /url: /politicians/3efed8bf-b122-8d28-d464-ed8eca16176f/
            - generic [ref=f5e280]: DASTIG, WANDA
            - generic [ref=f5e281]: DEM
          - link "LIEB, JEFFREY P. LIB" [ref=f5e282] [cursor=pointer]:
            - /url: /politicians/7ebf0b8d-b55d-300b-481f-6961fc989b9d/
            - generic [ref=f5e283]: LIEB, JEFFREY P.
            - generic [ref=f5e284]: LIB
          - link "ARCEO, MIGUEL ANGEL DEM" [ref=f5e285] [cursor=pointer]:
            - /url: /politicians/e879495a-9b6b-8573-230c-c97937b5282b/
            - generic [ref=f5e286]: ARCEO, MIGUEL ANGEL
            - generic [ref=f5e287]: DEM
          - link "ROSENBERGER, JUSTIN LEE IND" [ref=f5e288] [cursor=pointer]:
            - /url: /politicians/d4a95ab3-9851-b0bc-3ec9-3995972a3732/
            - generic [ref=f5e289]: ROSENBERGER, JUSTIN LEE
            - generic [ref=f5e290]: IND
          - link "FAVORITE, MICHAEL LIB" [ref=f5e291] [cursor=pointer]:
            - /url: /politicians/ab72577d-ae51-bfa3-2d70-747a8ae6c96d/
            - generic [ref=f5e292]: FAVORITE, MICHAEL
            - generic [ref=f5e293]: LIB
          - link "ALONZO, EDWIN DEM" [ref=f5e294] [cursor=pointer]:
            - /url: /politicians/c69ff81d-ead6-1eb2-0437-950febf70796/
            - generic [ref=f5e295]: ALONZO, EDWIN
            - generic [ref=f5e296]: DEM
          - link "WALLIS, CHARLES PATRICK DEM" [ref=f5e297] [cursor=pointer]:
            - /url: /politicians/4cd3ee1c-38da-fc4e-084f-2438fa379974/
            - generic [ref=f5e298]: WALLIS, CHARLES PATRICK
            - generic [ref=f5e299]: DEM
          - link "GARDNER, HARRY ARTHUR JR IND" [ref=f5e300] [cursor=pointer]:
            - /url: /politicians/37772e40-fa6f-15d5-611b-6dea0f708419/
            - generic [ref=f5e301]: GARDNER, HARRY ARTHUR JR
            - generic [ref=f5e302]: IND
          - link "BIGLAY, MIKE REP" [ref=f5e303] [cursor=pointer]:
            - /url: /politicians/334f7275-b0c3-e59a-6360-8152d8d9ffb9/
            - generic [ref=f5e304]: BIGLAY, MIKE
            - generic [ref=f5e305]: REP
          - link "HAGER, JOHN VICTOR IND" [ref=f5e306] [cursor=pointer]:
            - /url: /politicians/2de2e2a7-bf8f-18fa-ff5a-769f89130982/
            - generic [ref=f5e307]: HAGER, JOHN VICTOR
            - generic [ref=f5e308]: IND
          - link "MILLER, CAROLE LEE REP" [ref=f5e309] [cursor=pointer]:
            - /url: /politicians/c87686a2-ab16-b5a2-fa9a-860b4417cea7/
            - generic [ref=f5e310]: MILLER, CAROLE LEE
            - generic [ref=f5e311]: REP
          - link "JACOBSON, ERIC C DEM" [ref=f5e312] [cursor=pointer]:
            - /url: /politicians/045dc2d1-58ca-5895-7c34-16b6391afe70/
            - generic [ref=f5e313]: JACOBSON, ERIC C
            - generic [ref=f5e314]: DEM
          - link "GILL, LOUIS DEM" [ref=f5e315] [cursor=pointer]:
            - /url: /politicians/03c535f3-a947-da90-3812-b326ba412111/
            - generic [ref=f5e316]: GILL, LOUIS
            - generic [ref=f5e317]: DEM
          - link "PORTER, RONALD L NNE" [ref=f5e318] [cursor=pointer]:
            - /url: /politicians/fb8c0d29-87de-fbd6-3cb7-1cbba5eeca6d/
            - generic [ref=f5e319]: PORTER, RONALD L
            - generic [ref=f5e320]: NNE
          - link "JONES, DAVID ALLEN DEM" [ref=f5e321] [cursor=pointer]:
            - /url: /politicians/fab6fff5-8cca-447f-c8ec-9f39eae6cf6b/
            - generic [ref=f5e322]: JONES, DAVID ALLEN
            - generic [ref=f5e323]: DEM
        - generic [ref=f5e324]:
          - generic [ref=f5e325]: Showing 1-50
          - generic [ref=f5e326]:
            - button "First" [disabled] [ref=f5e327]
            - button "Prev" [disabled] [ref=f5e328]
            - button "1" [ref=f5e329] [cursor=pointer]
            - button "Next" [ref=f5e330] [cursor=pointer]
  - contentinfo [ref=f5e331]:
    - paragraph [ref=f5e332]:
      - link "elect.info" [ref=f5e333] [cursor=pointer]:
        - /url: https://preview.elect.info/
      - text: "| Data from"
      - link "Federal Election Commission" [ref=f5e334] [cursor=pointer]:
        - /url: https://preview.elect.info/datasources/fec.gov/
      - text: "| Generated 2026-10-22"
```

# Test source

```ts
  218 |   });
  219 | 
  220 |   test('sitemap index lists no nested index', async ({ request }) => {
  221 |     const index = await (await request.get('/sitemap.xml')).text();
  222 |     const children = parseUrlsFromSitemap(index).map(u => new URL(u).pathname);
  223 |     expect(children.length).toBeGreaterThan(0);
  224 |     const nested: string[] = [];
  225 |     for (const path of children) {
  226 |       // The first bytes say urlset or sitemapindex; the bucket files run to megabytes.
  227 |       const res = await request.get(path, { headers: { Range: 'bytes=0-1023' } });
  228 |       if (res.status() === 404 && !STRICT) continue;
  229 |       expect([200, 206], `${path} should load`).toContain(res.status());
  230 |       if (!(await res.text()).includes('<urlset')) nested.push(path);
  231 |     }
  232 |     expect(nested, 'children of /sitemap.xml that are not urlsets').toEqual([]);
  233 |   });
  234 | 
  235 |   test('candidates sitemap - sample URLs resolve', async ({ page }) => {
  236 |     test.setTimeout(120000);
  237 | 
  238 |     // Navigate to a simple page first so we have a page context for fetch
  239 |     await page.goto('/');
  240 |     const baseUrl = new URL(page.url()).origin;
  241 | 
  242 |     const result = await testSitemapUrls(page, baseUrl, '/candidates/sitemap-candidates.xml');
  243 | 
  244 |     if (result.tested === 0 && !STRICT) {
  245 |       test.skip();
  246 |       return;
  247 |     }
  248 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  249 | 
  250 |     console.log(`Tested ${result.tested} URLs from candidates sitemap`);
  251 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  252 |   });
  253 | 
  254 |   test('committees sitemap - sample URLs resolve', async ({ page }) => {
  255 |     test.setTimeout(120000);
  256 | 
  257 |     // Navigate to a simple page first so we have a page context for fetch
  258 |     await page.goto('/');
  259 |     const baseUrl = new URL(page.url()).origin;
  260 | 
  261 |     const result = await testSitemapUrls(page, baseUrl, '/committees/sitemap-committees.xml');
  262 | 
  263 |     if (result.tested === 0 && !STRICT) {
  264 |       test.skip();
  265 |       return;
  266 |     }
  267 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  268 | 
  269 |     console.log(`Tested ${result.tested} URLs from committees sitemap`);
  270 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  271 |   });
  272 | 
  273 |   test('parties sitemap - sample URLs resolve', async ({ page }) => {
  274 |     await page.goto('/');
  275 |     const baseUrl = new URL(page.url()).origin;
  276 | 
  277 |     const result = await testSitemapUrls(page, baseUrl, '/parties/sitemap-parties.xml');
  278 | 
  279 |     if (result.tested === 0 && !STRICT) {
  280 |       test.skip();
  281 |       return;
  282 |     }
  283 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  284 | 
  285 |     console.log(`Tested ${result.tested} URLs from parties sitemap`);
  286 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  287 |   });
  288 | 
  289 |   test('offices sitemap - sample URLs resolve', async ({ page }) => {
  290 |     await page.goto('/');
  291 |     const baseUrl = new URL(page.url()).origin;
  292 | 
  293 |     const result = await testSitemapUrls(page, baseUrl, '/offices/sitemap-offices.xml');
  294 | 
  295 |     if (result.tested === 0 && !STRICT) {
  296 |       test.skip();
  297 |       return;
  298 |     }
  299 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  300 | 
  301 |     console.log(`Tested ${result.tested} URLs from offices sitemap`);
  302 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  303 |   });
  304 | 
  305 |   test('districts sitemap - sample URLs resolve', async ({ page }) => {
  306 |     await page.goto('/');
  307 |     const baseUrl = new URL(page.url()).origin;
  308 | 
  309 |     const result = await testSitemapUrls(page, baseUrl, '/districts/sitemap-districts.xml');
  310 | 
  311 |     if (result.tested === 0 && !STRICT) {
  312 |       test.skip();
  313 |       return;
  314 |     }
  315 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  316 | 
  317 |     console.log(`Tested ${result.tested} URLs from districts sitemap`);
> 318 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
      |                                                                  ^ Error: Errors: Expected 200 for /districts/vi-00/, got 404
  319 |   });
  320 | 
  321 |   test('states sitemap - sample URLs resolve', async ({ page }) => {
  322 |     await page.goto('/');
  323 |     const baseUrl = new URL(page.url()).origin;
  324 | 
  325 |     const result = await testSitemapUrls(page, baseUrl, '/states/sitemap-states.xml');
  326 | 
  327 |     if (result.tested === 0 && !STRICT) {
  328 |       test.skip();
  329 |       return;
  330 |     }
  331 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  332 | 
  333 |     console.log(`Tested ${result.tested} URLs from states sitemap`);
  334 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  335 |   });
  336 | 
  337 |   test('elections sitemap - sample URLs resolve', async ({ page }) => {
  338 |     await page.goto('/');
  339 |     const baseUrl = new URL(page.url()).origin;
  340 | 
  341 |     const result = await testSitemapUrls(page, baseUrl, '/elections/sitemap-elections.xml');
  342 | 
  343 |     if (result.tested === 0 && !STRICT) {
  344 |       test.skip();
  345 |       return;
  346 |     }
  347 |     expect(result.tested, `sitemap sampled no URLs; errors: ${result.errors.join(', ')}`).toBeGreaterThan(0);
  348 | 
  349 |     console.log(`Tested ${result.tested} URLs from elections sitemap`);
  350 |     expect(result.errors, `Errors: ${result.errors.join(', ')}`).toHaveLength(0);
  351 |   });
  352 | 
  353 | });
  354 | 
```