1
0
mirror of synced 2026-05-22 18:53:15 +00:00

feat: frame navigation

This commit is contained in:
Yury Semikhatsky
2020-10-05 22:43:24 -07:00
parent 5c62fb63f8
commit c902cb44ca
5 changed files with 137 additions and 22 deletions
@@ -29,12 +29,23 @@ import static com.microsoft.playwright.impl.Serialization.serializeArgument;
import static com.microsoft.playwright.impl.Utils.isFunctionBody;
public class FrameImpl extends ChannelOwner implements Frame {
PageImpl page;
private String name;
private String url;
FrameImpl parentFrame;
Set<FrameImpl> childFrames = new LinkedHashSet<>();
private final Set<LoadState> loadStates = new HashSet<>();
PageImpl page;
boolean isDetached;
FrameImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
super(parent, type, guid, initializer);
name = initializer.get("name").getAsString();
url = initializer.get("url").getAsString();
if (initializer.has("parentFrame")) {
parentFrame = connection.getExistingObject(initializer.getAsJsonObject("parentFrame").get("guid").getAsString());
parentFrame.childFrames.add(this);
}
for (JsonElement item : initializer.get("loadStates").getAsJsonArray()) {
loadStates.add(loadStateFromProtocol(item.getAsString()));
}
@@ -240,22 +251,22 @@ public class FrameImpl extends ChannelOwner implements Frame {
@Override
public boolean isDetached() {
return false;
return isDetached;
}
@Override
public String name() {
return null;
return name;
}
@Override
public Page page() {
return null;
return page;
}
@Override
public Frame parentFrame() {
return null;
return parentFrame;
}
@Override
@@ -321,7 +332,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
@Override
public String url() {
return null;
return url;
}
@Override
@@ -365,6 +376,9 @@ public class FrameImpl extends ChannelOwner implements Frame {
if (remove != null) {
loadStates.remove(loadStateFromProtocol(remove.getAsString()));
}
} else if ("navigated".equals(event)) {
url = params.get("url").getAsString();
name = params.get("name").getAsString();
}
}
@@ -20,10 +20,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.microsoft.playwright.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
@@ -35,6 +32,8 @@ public class PageImpl extends ChannelOwner implements Page {
private final FrameImpl mainFrame;
private final KeyboardImpl keyboard;
private final MouseImpl mouse;
// TODO: do not rely on the frame order in the tests
private final Set<FrameImpl> frames = new LinkedHashSet<>();
private final List<Listener<ConsoleMessage>> consoleListeners = new ArrayList<>();
private final List<Listener<Dialog>> dialogListeners = new ArrayList<>();
final Map<String, Binding> bindings = new HashMap<String, Binding>();
@@ -47,6 +46,7 @@ public class PageImpl extends ChannelOwner implements Page {
mainFrame.page = this;
keyboard = new KeyboardImpl(this);
mouse = new MouseImpl(this);
frames.add(mainFrame);
}
@Override
@@ -96,6 +96,22 @@ public class PageImpl extends ChannelOwner implements Page {
for (Listener<ConsoleMessage> listener: new ArrayList<>(consoleListeners)) {
listener.handle(message);
}
} else if ("frameAttached".equals(event)) {
String guid = params.getAsJsonObject("frame").get("guid").getAsString();
FrameImpl frame = connection.getExistingObject(guid);
frames.add(frame);
frame.page = this;
if (frame.parentFrame != null) {
frame.parentFrame.childFrames.add(frame);
}
} else if ("'frameDetached'".equals(event)) {
String guid = params.getAsJsonObject("frame").get("guid").getAsString();
FrameImpl frame = connection.getExistingObject(guid);
frames.remove(frame);
frame.isDetached = true;
if (frame.parentFrame != null) {
frame.parentFrame.childFrames.remove(frame);
}
}
}
@@ -240,7 +256,7 @@ public class PageImpl extends ChannelOwner implements Page {
@Override
public List<Frame> frames() {
return null;
return new ArrayList<>(frames);
}
@Override
@@ -24,8 +24,15 @@ import com.microsoft.playwright.Response;
import java.util.Map;
public class RequestImpl extends ChannelOwner implements Request {
private RequestImpl redirectedFrom;
private RequestImpl redirectedTo;
RequestImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
super(parent, type, guid, initializer);
if (initializer.has("redirectedFrom")) {
redirectedFrom = connection.getExistingObject(initializer.getAsJsonObject("redirectedFrom").get("guid").getAsString());
redirectedFrom.redirectedTo = this;
}
}
@Override
@@ -35,7 +42,7 @@ public class RequestImpl extends ChannelOwner implements Request {
@Override
public Frame frame() {
return null;
return connection.getExistingObject(initializer.getAsJsonObject("frame").get("guid").getAsString());
}
@Override
@@ -45,7 +52,7 @@ public class RequestImpl extends ChannelOwner implements Request {
@Override
public boolean isNavigationRequest() {
return false;
return initializer.get("isNavigationRequest").getAsBoolean();
}
@Override
@@ -70,12 +77,12 @@ public class RequestImpl extends ChannelOwner implements Request {
@Override
public Request redirectedFrom() {
return null;
return redirectedFrom;
}
@Override
public Request redirectedTo() {
return null;
return redirectedTo;
}
@Override
@@ -85,7 +92,11 @@ public class RequestImpl extends ChannelOwner implements Request {
@Override
public Response response() {
return null;
JsonObject result = sendMessage("response", new JsonObject()).getAsJsonObject();
if (!result.has("response")) {
return null;
}
return connection.getExistingObject(result.getAsJsonObject("response").get("guid").getAsString());
}
@Override
@@ -40,7 +40,7 @@ public class ResponseImpl extends ChannelOwner implements Response {
@Override
public Frame frame() {
return null;
return request().frame();
}
@Override
@@ -55,22 +55,22 @@ public class ResponseImpl extends ChannelOwner implements Response {
@Override
public boolean ok() {
return false;
return status() == 0 || (status() >= 200 && status() <= 299);
}
@Override
public Request request() {
return null;
return connection.getExistingObject(initializer.getAsJsonObject("request").get("guid").getAsString());
}
@Override
public int status() {
return 0;
return initializer.get("status").getAsInt();
}
@Override
public String statusText() {
return null;
return initializer.get("statusText").getAsString();
}
@Override
@@ -80,6 +80,6 @@ public class ResponseImpl extends ChannelOwner implements Response {
@Override
public String url() {
return null;
return initializer.get("url").getAsString();
}
}
@@ -0,0 +1,74 @@
/**
* 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.*;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class TestFrameNavigate {
private static Server server;
private static Browser browser;
private BrowserContext context;
private Page page;
@BeforeAll
static void launchBrowser() {
Playwright playwright = Playwright.create();
BrowserType.LaunchOptions options = new BrowserType.LaunchOptions();
browser = playwright.chromium().launch(options);
}
@BeforeAll
static void startServer() throws IOException {
server = new Server(8907);
}
@AfterAll
static void stopServer() throws IOException {
browser.close();
server.stop();
server = null;
}
@BeforeEach
void setUp() {
context = browser.newContext();
page = context.newPage();
}
@AfterEach
void tearDown() {
context.close();
context = null;
page = null;
}
@Test
void should_navigate_subframes() {
page.navigate(server.PREFIX + "/frames/one-frame.html");
assertTrue(page.frames().get(0).url().contains("/frames/one-frame.html"));
assertTrue(page.frames().get(1).url().contains("/frames/frame.html"));
Response response = page.frames().get(1).navigate(server.EMPTY_PAGE);
assertTrue(response.ok());
assertEquals(page.frames().get(1), response.frame());
}
}