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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy