Skip to content

Commit 2c8aa6d

Browse files
authored
test: refactor trace viewer tests to use actual trace viewer (#2885)
1 parent 5476582 commit 2c8aa6d

File tree

8 files changed

+593
-329
lines changed

8 files changed

+593
-329
lines changed

tests/async/conftest.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,25 @@
1313
# limitations under the License.
1414

1515
import asyncio
16+
from contextlib import asynccontextmanager
17+
from pathlib import Path
1618
from typing import Any, AsyncGenerator, Awaitable, Callable, Dict, Generator
1719

1820
import pytest
1921

22+
from playwright._impl._driver import compute_driver_executable
2023
from playwright.async_api import (
2124
Browser,
2225
BrowserContext,
2326
BrowserType,
27+
FrameLocator,
28+
Locator,
2429
Page,
2530
Playwright,
2631
Selectors,
2732
async_playwright,
2833
)
34+
from tests.server import HTTPServer
2935

3036
from .utils import Utils
3137
from .utils import utils as utils_object
@@ -131,3 +137,77 @@ async def page(context: BrowserContext) -> AsyncGenerator[Page, None]:
131137
@pytest.fixture(scope="session")
132138
def selectors(playwright: Playwright) -> Selectors:
133139
return playwright.selectors
140+
141+
142+
class TraceViewerPage:
143+
def __init__(self, page: Page):
144+
self.page = page
145+
146+
@property
147+
def actions_tree(self) -> Locator:
148+
return self.page.get_by_test_id("actions-tree")
149+
150+
@property
151+
def action_titles(self) -> Locator:
152+
return self.page.locator(".action-title")
153+
154+
@property
155+
def stack_frames(self) -> Locator:
156+
return self.page.get_by_test_id("stack-trace-list").locator(".list-view-entry")
157+
158+
async def select_action(self, title: str, ordinal: int = 0) -> None:
159+
await self.page.locator(f'.action-title:has-text("{title}")').nth(
160+
ordinal
161+
).click()
162+
163+
async def select_snapshot(self, name: str) -> None:
164+
await self.page.click(
165+
f'.snapshot-tab .tabbed-pane-tab-label:has-text("{name}")'
166+
)
167+
168+
async def snapshot_frame(
169+
self, action_name: str, ordinal: int = 0, has_subframe: bool = False
170+
) -> FrameLocator:
171+
await self.select_action(action_name, ordinal)
172+
expected_frames = 4 if has_subframe else 3
173+
while len(self.page.frames) < expected_frames:
174+
await self.page.wait_for_event("frameattached")
175+
return self.page.frame_locator("iframe.snapshot-visible[name=snapshot]")
176+
177+
async def show_source_tab(self) -> None:
178+
await self.page.click("text='Source'")
179+
180+
async def expand_action(self, title: str, ordinal: int = 0) -> None:
181+
await self.actions_tree.locator(".tree-view-entry", has_text=title).nth(
182+
ordinal
183+
).locator(".codicon-chevron-right").click()
184+
185+
186+
@pytest.fixture
187+
async def show_trace_viewer(browser: Browser) -> AsyncGenerator[Callable, None]:
188+
"""Fixture that provides a function to show trace viewer for a trace file."""
189+
190+
@asynccontextmanager
191+
async def _show_trace_viewer(
192+
trace_path: Path,
193+
) -> AsyncGenerator[TraceViewerPage, None]:
194+
trace_viewer_path = (
195+
Path(compute_driver_executable()[0]) / "../package/lib/vite/traceViewer"
196+
).resolve()
197+
198+
server = HTTPServer()
199+
server.start(trace_viewer_path)
200+
server.set_route("/trace.zip", lambda request: request.serve_file(trace_path))
201+
202+
page = await browser.new_page()
203+
204+
try:
205+
await page.goto(
206+
f"{server.PREFIX}/index.html?trace={server.PREFIX}/trace.zip"
207+
)
208+
yield TraceViewerPage(page)
209+
finally:
210+
await page.close()
211+
server.stop()
212+
213+
yield _show_trace_viewer

tests/async/test_browsertype_connect.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
import os
1717
import re
1818
from pathlib import Path
19-
from typing import Callable
19+
from typing import AsyncContextManager, Callable
2020

2121
import pytest
2222

23-
from playwright.async_api import BrowserType, Error, Playwright, Route
23+
from playwright.async_api import BrowserType, Error, Playwright, Route, expect
2424
from tests.conftest import RemoteServer
2525
from tests.server import Server, TestServerRequest, WebSocketProtocol
26-
from tests.utils import chromium_version_less_than, parse_trace
26+
from tests.utils import chromium_version_less_than
27+
28+
from .conftest import TraceViewerPage
2729

2830

2931
async def test_should_print_custom_ws_close_error(
@@ -325,6 +327,7 @@ async def test_should_record_trace_with_source(
325327
server: Server,
326328
tmp_path: Path,
327329
browser_type: BrowserType,
330+
show_trace_viewer: Callable[[Path], AsyncContextManager[TraceViewerPage]],
328331
) -> None:
329332
remote = launch_server()
330333
browser = await browser_type.connect(remote.ws_endpoint)
@@ -341,14 +344,28 @@ async def test_should_record_trace_with_source(
341344
await context.close()
342345
await browser.close()
343346

344-
(resources, events) = parse_trace(path)
345-
current_file_content = Path(__file__).read_bytes()
346-
found_current_file = False
347-
for name, resource in resources.items():
348-
if resource == current_file_content:
349-
found_current_file = True
350-
break
351-
assert found_current_file
347+
async with show_trace_viewer(path) as trace_viewer:
348+
await expect(trace_viewer.action_titles).to_have_text(
349+
[
350+
re.compile("Page.goto"),
351+
re.compile("Page.set_content"),
352+
re.compile("Page.click"),
353+
]
354+
)
355+
await trace_viewer.show_source_tab()
356+
await expect(trace_viewer.stack_frames).to_contain_text(
357+
[
358+
re.compile(r"test_should_record_trace_with_source"),
359+
]
360+
)
361+
await trace_viewer.select_action("Page.set_content")
362+
# Check that the source file is shown
363+
await expect(
364+
trace_viewer.page.locator(".source-tab-file-name")
365+
).to_have_attribute("title", re.compile(r".*test_browsertype_connect\.py"))
366+
await expect(trace_viewer.page.locator(".source-line-running")).to_contain_text(
367+
'page.set_content("<button>Click</button>")'
368+
)
352369

353370

354371
async def test_should_record_trace_with_relative_trace_path(

0 commit comments

Comments
 (0)