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 dfe2447f..b99139c5 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 @@ -369,6 +369,23 @@ class Method extends Element { customSignature.put("BrowserContext.waitForEvent", waitForEvent); customSignature.put("WebSocket.waitForEvent", waitForEvent); + customSignature.put("Page.waitForRequest", new String[] { + "default Deferred waitForRequest(String urlGlob) { return waitForRequest(urlGlob, null); }", + "default Deferred waitForRequest(Pattern urlPattern) { return waitForRequest(urlPattern, null); }", + "default Deferred waitForRequest(Predicate urlPredicate) { return waitForRequest(urlPredicate, null); }", + "Deferred waitForRequest(String urlGlob, WaitForRequestOptions options);", + "Deferred waitForRequest(Pattern urlPattern, WaitForRequestOptions options);", + "Deferred waitForRequest(Predicate urlPredicate, WaitForRequestOptions options);" + }); + customSignature.put("Page.waitForResponse", new String[] { + "default Deferred waitForResponse(String urlGlob) { return waitForResponse(urlGlob, null); }", + "default Deferred waitForResponse(Pattern urlPattern) { return waitForResponse(urlPattern, null); }", + "default Deferred waitForResponse(Predicate urlPredicate) { return waitForResponse(urlPredicate, null); }", + "Deferred waitForResponse(String urlGlob, WaitForResponseOptions options);", + "Deferred waitForResponse(Pattern urlPattern, WaitForResponseOptions options);", + "Deferred waitForResponse(Predicate urlPredicate, WaitForResponseOptions options);" + }); + String[] selectOption = { "default List selectOption(String selector, String value) {", " return selectOption(selector, value, null);", @@ -428,8 +445,10 @@ class Method extends Element { private static Set skipJavadoc = new HashSet<>(asList( "BrowserContext.waitForEvent.optionsOrPredicate", "Page.waitForEvent.optionsOrPredicate", + "WebSocket.waitForEvent.optionsOrPredicate", "Page.frame.options", - "WebSocket.waitForEvent.optionsOrPredicate" + "Page.waitForRequest", + "Page.waitForResponse" )); Method(TypeDefinition parent, JsonObject jsonElement) { @@ -503,6 +522,9 @@ class Method extends Element { } private void writeJavadoc(List output, String offset) { + if (skipJavadoc.contains(jsonPath)) { + return; + } List sections = new ArrayList<>(); sections.add(formattedComment()); if (!params.isEmpty()) { diff --git a/playwright/src/main/java/com/microsoft/playwright/Page.java b/playwright/src/main/java/com/microsoft/playwright/Page.java index 14fd5136..2af6a699 100644 --- a/playwright/src/main/java/com/microsoft/playwright/Page.java +++ b/playwright/src/main/java/com/microsoft/playwright/Page.java @@ -2128,26 +2128,18 @@ public interface Page { * Shortcut for main frame's frame.waitForNavigation([options]). */ Deferred waitForNavigation(WaitForNavigationOptions options); - default Deferred waitForRequest(String urlOrPredicate) { - return waitForRequest(urlOrPredicate, null); - } - /** - * Returns promise that resolves to the matched request. - *

- * - * @param urlOrPredicate Request URL string, regex or predicate receiving Request object. - */ - Deferred waitForRequest(String urlOrPredicate, WaitForRequestOptions options); - default Deferred waitForResponse(String urlOrPredicate) { - return waitForResponse(urlOrPredicate, null); - } - /** - * Returns the matched response. - *

- * - * @param urlOrPredicate Request URL string, regex or predicate receiving Response object. - */ - Deferred waitForResponse(String urlOrPredicate, WaitForResponseOptions options); + default Deferred waitForRequest(String urlGlob) { return waitForRequest(urlGlob, null); } + default Deferred waitForRequest(Pattern urlPattern) { return waitForRequest(urlPattern, null); } + default Deferred waitForRequest(Predicate urlPredicate) { return waitForRequest(urlPredicate, null); } + Deferred waitForRequest(String urlGlob, WaitForRequestOptions options); + Deferred waitForRequest(Pattern urlPattern, WaitForRequestOptions options); + Deferred waitForRequest(Predicate urlPredicate, WaitForRequestOptions options); + default Deferred waitForResponse(String urlGlob) { return waitForResponse(urlGlob, null); } + default Deferred waitForResponse(Pattern urlPattern) { return waitForResponse(urlPattern, null); } + default Deferred waitForResponse(Predicate urlPredicate) { return waitForResponse(urlPredicate, null); } + Deferred waitForResponse(String urlGlob, WaitForResponseOptions options); + Deferred waitForResponse(Pattern urlPattern, WaitForResponseOptions options); + Deferred waitForResponse(Predicate urlPredicate, WaitForResponseOptions options); default Deferred waitForSelector(String selector) { return waitForSelector(selector, null); } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java index 1b7938b3..e4b47740 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/PageImpl.java @@ -850,34 +850,54 @@ public class PageImpl extends ChannelOwner implements Page { } @Override - public Deferred waitForRequest(String urlOrPredicate, WaitForRequestOptions options) { + public Deferred waitForRequest(String urlGlob, WaitForRequestOptions options) { + return waitForRequest(new UrlMatcher(urlGlob), options); + } + + @Override + public Deferred waitForRequest(Pattern urlPattern, WaitForRequestOptions options) { + return waitForRequest(new UrlMatcher(urlPattern), options); + } + + @Override + public Deferred waitForRequest(Predicate urlPredicate, WaitForRequestOptions options) { + return waitForRequest(new UrlMatcher(urlPredicate), options); + } + + private Deferred waitForRequest(UrlMatcher matcher, WaitForRequestOptions options) { if (options == null) { options = new WaitForRequestOptions(); } List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, EventType.REQUEST,e -> { - if (urlOrPredicate == null) { - return true; - } - return urlOrPredicate.equals(((Request) e.data()).url()); - }).apply(event -> (Request) event.data())); + waitables.add(new WaitableEvent<>(listeners, EventType.REQUEST, e -> matcher.test(((Request) e.data()).url())) + .apply(event -> (Request) event.data())); waitables.add(createWaitForCloseHelper()); waitables.add(createWaitableTimeout(options.timeout)); return toDeferred(new WaitableRace<>(waitables)); } @Override - public Deferred waitForResponse(String urlOrPredicate, WaitForResponseOptions options) { + public Deferred waitForResponse(String urlGlob, WaitForResponseOptions options) { + return waitForResponse(new UrlMatcher(urlGlob), options); + } + + @Override + public Deferred waitForResponse(Pattern urlPattern, WaitForResponseOptions options) { + return waitForResponse(new UrlMatcher(urlPattern), options); + } + + @Override + public Deferred waitForResponse(Predicate urlPredicate, WaitForResponseOptions options) { + return waitForResponse(new UrlMatcher(urlPredicate), options); + } + + private Deferred waitForResponse(UrlMatcher matcher, WaitForResponseOptions options) { if (options == null) { options = new WaitForResponseOptions(); } List> waitables = new ArrayList<>(); - waitables.add(new WaitableEvent<>(listeners, EventType.RESPONSE, e -> { - if (urlOrPredicate == null) { - return true; - } - return urlOrPredicate.equals(((Response) e.data()).url()); - }).apply(event -> (Response) event.data())); + waitables.add(new WaitableEvent<>(listeners, EventType.RESPONSE, e -> matcher.test(((Response) e.data()).url())) + .apply(event -> (Response) event.data())); waitables.add(createWaitForCloseHelper()); waitables.add(createWaitableTimeout(options.timeout)); return toDeferred(new WaitableRace<>(waitables)); diff --git a/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForRequest.java b/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForRequest.java new file mode 100644 index 00000000..c105b52f --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForRequest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright; + +import org.junit.jupiter.api.Test; + +import java.util.regex.Pattern; + +import static com.microsoft.playwright.Page.EventType.REQUEST; +import static org.junit.jupiter.api.Assertions.*; + +public class TestPageWaitForRequest extends TestBase { + + @Test + void shouldWork() { + page.navigate(server.EMPTY_PAGE); + Deferred request = page.waitForRequest(server.PREFIX + "/digits/2.png"); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/2.png", request.get().url()); + } + + @Test + void shouldWorkWithPredicate() { + page.navigate(server.EMPTY_PAGE); + Deferred request = page.waitForRequest(url -> url.equals(server.PREFIX + "/digits/2.png")); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/2.png", request.get().url()); + } + + @Test + void shouldRespectTimeout() { + try { + page.waitForEvent(REQUEST, new Page.WaitForEventOptions() + .withPredicate(url -> false).withTimeout(1)).get(); + fail("did not throw"); + } catch (PlaywrightException e) { + assertTrue(e.getMessage().contains("Timeout"), e.getMessage()); + } + } + + @Test + void shouldRespectDefaultTimeout() { + page.setDefaultTimeout(1); + try { + page.waitForEvent(REQUEST, url -> false).get(); + fail("did not throw"); + } catch (PlaywrightException e) { + assertTrue(e.getMessage().contains("Timeout"), e.getMessage()); + } + } + + @Test + void shouldWorkWithNoTimeout() { + page.navigate(server.EMPTY_PAGE); + Deferred request = page.waitForRequest(server.PREFIX + "/digits/2.png", + new Page.WaitForRequestOptions().withTimeout(0)); + page.evaluate("() => setTimeout(() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}, 50)"); + assertEquals(server.PREFIX + "/digits/2.png", request.get().url()); + } + + @Test + void shouldWorkWithUrlMatch() { + page.navigate(server.EMPTY_PAGE); + Deferred request = page.waitForRequest(Pattern.compile(".*digits/\\d\\.png")); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/1.png", request.get().url()); + } + + void shouldWorkWithUrlMatchRegularExpressionFromADifferentContext() { + // Node.js specific + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForResponse.java b/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForResponse.java new file mode 100644 index 00000000..93bdcf44 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestPageWaitForResponse.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright; + +import org.junit.jupiter.api.Test; + +import static com.microsoft.playwright.Page.EventType.REQUEST; +import static com.microsoft.playwright.Page.EventType.RESPONSE; +import static org.junit.jupiter.api.Assertions.*; + +public class TestPageWaitForResponse extends TestBase { + @Test + void shouldWork() { + page.navigate(server.EMPTY_PAGE); + Deferred response = page.waitForResponse(server.PREFIX + "/digits/2.png"); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/2.png", response.get().url()); + } + + @Test + void shouldRespectTimeout() { + page.navigate(server.EMPTY_PAGE); + Deferred response = page.waitForResponse(url -> url.equals(server.PREFIX + "/digits/2.png")); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/2.png", response.get().url()); + } + + @Test + void shouldWorkWithPredicate() { + page.navigate(server.EMPTY_PAGE); + Deferred response = page.waitForResponse(url -> url.equals(server.PREFIX + "/digits/2.png")); + page.evaluate("() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}"); + assertEquals(server.PREFIX + "/digits/2.png", response.get().url()); + } + + @Test + void shouldRespectDefaultTimeout() { + page.setDefaultTimeout(1); + try { + page.waitForEvent(RESPONSE, url -> false).get(); + fail("did not throw"); + } catch (PlaywrightException e) { + assertTrue(e.getMessage().contains("Timeout"), e.getMessage()); + } + } + + @Test + void shouldWorkWithNoTimeout() { + page.navigate(server.EMPTY_PAGE); + Deferred response = page.waitForResponse(server.PREFIX + "/digits/2.png", + new Page.WaitForResponseOptions().withTimeout(0)); + page.evaluate("() => setTimeout(() => {\n" + + " fetch('/digits/1.png');\n" + + " fetch('/digits/2.png');\n" + + " fetch('/digits/3.png');\n" + + "}, 50)"); + assertEquals(server.PREFIX + "/digits/2.png", response.get().url()); + } +}