Commit 00a9fca
authored
test: Deflake adaptive crawler tests against slow browser navigation (#2221)
Two adaptive crawler tests flake on the Windows CI shard for the same
reason. This supersedes #2207, which fixed one of them from a base that
predates #2203.
The browser sub crawler navigates under `PlaywrightCrawler`'s own
`navigation_timeout`, a 60s `SharedTimeout` shared by the
pre/post-navigation hooks and `goto`. That budget is separate from
`request_handler_timeout`, because `BasicCrawler` applies the handler
timeout only around the router call. So a cold Chromium launch on a
saturated runner can blow the navigation budget while the handler
timeout still has minutes left, and relaxing the handler timeout does
nothing about it.
- `test_adaptive_crawling_statistics` fails with `assert 3 == 1`
([example
run](https://github.com/apify/crawlee-python/actions/runs/34120120329/job/101736011265)).
When navigation exceeds the 60s budget, `BasicCrawler` retries the whole
request, which is correct behavior, and every adaptive counter
increments again. The failing run timed out twice before succeeding: 60
+ 60 + 17s matches its 146s crawler runtime. It now passes a 5 minute
`navigation_timeout`, the same ceiling #2203 already gave its handler.
- `test_adaptive_playwright_crawler_timeout_in_sub_crawler` fails with
`Expected 'browser_handler' to be called once. Called 0 times.`
([example
run](https://github.com/apify/crawlee-python/actions/runs/33467016711/job/99728873095)).
It sets `max_request_retries=0`, so one slow navigation fails the only
attempt before the handler ever runs. It now passes a 120s
`navigation_timeout`, matching the handler timeout it already relaxes.
Both keep their existing assertions, so a real double-counting or
missed-increment regression still fails them. Passing the key needs
`navigation_timeout` in `_PlaywrightCrawlerAdditionalOptions`;
`PlaywrightCrawler.__init__` already accepts it and `ty` reports
`invalid-key` without it.
Verified with deterministic fault injection in both cases. For the
statistics test, monkeypatching `Page.goto` to stall the first two
navigations by 70s reproduces the exact `assert 3 == 1` with two retries
under the 60s ceiling, and passes in 71s under the 5 minute one with all
counters at 1; plus 0 failures in 39 runs of that test alone and 31/31
for the whole file serially. For the sub crawler timeout test, a
playwright-only pre-navigation delay of 70s consumes the shared budget
and reproduces the CI failure under the default ceiling, passing under
120s, with 0/96 failures across 8 concurrent Chromium-saturated lanes
afterwards. The adaptive module passes under `-n auto` in 6 of 7 runs;
the exception hit an unrelated `Errno 98` in the uvicorn test server
fixture, caused by running several pytest processes at once locally.
*✍️ Drafted by Claude Code*1 parent 9068dd4 commit 00a9fca
2 files changed
Lines changed: 7 additions & 2 deletions
File tree
- src/crawlee/crawlers/_playwright
- tests/unit/crawlers/_adaptive_playwright
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
630 | 630 | | |
631 | 631 | | |
632 | 632 | | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
633 | 636 | | |
634 | 637 | | |
635 | 638 | | |
| |||
Lines changed: 4 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
492 | 492 | | |
493 | 493 | | |
494 | 494 | | |
495 | | - | |
496 | | - | |
| 495 | + | |
497 | 496 | | |
| 497 | + | |
498 | 498 | | |
499 | 499 | | |
500 | 500 | | |
| |||
604 | 604 | | |
605 | 605 | | |
606 | 606 | | |
| 607 | + | |
| 608 | + | |
607 | 609 | | |
608 | 610 | | |
609 | 611 | | |
| |||
0 commit comments