From fc1ccc9ad87fec3dac3c3c519babb282c40f95db Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 6 Oct 2020 22:43:08 -0700 Subject: [PATCH] feat: support page.frame(predicate) --- .../playwright/tools/ApiGenerator.java | 33 +++++++++- .../com/microsoft/playwright/tools/Types.java | 2 +- .../microsoft/playwright/Accessibility.java | 1 - .../com/microsoft/playwright/Browser.java | 1 - .../microsoft/playwright/BrowserServer.java | 1 - .../com/microsoft/playwright/BrowserType.java | 1 - .../com/microsoft/playwright/CDPSession.java | 1 - .../microsoft/playwright/ChromiumBrowser.java | 1 - .../playwright/ChromiumBrowserContext.java | 1 - .../playwright/ChromiumCoverage.java | 1 - .../microsoft/playwright/ConsoleMessage.java | 1 - .../java/com/microsoft/playwright/Dialog.java | 1 - .../com/microsoft/playwright/Download.java | 1 - .../microsoft/playwright/ElementHandle.java | 1 - .../com/microsoft/playwright/FileChooser.java | 1 - .../microsoft/playwright/FirefoxBrowser.java | 1 - .../java/com/microsoft/playwright/Frame.java | 1 - .../com/microsoft/playwright/JSHandle.java | 1 - .../com/microsoft/playwright/Keyboard.java | 1 - .../java/com/microsoft/playwright/Logger.java | 1 - .../java/com/microsoft/playwright/Mouse.java | 1 - .../java/com/microsoft/playwright/Page.java | 28 ++++++++- .../com/microsoft/playwright/Request.java | 1 - .../com/microsoft/playwright/Response.java | 1 - .../java/com/microsoft/playwright/Route.java | 1 - .../com/microsoft/playwright/Selectors.java | 1 - .../microsoft/playwright/TimeoutError.java | 1 - .../microsoft/playwright/WebKitBrowser.java | 1 - .../java/com/microsoft/playwright/Worker.java | 1 - .../microsoft/playwright/impl/FrameImpl.java | 18 ++++-- .../microsoft/playwright/impl/PageImpl.java | 23 ++++++- .../microsoft/playwright/TestPageBasic.java | 63 +++++++++++++++++++ 32 files changed, 157 insertions(+), 36 deletions(-) diff --git a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java index d703e9ea..aa7e9cf3 100644 --- a/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java +++ b/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java @@ -490,7 +490,13 @@ class Interface extends TypeDefinition { void writeTo(List output, String offset) { output.add(header); output.add("import java.util.*;"); - output.add("import java.util.function.BiConsumer;"); + if (jsonName.equals("Page")) { + output.add("import java.util.function.BiConsumer;"); + output.add("import java.util.function.Predicate;"); + output.add("import java.util.regex.Pattern;"); + } else if (jsonName.equals("BrowserContext")) { + output.add("import java.util.function.BiConsumer;"); + } output.add(""); String implementsClause = ""; @@ -563,6 +569,31 @@ class Interface extends TypeDefinition { output.add(""); output.add(offset + " Object call(Source source, Object... args);"); output.add(offset + "}"); + output.add(""); + + output.add(offset + "class FrameOptions {"); + output.add(offset + " public String name;"); + output.add(offset + " public String url;"); + output.add(offset + " public Pattern urlPattern;"); + output.add(offset + " public Predicate urlPredicate;"); + output.add(""); + output.add(offset + " FrameOptions withName(String name) {"); + output.add(offset + " this.name = name;"); + output.add(offset + " return this;"); + output.add(offset + " }"); + output.add(offset + " FrameOptions withUrl(String url) {"); + output.add(offset + " this.url = url;"); + output.add(offset + " return this;"); + output.add(offset + " }"); + output.add(offset + " FrameOptions withUrl(Pattern pattern) {"); + output.add(offset + " urlPattern = pattern;"); + output.add(offset + " return this;"); + output.add(offset + " }"); + output.add(offset + " FrameOptions withUrl(Predicate predicate) {"); + output.add(offset + " urlPredicate = predicate;"); + output.add(offset + " return this;"); + output.add(offset + " }"); + output.add(offset + "}"); break; } case "BrowserContext": { diff --git a/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java b/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java index b7f7896f..0ef122a9 100644 --- a/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java +++ b/api-generator/src/main/java/com/microsoft/playwright/tools/Types.java @@ -205,7 +205,7 @@ class Types { add("BrowserContext.unroute.url", "string|RegExp|function(URL):boolean", "String"); add("BrowserContext.waitForEvent.optionsOrPredicate", "Function|Object", "String"); add("Page.waitForNavigation.options.url", "string|RegExp|Function", "String"); - add("Page.frame.options", "string|Object", "String"); + add("Page.frame.options", "string|Object", "FrameOptions", new Empty()); add("Page.route.url", "string|RegExp|function(URL):boolean", "String"); add("Page.selectOption.values", "null|string|ElementHandle|Array|Object|Array|Array", "String"); add("Page.setInputFiles.files", "string|Array|Object|Array", "String"); diff --git a/lib/src/main/java/com/microsoft/playwright/Accessibility.java b/lib/src/main/java/com/microsoft/playwright/Accessibility.java index 4b4bc310..37d6bac9 100644 --- a/lib/src/main/java/com/microsoft/playwright/Accessibility.java +++ b/lib/src/main/java/com/microsoft/playwright/Accessibility.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Accessibility { class SnapshotOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/Browser.java b/lib/src/main/java/com/microsoft/playwright/Browser.java index f1900920..0812414c 100644 --- a/lib/src/main/java/com/microsoft/playwright/Browser.java +++ b/lib/src/main/java/com/microsoft/playwright/Browser.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Browser { class NewContextOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/BrowserServer.java b/lib/src/main/java/com/microsoft/playwright/BrowserServer.java index 94ee2bdd..858b1ca1 100644 --- a/lib/src/main/java/com/microsoft/playwright/BrowserServer.java +++ b/lib/src/main/java/com/microsoft/playwright/BrowserServer.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface BrowserServer { void close(); diff --git a/lib/src/main/java/com/microsoft/playwright/BrowserType.java b/lib/src/main/java/com/microsoft/playwright/BrowserType.java index 76ad9264..098672b8 100644 --- a/lib/src/main/java/com/microsoft/playwright/BrowserType.java +++ b/lib/src/main/java/com/microsoft/playwright/BrowserType.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface BrowserType { class ConnectOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/CDPSession.java b/lib/src/main/java/com/microsoft/playwright/CDPSession.java index 8e2ccca7..ac7ec61a 100644 --- a/lib/src/main/java/com/microsoft/playwright/CDPSession.java +++ b/lib/src/main/java/com/microsoft/playwright/CDPSession.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface CDPSession { void detach(); diff --git a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java index 3dab1963..53fed925 100644 --- a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowser.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface ChromiumBrowser extends Browser { class StartTracingOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowserContext.java b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowserContext.java index 18912f73..8cc047ea 100644 --- a/lib/src/main/java/com/microsoft/playwright/ChromiumBrowserContext.java +++ b/lib/src/main/java/com/microsoft/playwright/ChromiumBrowserContext.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface ChromiumBrowserContext extends BrowserContext { List backgroundPages(); diff --git a/lib/src/main/java/com/microsoft/playwright/ChromiumCoverage.java b/lib/src/main/java/com/microsoft/playwright/ChromiumCoverage.java index 1f4f158f..19828714 100644 --- a/lib/src/main/java/com/microsoft/playwright/ChromiumCoverage.java +++ b/lib/src/main/java/com/microsoft/playwright/ChromiumCoverage.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface ChromiumCoverage { class StartCSSCoverageOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/ConsoleMessage.java b/lib/src/main/java/com/microsoft/playwright/ConsoleMessage.java index 8bc9a61d..d93e3a4b 100644 --- a/lib/src/main/java/com/microsoft/playwright/ConsoleMessage.java +++ b/lib/src/main/java/com/microsoft/playwright/ConsoleMessage.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface ConsoleMessage { class Location { diff --git a/lib/src/main/java/com/microsoft/playwright/Dialog.java b/lib/src/main/java/com/microsoft/playwright/Dialog.java index 8027538b..56a5b364 100644 --- a/lib/src/main/java/com/microsoft/playwright/Dialog.java +++ b/lib/src/main/java/com/microsoft/playwright/Dialog.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Dialog { default void accept() { diff --git a/lib/src/main/java/com/microsoft/playwright/Download.java b/lib/src/main/java/com/microsoft/playwright/Download.java index ec2cab66..2f68a20d 100644 --- a/lib/src/main/java/com/microsoft/playwright/Download.java +++ b/lib/src/main/java/com/microsoft/playwright/Download.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Download { Readable createReadStream(); diff --git a/lib/src/main/java/com/microsoft/playwright/ElementHandle.java b/lib/src/main/java/com/microsoft/playwright/ElementHandle.java index c82cae68..5f164643 100644 --- a/lib/src/main/java/com/microsoft/playwright/ElementHandle.java +++ b/lib/src/main/java/com/microsoft/playwright/ElementHandle.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface ElementHandle extends JSHandle { enum ElementState { DISABLED, ENABLED, HIDDEN, STABLE, VISIBLE } diff --git a/lib/src/main/java/com/microsoft/playwright/FileChooser.java b/lib/src/main/java/com/microsoft/playwright/FileChooser.java index 06895270..2c507b8f 100644 --- a/lib/src/main/java/com/microsoft/playwright/FileChooser.java +++ b/lib/src/main/java/com/microsoft/playwright/FileChooser.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface FileChooser { class SetFilesOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java b/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java index 4dc53eaa..4267cfe5 100644 --- a/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/FirefoxBrowser.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface FirefoxBrowser extends Browser { } diff --git a/lib/src/main/java/com/microsoft/playwright/Frame.java b/lib/src/main/java/com/microsoft/playwright/Frame.java index 7244cb25..e1cffdb0 100644 --- a/lib/src/main/java/com/microsoft/playwright/Frame.java +++ b/lib/src/main/java/com/microsoft/playwright/Frame.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Frame { enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE } diff --git a/lib/src/main/java/com/microsoft/playwright/JSHandle.java b/lib/src/main/java/com/microsoft/playwright/JSHandle.java index 0fb0cd51..c5cfa9a7 100644 --- a/lib/src/main/java/com/microsoft/playwright/JSHandle.java +++ b/lib/src/main/java/com/microsoft/playwright/JSHandle.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface JSHandle { ElementHandle asElement(); diff --git a/lib/src/main/java/com/microsoft/playwright/Keyboard.java b/lib/src/main/java/com/microsoft/playwright/Keyboard.java index 32a43d4a..b400194a 100644 --- a/lib/src/main/java/com/microsoft/playwright/Keyboard.java +++ b/lib/src/main/java/com/microsoft/playwright/Keyboard.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Keyboard { enum Modifier { ALT, CONTROL, META, SHIFT } diff --git a/lib/src/main/java/com/microsoft/playwright/Logger.java b/lib/src/main/java/com/microsoft/playwright/Logger.java index 7827fdf1..e5af4d66 100644 --- a/lib/src/main/java/com/microsoft/playwright/Logger.java +++ b/lib/src/main/java/com/microsoft/playwright/Logger.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Logger { enum Severity { ERROR, INFO, VERBOSE, WARNING } diff --git a/lib/src/main/java/com/microsoft/playwright/Mouse.java b/lib/src/main/java/com/microsoft/playwright/Mouse.java index 8e5271ab..087ec953 100644 --- a/lib/src/main/java/com/microsoft/playwright/Mouse.java +++ b/lib/src/main/java/com/microsoft/playwright/Mouse.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Mouse { enum Button { LEFT, MIDDLE, RIGHT } diff --git a/lib/src/main/java/com/microsoft/playwright/Page.java b/lib/src/main/java/com/microsoft/playwright/Page.java index c88fbb30..0aaaa8c3 100644 --- a/lib/src/main/java/com/microsoft/playwright/Page.java +++ b/lib/src/main/java/com/microsoft/playwright/Page.java @@ -18,6 +18,8 @@ package com.microsoft.playwright; import java.util.*; import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.regex.Pattern; public interface Page { class Viewport { @@ -52,6 +54,30 @@ public interface Page { Object call(Source source, Object... args); } + class FrameOptions { + public String name; + public String url; + public Pattern urlPattern; + public Predicate urlPredicate; + + FrameOptions withName(String name) { + this.name = name; + return this; + } + FrameOptions withUrl(String url) { + this.url = url; + return this; + } + FrameOptions withUrl(Pattern pattern) { + urlPattern = pattern; + return this; + } + FrameOptions withUrl(Predicate predicate) { + urlPredicate = predicate; + return this; + } + } + enum LoadState { DOMCONTENTLOADED, LOAD, NETWORKIDLE } class CloseOptions { public Boolean runBeforeUnload; @@ -815,7 +841,7 @@ public interface Page { focus(selector, null); } void focus(String selector, FocusOptions options); - Frame frame(String options); + Frame frame(FrameOptions options); List frames(); default String getAttribute(String selector, String name) { return getAttribute(selector, name, null); diff --git a/lib/src/main/java/com/microsoft/playwright/Request.java b/lib/src/main/java/com/microsoft/playwright/Request.java index 6b27b26c..5dc1b5cb 100644 --- a/lib/src/main/java/com/microsoft/playwright/Request.java +++ b/lib/src/main/java/com/microsoft/playwright/Request.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Request { class RequestFailure { diff --git a/lib/src/main/java/com/microsoft/playwright/Response.java b/lib/src/main/java/com/microsoft/playwright/Response.java index dfa753c7..d720858b 100644 --- a/lib/src/main/java/com/microsoft/playwright/Response.java +++ b/lib/src/main/java/com/microsoft/playwright/Response.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Response { byte[] body(); diff --git a/lib/src/main/java/com/microsoft/playwright/Route.java b/lib/src/main/java/com/microsoft/playwright/Route.java index 455ce86a..75fa5543 100644 --- a/lib/src/main/java/com/microsoft/playwright/Route.java +++ b/lib/src/main/java/com/microsoft/playwright/Route.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Route { class ContinueOverrides { diff --git a/lib/src/main/java/com/microsoft/playwright/Selectors.java b/lib/src/main/java/com/microsoft/playwright/Selectors.java index d491f302..d8e2ffdb 100644 --- a/lib/src/main/java/com/microsoft/playwright/Selectors.java +++ b/lib/src/main/java/com/microsoft/playwright/Selectors.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Selectors { class RegisterOptions { diff --git a/lib/src/main/java/com/microsoft/playwright/TimeoutError.java b/lib/src/main/java/com/microsoft/playwright/TimeoutError.java index 602b8c80..6a0c9136 100644 --- a/lib/src/main/java/com/microsoft/playwright/TimeoutError.java +++ b/lib/src/main/java/com/microsoft/playwright/TimeoutError.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface TimeoutError { } diff --git a/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java b/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java index eefd641b..af2bfc1b 100644 --- a/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java +++ b/lib/src/main/java/com/microsoft/playwright/WebKitBrowser.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface WebKitBrowser extends Browser { } diff --git a/lib/src/main/java/com/microsoft/playwright/Worker.java b/lib/src/main/java/com/microsoft/playwright/Worker.java index c8f03815..c2ad5092 100644 --- a/lib/src/main/java/com/microsoft/playwright/Worker.java +++ b/lib/src/main/java/com/microsoft/playwright/Worker.java @@ -17,7 +17,6 @@ package com.microsoft.playwright; import java.util.*; -import java.util.function.BiConsumer; public interface Worker { default Object evaluate(String pageFunction) { diff --git a/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java index 4c653395..7f1233aa 100644 --- a/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java +++ b/lib/src/main/java/com/microsoft/playwright/impl/FrameImpl.java @@ -125,10 +125,9 @@ public class FrameImpl extends ChannelOwner implements Frame { @Override public List childFrames() { - return null; + return new ArrayList<>(childFrames); } - @Override public void click(String selector, ClickOptions options) { if (options == null) { @@ -210,7 +209,12 @@ public class FrameImpl extends ChannelOwner implements Frame { @Override public void focus(String selector, FocusOptions options) { - + if (options == null) { + options = new FocusOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + params.addProperty("selector", selector); + sendMessage("focus", params); } @Override @@ -284,7 +288,13 @@ public class FrameImpl extends ChannelOwner implements Frame { @Override public void press(String selector, String key, PressOptions options) { - + if (options == null) { + options = new PressOptions(); + } + JsonObject params = new Gson().toJsonTree(options).getAsJsonObject(); + params.addProperty("selector", selector); + params.addProperty("key", key); + sendMessage("press", params); } @Override diff --git a/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java b/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java index 8b778b55..1bde5888 100644 --- a/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java +++ b/lib/src/main/java/com/microsoft/playwright/impl/PageImpl.java @@ -268,11 +268,28 @@ public class PageImpl extends ChannelOwner implements Page { @Override public void focus(String selector, FocusOptions options) { - + mainFrame.focus(selector, convertViaJson(options, Frame.FocusOptions.class)); } @Override - public Frame frame(String options) { + public Frame frame(FrameOptions options) { + if (options == null) { + throw new IllegalArgumentException("Frame criteria should be cpecified"); + } + for (Frame frame : frames) { + if (options.name != null && options.name.equals(frame.name())) { + return frame; + } + if (options.url != null && options.url.equals(frame.url())) { + return frame; + } + if (options.urlPattern != null && options.urlPattern.matcher(frame.url()).matches()) { + return frame; + } + if (options.urlPredicate != null && options.urlPredicate.test(frame.url())) { + return frame; + } + } return null; } @@ -352,7 +369,7 @@ public class PageImpl extends ChannelOwner implements Page { @Override public void press(String selector, String key, PressOptions options) { - + mainFrame.press(selector, key, convertViaJson(options, Frame.PressOptions.class)); } @Override diff --git a/lib/src/test/java/com/microsoft/playwright/TestPageBasic.java b/lib/src/test/java/com/microsoft/playwright/TestPageBasic.java index f7a9436d..05f29300 100644 --- a/lib/src/test/java/com/microsoft/playwright/TestPageBasic.java +++ b/lib/src/test/java/com/microsoft/playwright/TestPageBasic.java @@ -19,6 +19,10 @@ package com.microsoft.playwright; import org.junit.jupiter.api.*; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; import static com.microsoft.playwright.Page.LoadState.DOMCONTENTLOADED; import static com.microsoft.playwright.Page.LoadState.LOAD; @@ -246,4 +250,63 @@ public class TestPageBasic { void pageContextShouldReturnTheCorrectInstance() { assertEquals(context, page.context()); } + + @Test + void pageFrameShouldRespectName() { + page.setContent(""); + assertNull(page.frame(new Page.FrameOptions().withName("bogus"))); + Frame frame = page.frame(new Page.FrameOptions().withName("target")); + assertNotNull(frame); + assertEquals(page.mainFrame().childFrames().get(0), frame); + } + + @Test + void pageFrameShouldRespectUrl() { + page.setContent(""); + assertNull(page.frame(new Page.FrameOptions().withUrl(Pattern.compile("bogus")))); + Frame frame = page.frame(new Page.FrameOptions().withUrl(Pattern.compile(".*empty.*"))); + assertNotNull(frame); + assertEquals(server.EMPTY_PAGE, frame.url()); + } + + // TODO: + void shouldHaveSaneUserAgent() { + } + + @Test + void pagePressShouldWork() { + page.navigate(server.PREFIX + "/input/textarea.html"); + page.press("textarea", "a"); + assertEquals("a", page.evaluate("() => document.querySelector('textarea').value")); + } + + @Test + void pagePressShouldWorkForEnter() { + page.setContent(""); + List messages = new ArrayList<>(); + page.addConsoleListener(message -> messages.add(message)); + page.press("input", "Enter"); + assertEquals("press", messages.get(0).text()); + } + + @Test + void framePressShouldWork() { + page.setContent(""); + Frame frame = page.frame(new Page.FrameOptions().withName("inner")); + frame.press("textarea", "a"); + assertEquals("a", frame.evaluate("() => document.querySelector('textarea').value")); + } + + @Test + void frameFocusShouldWorkMultipleTimes() { + // TODO: test.fail(browserName === "firefox"); + Page page1 = context.newPage(); + Page page2 = context.newPage(); + for (Page page : Arrays.asList(page1, page2)) { + page.setContent(""); + page.focus("#foo"); + assertEquals(true, page.evaluate("() => !!window['gotFocus']")); + } + } + }