diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java index 42e30b093..4380428fd 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/ClockImpl.java @@ -12,18 +12,24 @@ class ClockImpl implements Clock { this.browserContext = browserContext; } + private void sendMessageWithLogging(String method, JsonObject params) { + String capitalizedMethod = method.substring(0, 1).toUpperCase() + method.substring(1); + browserContext.withLogging("Clock." + method, + () -> browserContext.sendMessage("clock" + capitalizedMethod, params)); + } + @Override public void fastForward(long ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksNumber", ticks); - browserContext.sendMessage("clockFastForward", params); + sendMessageWithLogging("fastForward", params); } @Override public void fastForward(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - browserContext.sendMessage("clockFastForward", params); + sendMessageWithLogging("fastForward", params); } @Override @@ -32,89 +38,89 @@ public void install(InstallOptions options) { if (options != null) { parseTime(options.time, params); } - browserContext.sendMessage("clockInstall", params); + sendMessageWithLogging("install", params); } @Override public void runFor(long ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksNumber", ticks); - browserContext.sendMessage("clockRunFor", params); + sendMessageWithLogging("runFor", params); } @Override public void runFor(String ticks) { JsonObject params = new JsonObject(); params.addProperty("ticksString", ticks); - browserContext.sendMessage("clockRunFor", params); + sendMessageWithLogging("runFor", params); } @Override public void pauseAt(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void pauseAt(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void pauseAt(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockPauseAt", params); + sendMessageWithLogging("pauseAt", params); } @Override public void resume() { - browserContext.sendMessage("clockResume"); + sendMessageWithLogging("resume", new JsonObject()); } @Override public void setFixedTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setFixedTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setFixedTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockSetFixedTime", params); + sendMessageWithLogging("setFixedTime", params); } @Override public void setSystemTime(long time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } @Override public void setSystemTime(String time) { JsonObject params = new JsonObject(); params.addProperty("timeString", time); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } @Override public void setSystemTime(Date time) { JsonObject params = new JsonObject(); params.addProperty("timeNumber", time.getTime()); - browserContext.sendMessage("clockSetSystemTime", params); + sendMessageWithLogging("setSystemTime", params); } private static void parseTime(Object time, JsonObject params) { diff --git a/playwright/src/test/java/com/microsoft/playwright/TestTracing.java b/playwright/src/test/java/com/microsoft/playwright/TestTracing.java index 2da398f97..d0fce7426 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestTracing.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestTracing.java @@ -18,7 +18,10 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.microsoft.playwright.options.AriaRole; import com.microsoft.playwright.options.Location; +import com.microsoft.playwright.options.MouseButton; + import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -204,6 +207,68 @@ void traceGroupGroupEnd(@TempDir Path tempDir) throws Exception { assertEquals(asList("outer group", "Page.navigate", "inner group 1", "Frame.click", "inner group 2", "Page.isVisible"), calls); } + @Test + void shouldTraceVariousAPIs(@TempDir Path tempDir) throws Exception { + context.tracing().start(new Tracing.StartOptions()); + + page.clock().install(); + + page.setContent(""); + page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT)); + page.getByRole(AriaRole.TEXTBOX).click(); + page.keyboard().type("Hello world this is a very long string what happens when it overflows?"); + page.keyboard().press("Control+c"); + page.keyboard().down("Shift"); + page.keyboard().insertText("Hello world"); + page.keyboard().up("Shift"); + page.mouse().move(0, 0); + page.mouse().down(); + page.mouse().move(100, 200); + page.mouse().wheel(5, 7); + page.mouse().up(); + page.clock().fastForward(1000); + page.clock().fastForward("30:00"); + page.clock().pauseAt("2050-02-02"); + page.clock().runFor(10); + page.clock().setFixedTime("2050-02-02"); + page.clock().setSystemTime("2050-02-02"); + + page.clock().resume(); + + page.locator("input").click(new Locator.ClickOptions().setButton(MouseButton.RIGHT)); + + Path traceFile1 = tempDir.resolve("trace1.zip"); + context.tracing().stop(new Tracing.StopOptions().setPath(traceFile1)); + + List events = parseTraceEvents(traceFile1); + List calls = events.stream().filter(e -> e.apiName != null).map(e -> e.apiName) + .collect(Collectors.toList()); + assertEquals(asList( + "Clock.install", + "Page.setContent", + "Frame.click", + "Frame.click", + "Keyboard.type", + "Keyboard.press", + "Keyboard.down", + "Keyboard.insertText", + "Keyboard.up", + "Mouse.move", + "Mouse.down", + "Mouse.move", + "Mouse.wheel", + "Mouse.up", + "Clock.fastForward", + "Clock.fastForward", + "Clock.pauseAt", + "Clock.runFor", + "Clock.setFixedTime", + "Clock.setSystemTime", + "Clock.resume", + "Frame.click"), + calls); + } + private static class TraceEvent { String type; String name;