diff --git a/tests/unit/test_engine.py b/tests/unit/test_engine.py index aa8c932..1e6fa9e 100644 --- a/tests/unit/test_engine.py +++ b/tests/unit/test_engine.py @@ -21,6 +21,25 @@ def execute_script(self, script, *args): return None +def test_reinjection_sleep_respects_short_per_call_deadline(monkeypatch): + engine = StabilizationEngine(object(), StabilizationConfig(poll_interval=0.5)) + engine.ensure_instrumented = Mock() + engine._get_browser_status = Mock(return_value=None) + engine._inject_instrumentation = Mock() + clock = [0.0] + sleeps = [] + monkeypatch.setattr("waitless.engine.time.monotonic", lambda: clock[0]) + + def sleep(seconds): + sleeps.append(seconds) + clock[0] += seconds + + monkeypatch.setattr("waitless.engine.time.sleep", sleep) + with pytest.raises(StabilizationTimeout): + engine.wait_for_stability(timeout=0.05) + assert sleeps == [0.05] + + @pytest.mark.parametrize("timeout", [0, -1, float("nan"), float("inf"), "1", True]) def test_per_call_timeout_is_validated_before_browser_access(timeout): engine = StabilizationEngine(object()) diff --git a/waitless/engine.py b/waitless/engine.py index 3ac900b..da9d84e 100644 --- a/waitless/engine.py +++ b/waitless/engine.py @@ -258,7 +258,9 @@ def _wait_for_stability_impl(self, timeout: Optional[float] = None) -> Stability if self.config.reinject_on_navigation: self._debug("Browser status unavailable, attempting reinject") self._inject_instrumentation() - time.sleep(self.config.poll_interval) + remaining = deadline - time.monotonic() + if remaining > 0: + time.sleep(min(self.config.poll_interval, remaining)) continue else: raise InstrumentationError(