diff --git a/Browser/keywords/playwright_state.py b/Browser/keywords/playwright_state.py index 9dd23ee17..beef0cbce 100755 --- a/Browser/keywords/playwright_state.py +++ b/Browser/keywords/playwright_state.py @@ -968,12 +968,7 @@ def new_persistent_context( traceFile=str(trace_file), ) ) - video_path = self._register_context( - response.id, - trace_file, - self._video_size(params.get("recordVideo"), params.get("viewport")), - json.loads(response.video), - ) + self.add_context_and_keyword_call_stack_to_trace(trace_file, response.id) context_options = self._mask_credentials( json.loads(response.contextOptions) ) @@ -1002,6 +997,11 @@ def new_persistent_context( self.close_browser() logger.debug("Teardown: Closed new persistent context.") raise e + video_path = self._cache_context( + response.id, + self._video_size(params.get("recordVideo"), params.get("viewport")), + json.loads(response.video), + ) return ( browser_id, response.id, @@ -1118,6 +1118,8 @@ def add_context_and_keyword_call_stack_to_trace(self, trace_file, ctx_id): return None self.library.tracing_contexts.append(ctx_id) if self.library.tracing_group_mode == TracingGroupMode.Browser: + if not self.library.keyword_call_stack: + return None return self.open_trace_group( **self.library._trace_group_arguments( self.library.keyword_call_stack[-1] @@ -1144,6 +1146,14 @@ def _register_context( video: dict | None = None, ) -> str: self.add_context_and_keyword_call_stack_to_trace(trace_file, context_id) + return self._cache_context(context_id, video_size, video) + + def _cache_context( + self, + context_id: str, + video_size: ViewportDimensions, + video: dict | None = None, + ) -> str: self.context_cache.add(context_id, video_size) return self._embed_video(video) if video else "" diff --git a/utest/test_adopted_context.py b/utest/test_adopted_context.py index daae34cad..b240283e7 100644 --- a/utest/test_adopted_context.py +++ b/utest/test_adopted_context.py @@ -210,6 +210,19 @@ def test_playwright_tracing_group_mode_adds_no_trace_groups(tmpdir, monkeypatch) assert browser.tracing_contexts == [] +def test_registered_context_outside_a_keyword_is_traced_without_trace_groups( + tmpdir, monkeypatch +): + browser = library(tmpdir, monkeypatch) + browser.tracing_group_mode = TracingGroupMode.Browser + options = browser.adopted_context_options(tracing=True) + + browser.register_adopted_context("context=1", options) + + assert not browser._playwright.stub.OpenTraceGroup.called + assert browser.tracing_contexts == ["context=1"] + + def test_registered_context_embeds_its_video(tmpdir, monkeypatch): browser = library(tmpdir, monkeypatch) options = browser.adopted_context_options(recordVideo={}) @@ -298,3 +311,57 @@ def test_new_persistent_context_sends_action_annotations(tmpdir, monkeypatch): options = sent_options(browser._playwright.stub.NewPersistentContext) assert options["recordVideo"]["showActions"] == {"position": "top"} + + +def persistent_context_with_video(browser: Browser) -> MagicMock: + stub = browser._playwright.stub + stub.NewPersistentContext.return_value = MagicMock( + id="context=1", + browserId="browser=1", + contextOptions="{}", + video=json.dumps({"video_path": "page.webm", "contextUuid": "context=1"}), + ) + return stub + + +def test_new_persistent_context_caches_and_embeds_its_video_once_its_url_opened( + tmpdir, monkeypatch, caplog +): + caplog.set_level("INFO") + browser = library(tmpdir, monkeypatch) + persistent_context_with_video(browser) + + browser.new_persistent_context(url="http://localhost:1", recordVideo={}) + + assert browser._playwright_state.context_cache.get("context=1") == { + "width": 1280, + "height": 720, + } + assert "