mirror of
https://github.com/microsoft/playwright-java.git
synced 2025-09-08 21:01:00 +00:00
test: network events (#47)
This commit is contained in:
parent
c134a6355f
commit
7d45a26344
@ -834,6 +834,9 @@ class NestedClass extends TypeDefinition {
|
||||
f.writeTo(output, bodyOffset, fieldAccess);
|
||||
}
|
||||
output.add("");
|
||||
if ("Request.failure".equals(jsonPath)) {
|
||||
writeConstructor(output, bodyOffset);
|
||||
}
|
||||
if (isReturnType) {
|
||||
for (Field f : fields) {
|
||||
f.writeGetter(output, bodyOffset);
|
||||
@ -858,6 +861,19 @@ class NestedClass extends TypeDefinition {
|
||||
f.writeBuilderMethod(output, bodyOffset, name);
|
||||
}
|
||||
}
|
||||
|
||||
private void writeConstructor(List<String> output, String bodyOffset) {
|
||||
List<String> args = new ArrayList<>();
|
||||
for (Field f : fields) {
|
||||
args.add(f.type.toJava() + " " + f.name);
|
||||
}
|
||||
output.add(bodyOffset + "public " + name + "(" + String.join(", ", args) + ") {");
|
||||
for (Field f : fields) {
|
||||
output.add(bodyOffset + " this." + f.name + " = " + f.name + ";");
|
||||
}
|
||||
output.add(bodyOffset + "}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Enum extends TypeDefinition {
|
||||
|
@ -22,6 +22,9 @@ public interface Request {
|
||||
class RequestFailure {
|
||||
private String errorText;
|
||||
|
||||
public RequestFailure(String errorText) {
|
||||
this.errorText = errorText;
|
||||
}
|
||||
public String errorText() {
|
||||
return this.errorText;
|
||||
}
|
||||
|
@ -16,12 +16,13 @@
|
||||
|
||||
package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.*;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonWriter;
|
||||
import com.microsoft.playwright.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Predicate;
|
||||
@ -115,7 +116,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
String guid = params.getAsJsonObject("request").get("guid").getAsString();
|
||||
RequestImpl request = connection.getExistingObject(guid);
|
||||
if (params.has("failureText")) {
|
||||
request.failureText = new Gson().fromJson(params, Request.RequestFailure.class);
|
||||
request.failure = new Request.RequestFailure(params.get("failureText").getAsString());
|
||||
}
|
||||
listeners.notify(EventType.REQUESTFAILED, request);
|
||||
} else if ("requestFinished".equals(event)) {
|
||||
|
@ -16,7 +16,6 @@
|
||||
|
||||
package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.Frame;
|
||||
@ -30,7 +29,7 @@ public class RequestImpl extends ChannelOwner implements Request {
|
||||
private RequestImpl redirectedFrom;
|
||||
private RequestImpl redirectedTo;
|
||||
private final Map<String, String> headers = new HashMap<>();
|
||||
RequestFailure failureText;
|
||||
RequestFailure failure;
|
||||
|
||||
RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
super(parent, type, guid, initializer);
|
||||
@ -47,7 +46,7 @@ public class RequestImpl extends ChannelOwner implements Request {
|
||||
|
||||
@Override
|
||||
public RequestFailure failure() {
|
||||
return null;
|
||||
return failure;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -32,6 +32,8 @@ public class TestBase {
|
||||
static boolean isChromium;
|
||||
static boolean isWebKit;
|
||||
static boolean isFirefox;
|
||||
static boolean isMac = Utils.getOS() == Utils.OS.MAC;
|
||||
static boolean isWindows = Utils.getOS() == Utils.OS.WINDOWS;
|
||||
static boolean headful;
|
||||
Page page;
|
||||
BrowserContext context;
|
||||
|
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* 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.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.microsoft.playwright.Page.EventType.*;
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class TestPageEventNetwork extends TestBase {
|
||||
@Test
|
||||
void PageEventsRequest() {
|
||||
List<Request> requests = new ArrayList<>();
|
||||
page.addListener(REQUEST, event -> requests.add((Request) event.data()));
|
||||
page.navigate(server.EMPTY_PAGE);
|
||||
assertEquals(1, requests.size());
|
||||
assertEquals(server.EMPTY_PAGE, requests.get(0).url());
|
||||
assertEquals("document", requests.get(0).resourceType());
|
||||
assertEquals("GET", requests.get(0).method());
|
||||
assertNotNull(requests.get(0).response());
|
||||
assertEquals(page.mainFrame(), requests.get(0).frame());
|
||||
assertEquals(server.EMPTY_PAGE, requests.get(0).frame().url());
|
||||
}
|
||||
|
||||
@Test
|
||||
void PageEventsResponse() {
|
||||
List<Response> responses = new ArrayList<>();
|
||||
page.addListener(RESPONSE, event -> responses.add((Response) event.data()));
|
||||
page.navigate(server.EMPTY_PAGE);
|
||||
assertEquals(1, responses.size());
|
||||
assertEquals(server.EMPTY_PAGE, responses.get(0).url());
|
||||
assertEquals(200, responses.get(0).status());
|
||||
assertTrue(responses.get(0).ok());
|
||||
assertNotNull(responses.get(0).request());
|
||||
}
|
||||
|
||||
@Test
|
||||
void PageEventsRequestFailed() {
|
||||
server.setRoute("/one-style.css", exchange -> exchange.getResponseBody().close());
|
||||
List<Request> failedRequests = new ArrayList<>();
|
||||
page.addListener(REQUESTFAILED, event -> failedRequests.add((Request) event.data()));
|
||||
page.navigate(server.PREFIX + "/one-style.html");
|
||||
assertEquals(1, failedRequests.size());
|
||||
assertTrue(failedRequests.get(0).url().contains("one-style.css"));
|
||||
assertNull(failedRequests.get(0).response());
|
||||
assertEquals("stylesheet", failedRequests.get(0).resourceType());
|
||||
if (isChromium) {
|
||||
assertEquals("net::ERR_EMPTY_RESPONSE", failedRequests.get(0).failure().errorText());
|
||||
} else if (isWebKit) {
|
||||
if (isMac)
|
||||
assertEquals("The network connection was lost.", failedRequests.get(0).failure().errorText());
|
||||
else if (isWindows)
|
||||
assertEquals("Server returned nothing (no headers, no data)", failedRequests.get(0).failure().errorText());
|
||||
else
|
||||
assertEquals("Message Corrupt", failedRequests.get(0).failure().errorText());
|
||||
} else {
|
||||
assertEquals("NS_ERROR_NET_RESET", failedRequests.get(0).failure().errorText());
|
||||
}
|
||||
assertNotNull(failedRequests.get(0).frame());
|
||||
}
|
||||
|
||||
@Test
|
||||
void PageEventsRequestFinished() {
|
||||
Deferred<Event<Page.EventType>> event = page.waitForEvent(REQUESTFINISHED);
|
||||
Response response = page.navigate(server.EMPTY_PAGE);
|
||||
event.get();
|
||||
Request request = response.request();
|
||||
assertEquals(server.EMPTY_PAGE, request.url());
|
||||
assertNotNull(request.response());
|
||||
assertEquals(page.mainFrame(), request.frame());
|
||||
assertEquals(server.EMPTY_PAGE, request.frame().url());
|
||||
assertNull(request.failure());
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldFireEventsInProperOrder() {
|
||||
List<String> events = new ArrayList<>();
|
||||
page.addListener(REQUEST, event -> events.add("request"));
|
||||
page.addListener(RESPONSE, event -> events.add("response"));
|
||||
Response response = page.navigate(server.EMPTY_PAGE);
|
||||
assertNull(response.finished());
|
||||
events.add("requestfinished");
|
||||
assertEquals(asList("request", "response", "requestfinished"), events);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldSupportRedirects() {
|
||||
List<String> events = new ArrayList<>();
|
||||
page.addListener(REQUEST, event -> {
|
||||
Request request = (Request) event.data();
|
||||
events.add(request.method() + " " + request.url());
|
||||
});
|
||||
page.addListener(RESPONSE,event -> {
|
||||
Response response = (Response) event.data();
|
||||
events.add(response.status() + " " + response.url());
|
||||
});
|
||||
page.addListener(REQUESTFINISHED, event -> {
|
||||
Request request = (Request) event.data();
|
||||
events.add("DONE " + request.url());
|
||||
});
|
||||
page.addListener(REQUESTFAILED, event -> {
|
||||
Request request = (Request) event.data();
|
||||
events.add("FAIL " + request.url());
|
||||
});
|
||||
server.setRedirect("/foo.html", "/empty.html");
|
||||
String FOO_URL = server.PREFIX + "/foo.html";
|
||||
Response response = page.navigate(FOO_URL);
|
||||
response.finished();
|
||||
assertEquals(asList(
|
||||
"GET " + FOO_URL,
|
||||
"302 " + FOO_URL,
|
||||
"DONE " + FOO_URL,
|
||||
"GET " + server.EMPTY_PAGE,
|
||||
"200 " + server.EMPTY_PAGE,
|
||||
"DONE " + server.EMPTY_PAGE), events);
|
||||
Request redirectedFrom = response.request().redirectedFrom();
|
||||
assertTrue(redirectedFrom.url().contains("/foo.html"));
|
||||
assertNull(redirectedFrom.redirectedFrom());
|
||||
assertEquals(response.request(), redirectedFrom.redirectedTo());
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user