Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e48d88e33 | |||
| eceeea2070 |
@@ -90,7 +90,7 @@ extends:
|
||||
folderlocation: '$(Build.ArtifactStagingDirectory)/esrp-build'
|
||||
waitforreleasecompletion: true
|
||||
owners: 'yurys@microsoft.com'
|
||||
approvers: 'yurys@microsoft.com'
|
||||
approvers: 'maxschmitt@microsoft.com'
|
||||
serviceendpointurl: 'https://api.esrp.microsoft.com'
|
||||
mainpublisher: 'Playwright'
|
||||
domaintenantid: '975f013f-7f24-47e8-a7d3-abc4752bf346'
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
environment: Docker
|
||||
if: github.repository == 'microsoft/playwright-java'
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Azure login
|
||||
uses: azure/login@v2
|
||||
with:
|
||||
@@ -26,5 +26,5 @@ jobs:
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: arm64
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- run: ./utils/docker/publish_docker.sh stable
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
browser: [chromium, firefox, webkit]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up JDK 1.8
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
@@ -65,7 +65,7 @@ jobs:
|
||||
browser-channel: msedge
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install Media Pack
|
||||
if: matrix.os == 'windows-latest'
|
||||
shell: powershell
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
browser: [chromium, firefox, webkit]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
flavor: [jammy, noble]
|
||||
runs-on: [ubuntu-24.04, ubuntu-24.04-arm]
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build Docker image
|
||||
run: |
|
||||
ARCH="${{ matrix.runs-on == 'ubuntu-24.04-arm' && 'arm64' || 'amd64' }}"
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
- name: Download drivers
|
||||
run: scripts/download_driver.sh
|
||||
- name: Regenerate APIs
|
||||
|
||||
@@ -10,9 +10,9 @@ Playwright is a Java library to automate [Chromium](https://www.chromium.org/Hom
|
||||
|
||||
| | Linux | macOS | Windows |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| Chromium <!-- GEN:chromium-version -->143.0.7499.4<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| Chromium <!-- GEN:chromium-version -->141.0.7390.37<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| WebKit <!-- GEN:webkit-version -->26.0<!-- GEN:stop --> | ✅ | ✅ | ✅ |
|
||||
| Firefox <!-- GEN:firefox-version -->144.0.2<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| Firefox <!-- GEN:firefox-version -->142.0.1<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver-bundle</artifactId>
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver</artifactId>
|
||||
|
||||
+2
-2
@@ -6,11 +6,11 @@
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>examples</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Playwright Client Examples</name>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<playwright.version>1.57.0</playwright.version>
|
||||
<playwright.version>1.56.0</playwright.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>playwright</artifactId>
|
||||
|
||||
@@ -78,12 +78,5 @@ public interface ConsoleMessage {
|
||||
* @since v1.8
|
||||
*/
|
||||
String type();
|
||||
/**
|
||||
* The web worker or service worker that produced this console message, if any. Note that console messages from web workers
|
||||
* also have non-null {@link com.microsoft.playwright.ConsoleMessage#page ConsoleMessage.page()}.
|
||||
*
|
||||
* @since v1.57
|
||||
*/
|
||||
Worker worker();
|
||||
}
|
||||
|
||||
|
||||
@@ -48,9 +48,6 @@ public interface Download {
|
||||
/**
|
||||
* Returns a readable stream for a successful download, or throws for a failed/canceled download.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you don't need a readable stream, it's usually simpler to read the file from disk after the download completed. See
|
||||
* {@link com.microsoft.playwright.Download#path Download.path()}.
|
||||
*
|
||||
* @since v1.8
|
||||
*/
|
||||
InputStream createReadStream();
|
||||
|
||||
@@ -170,12 +170,6 @@ public interface ElementHandle extends JSHandle {
|
||||
* element.
|
||||
*/
|
||||
public Position position;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -250,15 +244,6 @@ public interface ElementHandle extends JSHandle {
|
||||
this.position = position;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public ClickOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -308,12 +293,6 @@ public interface ElementHandle extends JSHandle {
|
||||
* element.
|
||||
*/
|
||||
public Position position;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -381,15 +360,6 @@ public interface ElementHandle extends JSHandle {
|
||||
this.position = position;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public DblclickOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
|
||||
@@ -563,11 +563,6 @@ public interface Frame {
|
||||
* specified, some visible point of the element is used.
|
||||
*/
|
||||
public Position sourcePosition;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* When true, the call requires selector to resolve to a single element. If given selector resolves to more than one
|
||||
* element, the call throws an exception.
|
||||
@@ -622,14 +617,6 @@ public interface Frame {
|
||||
this.sourcePosition = sourcePosition;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public DragAndDropOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* When true, the call requires selector to resolve to a single element. If given selector resolves to more than one
|
||||
* element, the call throws an exception.
|
||||
|
||||
@@ -245,12 +245,6 @@ public interface Locator {
|
||||
* element.
|
||||
*/
|
||||
public Position position;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -326,15 +320,6 @@ public interface Locator {
|
||||
this.position = position;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public ClickOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -385,12 +370,6 @@ public interface Locator {
|
||||
* element.
|
||||
*/
|
||||
public Position position;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -459,15 +438,6 @@ public interface Locator {
|
||||
this.position = position;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
*/
|
||||
public DblclickOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Maximum time in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The default
|
||||
* value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
@@ -524,11 +494,6 @@ public interface Locator {
|
||||
* specified, some visible point of the element is used.
|
||||
*/
|
||||
public Position sourcePosition;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* Drops on the target element at this point relative to the top-left corner of the element's padding box. If not
|
||||
* specified, some visible point of the element is used.
|
||||
@@ -578,14 +543,6 @@ public interface Locator {
|
||||
this.sourcePosition = sourcePosition;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public DragToOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Drops on the target element at this point relative to the top-left corner of the element's padding box. If not
|
||||
* specified, some visible point of the element is used.
|
||||
@@ -2659,23 +2616,6 @@ public interface Locator {
|
||||
* @since v1.53
|
||||
*/
|
||||
Locator describe(String description);
|
||||
/**
|
||||
* Returns locator description previously set with {@link com.microsoft.playwright.Locator#describe Locator.describe()}.
|
||||
* Returns {@code null} if no custom description has been set. Prefer {@code Locator.toString()} for a human-readable
|
||||
* representation, as it uses the description when available.
|
||||
*
|
||||
* <p> <strong>Usage</strong>
|
||||
* <pre>{@code
|
||||
* Locator button = page.getByRole(AriaRole.BUTTON).describe("Subscribe button");
|
||||
* System.out.println(button.description()); // "Subscribe button"
|
||||
*
|
||||
* Locator input = page.getByRole(AriaRole.TEXTBOX);
|
||||
* System.out.println(input.description()); // null
|
||||
* }</pre>
|
||||
*
|
||||
* @since v1.57
|
||||
*/
|
||||
String description();
|
||||
/**
|
||||
* Programmatically dispatch an event on the matching element.
|
||||
*
|
||||
|
||||
@@ -127,16 +127,12 @@ public interface Mouse {
|
||||
}
|
||||
class MoveOptions {
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
* Defaults to 1. Sends intermediate {@code mousemove} events.
|
||||
*/
|
||||
public Integer steps;
|
||||
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between Playwright's current
|
||||
* cursor position and the provided destination. When set to 1, emits a single {@code mousemove} event at the destination
|
||||
* location.
|
||||
* Defaults to 1. Sends intermediate {@code mousemove} events.
|
||||
*/
|
||||
public MoveOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
|
||||
@@ -860,11 +860,6 @@ public interface Page extends AutoCloseable {
|
||||
* specified, some visible point of the element is used.
|
||||
*/
|
||||
public Position sourcePosition;
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public Integer steps;
|
||||
/**
|
||||
* When true, the call requires selector to resolve to a single element. If given selector resolves to more than one
|
||||
* element, the call throws an exception.
|
||||
@@ -919,14 +914,6 @@ public interface Page extends AutoCloseable {
|
||||
this.sourcePosition = sourcePosition;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Defaults to 1. Sends {@code n} interpolated {@code mousemove} events to represent travel between the {@code mousedown}
|
||||
* and {@code mouseup} of the drag. When set to 1, emits a single {@code mousemove} event at the destination location.
|
||||
*/
|
||||
public DragAndDropOptions setSteps(int steps) {
|
||||
this.steps = steps;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* When true, the call requires selector to resolve to a single element. If given selector resolves to more than one
|
||||
* element, the call throws an exception.
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package com.microsoft.playwright;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* The Worker class represents a <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API">WebWorker</a>.
|
||||
@@ -45,16 +44,6 @@ public interface Worker {
|
||||
*/
|
||||
void offClose(Consumer<Worker> handler);
|
||||
|
||||
/**
|
||||
* Emitted when JavaScript within the worker calls one of console API methods, e.g. {@code console.log} or {@code
|
||||
* console.dir}.
|
||||
*/
|
||||
void onConsole(Consumer<ConsoleMessage> handler);
|
||||
/**
|
||||
* Removes handler that was previously added with {@link #onConsole onConsole(handler)}.
|
||||
*/
|
||||
void offConsole(Consumer<ConsoleMessage> handler);
|
||||
|
||||
class WaitForCloseOptions {
|
||||
/**
|
||||
* Maximum time to wait for in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The
|
||||
@@ -73,35 +62,6 @@ public interface Worker {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
class WaitForConsoleMessageOptions {
|
||||
/**
|
||||
* Receives the {@code ConsoleMessage} object and resolves to true when the waiting should resolve.
|
||||
*/
|
||||
public Predicate<ConsoleMessage> predicate;
|
||||
/**
|
||||
* Maximum time to wait for in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The
|
||||
* default value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
* BrowserContext.setDefaultTimeout()}.
|
||||
*/
|
||||
public Double timeout;
|
||||
|
||||
/**
|
||||
* Receives the {@code ConsoleMessage} object and resolves to true when the waiting should resolve.
|
||||
*/
|
||||
public WaitForConsoleMessageOptions setPredicate(Predicate<ConsoleMessage> predicate) {
|
||||
this.predicate = predicate;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Maximum time to wait for in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. The
|
||||
* default value can be changed by using the {@link com.microsoft.playwright.BrowserContext#setDefaultTimeout
|
||||
* BrowserContext.setDefaultTimeout()}.
|
||||
*/
|
||||
public WaitForConsoleMessageOptions setTimeout(double timeout) {
|
||||
this.timeout = timeout;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the return value of {@code expression}.
|
||||
*
|
||||
@@ -198,21 +158,5 @@ public interface Worker {
|
||||
* @since v1.10
|
||||
*/
|
||||
Worker waitForClose(WaitForCloseOptions options, Runnable callback);
|
||||
/**
|
||||
* Performs action and waits for a console message.
|
||||
*
|
||||
* @param callback Callback that performs the action triggering the event.
|
||||
* @since v1.57
|
||||
*/
|
||||
default ConsoleMessage waitForConsoleMessage(Runnable callback) {
|
||||
return waitForConsoleMessage(null, callback);
|
||||
}
|
||||
/**
|
||||
* Performs action and waits for a console message.
|
||||
*
|
||||
* @param callback Callback that performs the action triggering the event.
|
||||
* @since v1.57
|
||||
*/
|
||||
ConsoleMessage waitForConsoleMessage(WaitForConsoleMessageOptions options, Runnable callback);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
private final APIRequestContextImpl request;
|
||||
private final ClockImpl clock;
|
||||
final List<PageImpl> pages = new ArrayList<>();
|
||||
final List<PageImpl> backgroundPages = new ArrayList<>();
|
||||
|
||||
final Router routes = new Router();
|
||||
final WebSocketRouter webSocketRoutes = new WebSocketRouter();
|
||||
@@ -80,6 +81,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
}
|
||||
|
||||
enum EventType {
|
||||
BACKGROUNDPAGE,
|
||||
CLOSE,
|
||||
CONSOLE,
|
||||
DIALOG,
|
||||
@@ -131,10 +133,12 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
|
||||
@Override
|
||||
public void onBackgroundPage(Consumer<Page> handler) {
|
||||
listeners.add(EventType.BACKGROUNDPAGE, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void offBackgroundPage(Consumer<Page> handler) {
|
||||
listeners.remove(EventType.BACKGROUNDPAGE, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -336,7 +340,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
|
||||
@Override
|
||||
public List<Page> backgroundPages() {
|
||||
return Collections.emptyList();
|
||||
return new ArrayList<>(backgroundPages);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -715,6 +719,10 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
if (page.opener() != null && !page.opener().isClosed()) {
|
||||
page.opener().notifyPopup(page);
|
||||
}
|
||||
} else if ("backgroundPage".equals(event)) {
|
||||
PageImpl page = connection.getExistingObject(params.getAsJsonObject("page").get("guid").getAsString());
|
||||
backgroundPages.add(page);
|
||||
listeners.notify(EventType.BACKGROUNDPAGE, page);
|
||||
} else if ("bindingCall".equals(event)) {
|
||||
BindingCall bindingCall = connection.getExistingObject(params.getAsJsonObject("binding").get("guid").getAsString());
|
||||
BindingCallback binding = bindings.get(bindingCall.name());
|
||||
@@ -726,15 +734,8 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
if (params.has("page")) {
|
||||
page = connection.getExistingObject(params.getAsJsonObject("page").get("guid").getAsString());
|
||||
}
|
||||
WorkerImpl worker = null;
|
||||
if (params.has("worker")) {
|
||||
worker = connection.getExistingObject(params.getAsJsonObject("worker").get("guid").getAsString());
|
||||
}
|
||||
ConsoleMessageImpl message = new ConsoleMessageImpl(connection, params, page, worker);
|
||||
ConsoleMessageImpl message = new ConsoleMessageImpl(connection, params, page);
|
||||
listeners.notify(BrowserContextImpl.EventType.CONSOLE, message);
|
||||
if (worker != null) {
|
||||
worker.listeners.notify(WorkerImpl.EventType.CONSOLE, message);
|
||||
}
|
||||
if (page != null) {
|
||||
page.listeners.notify(PageImpl.EventType.CONSOLE, message);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.ConsoleMessage;
|
||||
import com.microsoft.playwright.JSHandle;
|
||||
import com.microsoft.playwright.Worker;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -28,13 +27,11 @@ import java.util.List;
|
||||
public class ConsoleMessageImpl implements ConsoleMessage {
|
||||
private final Connection connection;
|
||||
private final PageImpl page;
|
||||
private final WorkerImpl worker;
|
||||
private final JsonObject initializer;
|
||||
|
||||
public ConsoleMessageImpl(Connection connection, JsonObject initializer, PageImpl page, WorkerImpl worker) {
|
||||
public ConsoleMessageImpl(Connection connection, JsonObject initializer, PageImpl page) {
|
||||
this.connection = connection;
|
||||
this.page = page;
|
||||
this.worker = worker;
|
||||
this.initializer = initializer;
|
||||
}
|
||||
|
||||
@@ -42,11 +39,6 @@ public class ConsoleMessageImpl implements ConsoleMessage {
|
||||
return initializer.get("type").getAsString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Worker worker() {
|
||||
return worker;
|
||||
}
|
||||
|
||||
public String text() {
|
||||
return initializer.get("text").getAsString();
|
||||
}
|
||||
|
||||
@@ -229,18 +229,15 @@ public class FrameImpl extends ChannelOwner implements Frame {
|
||||
|
||||
@Override
|
||||
public void click(String selector, ClickOptions options) {
|
||||
clickImpl(selector, options, null);
|
||||
clickImpl(selector, options);
|
||||
}
|
||||
|
||||
void clickImpl(String selector, ClickOptions options, Integer steps) {
|
||||
void clickImpl(String selector, ClickOptions options) {
|
||||
if (options == null) {
|
||||
options = new ClickOptions();
|
||||
}
|
||||
JsonObject params = gson().toJsonTree(options).getAsJsonObject();
|
||||
params.addProperty("selector", selector);
|
||||
if (steps != null) {
|
||||
params.addProperty("steps", steps);
|
||||
}
|
||||
sendMessage("click", params, timeout(options.timeout));
|
||||
}
|
||||
|
||||
@@ -251,18 +248,11 @@ public class FrameImpl extends ChannelOwner implements Frame {
|
||||
|
||||
@Override
|
||||
public void dblclick(String selector, DblclickOptions options) {
|
||||
dblclickImpl(selector, options, null);
|
||||
}
|
||||
|
||||
void dblclickImpl(String selector, DblclickOptions options, Integer steps) {
|
||||
if (options == null) {
|
||||
options = new DblclickOptions();
|
||||
}
|
||||
JsonObject params = gson().toJsonTree(options).getAsJsonObject();
|
||||
params.addProperty("selector", selector);
|
||||
if (steps != null) {
|
||||
params.addProperty("steps", steps);
|
||||
}
|
||||
sendMessage("dblclick", params, timeout(options.timeout));
|
||||
}
|
||||
|
||||
@@ -450,19 +440,16 @@ public class FrameImpl extends ChannelOwner implements Frame {
|
||||
|
||||
@Override
|
||||
public void dragAndDrop(String source, String target, DragAndDropOptions options) {
|
||||
dragAndDropImpl(source, target, options, null);
|
||||
dragAndDropImpl(source, target, options);
|
||||
}
|
||||
|
||||
void dragAndDropImpl(String source, String target, DragAndDropOptions options, Integer steps) {
|
||||
void dragAndDropImpl(String source, String target, DragAndDropOptions options) {
|
||||
if (options == null) {
|
||||
options = new DragAndDropOptions();
|
||||
}
|
||||
JsonObject params = gson().toJsonTree(options).getAsJsonObject();
|
||||
params.addProperty("source", source);
|
||||
params.addProperty("target", target);
|
||||
if (steps != null) {
|
||||
params.addProperty("steps", steps);
|
||||
}
|
||||
sendMessage("dragAndDrop", params, timeout(options.timeout));
|
||||
}
|
||||
|
||||
@@ -640,7 +627,7 @@ public class FrameImpl extends ChannelOwner implements Frame {
|
||||
params.addProperty("key", key);
|
||||
sendMessage("press", params, timeout(options.timeout));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<String> selectOption(String selector, SelectOption[] values, SelectOptionOptions options) {
|
||||
return selectOptionImpl(selector, values, options);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.*;
|
||||
import com.microsoft.playwright.options.*;
|
||||
@@ -24,7 +25,6 @@ import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.microsoft.playwright.impl.LocatorUtils.*;
|
||||
@@ -161,7 +161,7 @@ class LocatorImpl implements Locator {
|
||||
if (options == null) {
|
||||
options = new ClickOptions();
|
||||
}
|
||||
frame.clickImpl(selector, convertType(options, Frame.ClickOptions.class).setStrict(true), options.steps);
|
||||
frame.click(selector, convertType(options, Frame.ClickOptions.class).setStrict(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -174,33 +174,12 @@ class LocatorImpl implements Locator {
|
||||
return locator(describeSelector(description));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
// Match internal:describe= at the end of the selector with a JSON string
|
||||
// Pattern matches: >> internal:describe="..." where ... is a JSON-encoded string
|
||||
Pattern pattern = Pattern.compile(" >> internal:describe=(\"(?:[^\"\\\\]|\\\\.)*\")$");
|
||||
Matcher matcher = pattern.matcher(selector);
|
||||
|
||||
if (matcher.find()) {
|
||||
String jsonString = matcher.group(1);
|
||||
try {
|
||||
// Deserialize the JSON string
|
||||
return gson().fromJson(jsonString, String.class);
|
||||
} catch (Exception e) {
|
||||
// If we can't parse it, return null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dblclick(DblclickOptions options) {
|
||||
if (options == null) {
|
||||
options = new DblclickOptions();
|
||||
}
|
||||
frame.dblclickImpl(selector, convertType(options, Frame.DblclickOptions.class).setStrict(true), options.steps);
|
||||
frame.dblclick(selector, convertType(options, Frame.DblclickOptions.class).setStrict(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -218,7 +197,7 @@ class LocatorImpl implements Locator {
|
||||
}
|
||||
Frame.DragAndDropOptions frameOptions = convertType(options, Frame.DragAndDropOptions.class);
|
||||
frameOptions.setStrict(true);
|
||||
frame.dragAndDropImpl(selector, ((LocatorImpl) target).selector, frameOptions, options.steps);
|
||||
frame.dragAndDrop(selector, ((LocatorImpl) target).selector, frameOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -648,10 +627,6 @@ class LocatorImpl implements Locator {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String description = description();
|
||||
if (description != null) {
|
||||
return description;
|
||||
}
|
||||
return "Locator@" + selector;
|
||||
}
|
||||
|
||||
|
||||
@@ -237,6 +237,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
void didClose() {
|
||||
isClosed = true;
|
||||
browserContext.pages.remove(this);
|
||||
browserContext.backgroundPages.remove(this);
|
||||
listeners.notify(EventType.CLOSE, this);
|
||||
}
|
||||
|
||||
@@ -688,7 +689,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
|
||||
@Override
|
||||
public void click(String selector, ClickOptions options) {
|
||||
mainFrame.clickImpl(selector, convertType(options, Frame.ClickOptions.class), null);
|
||||
mainFrame.clickImpl(selector, convertType(options, Frame.ClickOptions.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -703,7 +704,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
|
||||
@Override
|
||||
public void dblclick(String selector, DblclickOptions options) {
|
||||
mainFrame.dblclickImpl(selector, convertType(options, Frame.DblclickOptions.class), null);
|
||||
mainFrame.dblclick(selector, convertType(options, Frame.DblclickOptions.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -936,10 +937,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
|
||||
@Override
|
||||
public void dragAndDrop(String source, String target, DragAndDropOptions options) {
|
||||
if (options == null) {
|
||||
options = new DragAndDropOptions();
|
||||
}
|
||||
mainFrame.dragAndDropImpl(source, target, convertType(options, Frame.DragAndDropOptions.class), options.steps);
|
||||
mainFrame.dragAndDropImpl(source, target, convertType(options, Frame.DragAndDropOptions.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1003,7 +1001,7 @@ public class PageImpl extends ChannelOwner implements Page {
|
||||
JsonArray messages = json.getAsJsonArray("messages");
|
||||
List<ConsoleMessage> result = new ArrayList<>();
|
||||
for (JsonElement item : messages) {
|
||||
result.add(new ConsoleMessageImpl(connection, item.getAsJsonObject(), this, null));
|
||||
result.add(new ConsoleMessageImpl(connection, item.getAsJsonObject(), this));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -18,25 +18,21 @@ package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.ConsoleMessage;
|
||||
import com.microsoft.playwright.JSHandle;
|
||||
import com.microsoft.playwright.Page;
|
||||
import com.microsoft.playwright.Worker;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import static com.microsoft.playwright.impl.Serialization.*;
|
||||
|
||||
class WorkerImpl extends ChannelOwner implements Worker {
|
||||
final ListenerCollection<EventType> listeners = new ListenerCollection<>();
|
||||
private final ListenerCollection<EventType> listeners = new ListenerCollection<>();
|
||||
PageImpl page;
|
||||
|
||||
enum EventType {
|
||||
CLOSE,
|
||||
CONSOLE,
|
||||
}
|
||||
|
||||
WorkerImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
@@ -53,19 +49,9 @@ class WorkerImpl extends ChannelOwner implements Worker {
|
||||
listeners.remove(EventType.CLOSE, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConsole(Consumer<ConsoleMessage> handler) {
|
||||
listeners.add(EventType.CONSOLE, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void offConsole(Consumer<ConsoleMessage> handler) {
|
||||
listeners.remove(EventType.CONSOLE, handler);
|
||||
}
|
||||
|
||||
private <T> T waitForEventWithTimeout(EventType eventType, Runnable code, Predicate<T> predicate, Double timeout) {
|
||||
private <T> T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) {
|
||||
List<Waitable<T>> waitables = new ArrayList<>();
|
||||
waitables.add(new WaitableEvent<>(listeners, eventType, predicate));
|
||||
waitables.add(new WaitableEvent<>(listeners, eventType));
|
||||
waitables.add(page.createWaitForCloseHelper());
|
||||
waitables.add(page.createWaitableTimeout(timeout));
|
||||
return runUntil(code, new WaitableRace<>(waitables));
|
||||
@@ -76,23 +62,11 @@ class WorkerImpl extends ChannelOwner implements Worker {
|
||||
return withWaitLogging("Worker.waitForClose", logger -> waitForCloseImpl(options, code));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConsoleMessage waitForConsoleMessage(WaitForConsoleMessageOptions options, Runnable code) {
|
||||
return withWaitLogging("Worker.waitForConsoleMessage", logger -> waitForConsoleMessageImpl(options, code));
|
||||
}
|
||||
|
||||
private ConsoleMessage waitForConsoleMessageImpl(WaitForConsoleMessageOptions options, Runnable code) {
|
||||
if (options == null) {
|
||||
options = new WaitForConsoleMessageOptions();
|
||||
}
|
||||
return waitForEventWithTimeout(EventType.CONSOLE, code, options.predicate, options.timeout);
|
||||
}
|
||||
|
||||
private Worker waitForCloseImpl(WaitForCloseOptions options, Runnable code) {
|
||||
if (options == null) {
|
||||
options = new WaitForCloseOptions();
|
||||
}
|
||||
return waitForEventWithTimeout(EventType.CLOSE, code, null, options.timeout);
|
||||
return waitForEventWithTimeout(EventType.CLOSE, code, options.timeout);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -36,7 +36,7 @@ public class PlaywrightExtension implements ParameterResolver {
|
||||
// There should be at most one instance of PlaywrightRegistry per test run, it keeps
|
||||
// track of all created Playwright instances and calls `close()` on each of them after
|
||||
// the tests finished.
|
||||
static class PlaywrightRegistry implements AutoCloseable {
|
||||
static class PlaywrightRegistry implements ExtensionContext.Store.CloseableResource {
|
||||
private final List<Playwright> playwrightList = Collections.synchronizedList(new ArrayList<>());
|
||||
|
||||
static synchronized PlaywrightRegistry getOrCreateFor(ExtensionContext extensionContext) {
|
||||
@@ -59,7 +59,7 @@ public class PlaywrightExtension implements ParameterResolver {
|
||||
// This is a workaround for JUnit's lack of an "AfterTestRun" hook
|
||||
// This will be called once after all tests have completed.
|
||||
@Override
|
||||
public void close() {
|
||||
public void close() throws Throwable {
|
||||
for (Playwright playwright : playwrightList) {
|
||||
playwright.close();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ package com.microsoft.playwright.junit;
|
||||
* public Options getOptions() {
|
||||
* return new Options()
|
||||
* .setHeadless(false)
|
||||
* .setContextOptions(new Browser.NewContextOptions()
|
||||
* .setContextOption(new Browser.NewContextOptions()
|
||||
* .setBaseURL("https://github.com"))
|
||||
* .setApiRequestOptions(new APIRequest.NewContextOptions()
|
||||
* .setBaseURL("https://playwright.dev"));
|
||||
|
||||
@@ -20,16 +20,16 @@ public class Cookie {
|
||||
public String name;
|
||||
public String value;
|
||||
/**
|
||||
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* Either url or domain / path are required. Optional.
|
||||
*/
|
||||
public String url;
|
||||
/**
|
||||
* For the cookie to apply to all subdomains as well, prefix domain with a dot, like this: ".example.com". Either {@code
|
||||
* url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* For the cookie to apply to all subdomains as well, prefix domain with a dot, like this: ".example.com". Either url or
|
||||
* domain / path are required. Optional.
|
||||
*/
|
||||
public String domain;
|
||||
/**
|
||||
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* Either url or domain / path are required Optional.
|
||||
*/
|
||||
public String path;
|
||||
/**
|
||||
@@ -60,22 +60,22 @@ public class Cookie {
|
||||
this.value = value;
|
||||
}
|
||||
/**
|
||||
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* Either url or domain / path are required. Optional.
|
||||
*/
|
||||
public Cookie setUrl(String url) {
|
||||
this.url = url;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* For the cookie to apply to all subdomains as well, prefix domain with a dot, like this: ".example.com". Either {@code
|
||||
* url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* For the cookie to apply to all subdomains as well, prefix domain with a dot, like this: ".example.com". Either url or
|
||||
* domain / path are required. Optional.
|
||||
*/
|
||||
public Cookie setDomain(String domain) {
|
||||
this.domain = domain;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
|
||||
* Either url or domain / path are required Optional.
|
||||
*/
|
||||
public Cookie setPath(String path) {
|
||||
this.path = path;
|
||||
|
||||
@@ -65,41 +65,4 @@ public class TestLocatorClick extends TestBase {
|
||||
page.getByText("Go").click(new Locator.ClickOptions().setModifiers(asList(KeyboardModifier.CONTROLORMETA))));
|
||||
assertThat(newPage).hasURL(server.PREFIX + "/title.html");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldClickWithTweenedMouseMovement() {
|
||||
page.setContent(
|
||||
"<body style=\"margin: 0; padding: 0; height: 500px; width: 500px;\">\n" +
|
||||
" <div style=\"position: relative; top: 280px; left: 150px; width: 100px; height: 40px\">Click me</div>\n" +
|
||||
"</body>"
|
||||
);
|
||||
|
||||
// The test becomes flaky on WebKit without next line.
|
||||
if (isWebKit()) {
|
||||
page.evaluate("() => new Promise(requestAnimationFrame)");
|
||||
}
|
||||
|
||||
page.mouse().move(100, 100);
|
||||
|
||||
page.evaluate("() => {\n" +
|
||||
" window['result'] = [];\n" +
|
||||
" document.addEventListener('mousemove', event => {\n" +
|
||||
" window['result'].push([event.clientX, event.clientY]);\n" +
|
||||
" });\n" +
|
||||
"}");
|
||||
|
||||
// Centerpoint at 150 + 100/2, 280 + 40/2 = 200, 300
|
||||
page.locator("div").click(new Locator.ClickOptions().setSteps(5));
|
||||
|
||||
assertEquals(
|
||||
asList(
|
||||
asList(120, 140),
|
||||
asList(140, 180),
|
||||
asList(160, 220),
|
||||
asList(180, 260),
|
||||
asList(200, 300)
|
||||
),
|
||||
page.evaluate("result")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,53 +186,4 @@ public class TestLocatorConvenience extends TestBase {
|
||||
page.setContent("<div>A</div><div>B</div><div>C</div>");
|
||||
assertEquals(asList("A", "B", "C"), page.locator("div").allInnerTexts());
|
||||
}
|
||||
|
||||
@Test
|
||||
void descriptionShouldReturnNullForUndescribedLocators() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div");
|
||||
assertNull(locator.description());
|
||||
}
|
||||
|
||||
@Test
|
||||
void descriptionShouldReturnSimpleDescription() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div").describe("my div");
|
||||
assertEquals("my div", locator.description());
|
||||
}
|
||||
|
||||
@Test
|
||||
void descriptionShouldHandleSpecialCharacters() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div").describe("título 😊");
|
||||
assertEquals("título 😊", locator.description());
|
||||
}
|
||||
|
||||
@Test
|
||||
void descriptionShouldWorkWithChainedLocators() {
|
||||
page.setContent("<div><span>Hello</span></div>");
|
||||
Locator locator = page.locator("div").describe("container").locator("span");
|
||||
assertNull(locator.description());
|
||||
}
|
||||
|
||||
@Test
|
||||
void descriptionShouldReturnLastDescriptionForMultipleCalls() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div").describe("first").describe("second");
|
||||
assertEquals("second", locator.description());
|
||||
}
|
||||
|
||||
@Test
|
||||
void toStringShouldReturnFormattedLocator() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div");
|
||||
assertTrue(locator.toString().startsWith("Locator@"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void toStringShouldPreferDescription() {
|
||||
page.setContent("<div>Hello</div>");
|
||||
Locator locator = page.locator("div").describe("my div");
|
||||
assertEquals("my div", locator.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,94 +124,4 @@ public class TestPageDrag extends TestBase {
|
||||
page.locator("#source").dragTo(page.locator("#target"));
|
||||
assertEquals(true, page.evalOnSelector("#target", "target => target.contains(document.querySelector('#source'))"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldDragAndDropWithTweenedMouseMovement() {
|
||||
page.setContent(
|
||||
"<body style='margin: 0; padding: 0;'>\n" +
|
||||
" <div style='width:100px;height:100px;background:red;' id='red'></div>\n" +
|
||||
" <div style='width:300px;height:100px;background:blue;' id='blue'></div>\n" +
|
||||
"</body>"
|
||||
);
|
||||
|
||||
JSHandle eventsHandle = page.evaluateHandle("() => {\n" +
|
||||
" const events = [];\n" +
|
||||
" document.addEventListener('mousedown', event => {\n" +
|
||||
" events.push({ type: 'mousedown', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" document.addEventListener('mouseup', event => {\n" +
|
||||
" events.push({ type: 'mouseup', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" document.addEventListener('mousemove', event => {\n" +
|
||||
" events.push({ type: 'mousemove', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" return events;\n" +
|
||||
"}");
|
||||
|
||||
// Red div center is at (50, 50), blue div center is at (150, 50)
|
||||
// With 4 steps, we expect intermediate positions at (75, 50), (100, 50), (125, 50)
|
||||
page.dragAndDrop("#red", "#blue", new Page.DragAndDropOptions().setSteps(4));
|
||||
|
||||
Object json = eventsHandle.jsonValue();
|
||||
// Expected sequence: mousemove to (50,50), mousedown at (50,50),
|
||||
// then 3 mousemove events at (75,50), (100,50), (125,50),
|
||||
// and mouseup at (150,50)
|
||||
assertJsonEquals(
|
||||
"[" +
|
||||
"{type: \"mousemove\", x: 50, y: 50}," +
|
||||
"{type: \"mousedown\", x: 50, y: 50}," +
|
||||
"{type: \"mousemove\", x: 75, y: 75}," +
|
||||
"{type: \"mousemove\", x: 100, y: 100}," +
|
||||
"{type: \"mousemove\", x: 125, y: 125}," +
|
||||
"{type: \"mousemove\", x: 150, y: 150}," +
|
||||
"{type: \"mouseup\", x: 150, y: 150}" +
|
||||
"]",
|
||||
json
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldDragToWithTweenedMouseMovement() {
|
||||
page.setContent(
|
||||
"<body style='margin: 0; padding: 0;'>\n" +
|
||||
" <div style='width:100px;height:100px;background:red;' id='red'></div>\n" +
|
||||
" <div style='width:300px;height:100px;background:blue;' id='blue'></div>\n" +
|
||||
"</body>"
|
||||
);
|
||||
|
||||
JSHandle eventsHandle = page.evaluateHandle("() => {\n" +
|
||||
" const events = [];\n" +
|
||||
" document.addEventListener('mousedown', event => {\n" +
|
||||
" events.push({ type: 'mousedown', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" document.addEventListener('mouseup', event => {\n" +
|
||||
" events.push({ type: 'mouseup', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" document.addEventListener('mousemove', event => {\n" +
|
||||
" events.push({ type: 'mousemove', x: event.pageX, y: event.pageY });\n" +
|
||||
" });\n" +
|
||||
" return events;\n" +
|
||||
"}");
|
||||
|
||||
// Red div center is at (50, 50), blue div center is at (150, 50)
|
||||
// With 4 steps, we expect intermediate positions at (75, 50), (100, 50), (125, 50)
|
||||
page.locator("#red").dragTo(page.locator("#blue"), new Locator.DragToOptions().setSteps(4));
|
||||
|
||||
Object json = eventsHandle.jsonValue();
|
||||
// Expected sequence: mousemove to (50,50), mousedown at (50,50),
|
||||
// then 3 mousemove events at (75,50), (100,50), (125,50),
|
||||
// and mouseup at (150,50)
|
||||
assertJsonEquals(
|
||||
"[" +
|
||||
"{type: \"mousemove\", x: 50, y: 50}," +
|
||||
"{type: \"mousedown\", x: 50, y: 50}," +
|
||||
"{type: \"mousemove\", x: 75, y: 75}," +
|
||||
"{type: \"mousemove\", x: 100, y: 100}," +
|
||||
"{type: \"mousemove\", x: 125, y: 125}," +
|
||||
"{type: \"mousemove\", x: 150, y: 150}," +
|
||||
"{type: \"mouseup\", x: 150, y: 150}" +
|
||||
"]",
|
||||
json
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,16 +161,6 @@ public class TestPageInterception extends TestBase {
|
||||
assertFalse(globToRegex("http://localhost:3000/signin-oidc*").matcher("http://localhost:3000/signin-oidc/foo").find());
|
||||
assertTrue(globToRegex("http://localhost:3000/signin-oidc*").matcher("http://localhost:3000/signin-oidcnice").find());
|
||||
|
||||
assertTrue(globToRegex("**/*.js").matcher("/foo.js").find());
|
||||
assertFalse(globToRegex("asd/**.js").matcher("/foo.js").find());
|
||||
assertFalse(globToRegex("**/*.js").matcher("bar_foo.js").find());
|
||||
|
||||
// custom protocols
|
||||
assertTrue(globToRegex("my.custom.protocol://**").matcher("my.custom.protocol://foo").find());
|
||||
assertFalse(globToRegex("my.{p,y}://**").matcher("my.p://foo").find());
|
||||
assertTrue(globToRegex("my.{p,y}://**").matcher("my.p://foo/").find());
|
||||
assertTrue(globToRegex("f*e://**").matcher("file:///foo/").find());
|
||||
|
||||
// range [] is NOT supported
|
||||
assertTrue(globToRegex("**/api/v[0-9]").matcher("http://example.com/api/v[0-9]").find());
|
||||
assertFalse(globToRegex("**/api/v[0-9]").matcher("http://example.com/api/version").find());
|
||||
@@ -196,10 +186,6 @@ public class TestPageInterception extends TestBase {
|
||||
assertTrue(urlMatches("http://playwright.dev", "http://playwright.dev/?x=y", "?x=y"));
|
||||
assertTrue(urlMatches("http://playwright.dev/foo/", "http://playwright.dev/foo/bar?x=y", "./bar?x=y"));
|
||||
|
||||
// /**/ should match /.
|
||||
assertTrue(urlMatches(null, "https://foo/bar.js", "https://foo/**/bar.js"));
|
||||
assertTrue(urlMatches(null, "https://foo/bar.js", "https://foo/**/**/bar.js"));
|
||||
|
||||
// Case insensitive matching
|
||||
assertTrue(urlMatches(null, "https://playwright.dev/fooBAR", "HtTpS://pLaYwRiGhT.dEv/fooBAR"));
|
||||
assertTrue(urlMatches("http://ignored", "https://playwright.dev/fooBAR", "HtTpS://pLaYwRiGhT.dEv/fooBAR"));
|
||||
|
||||
@@ -196,26 +196,5 @@ public class TestWorkers extends TestBase {
|
||||
assertEquals("10\u00A0000,2", worker.evaluate("() => (10000.20).toLocaleString()"));
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldReportConsoleEventOnTheWorker() {
|
||||
Worker worker = page.waitForWorker(() -> page.evaluate(
|
||||
"() => { window.worker = new Worker(URL.createObjectURL(new Blob(['42'], {type: 'application/javascript'}))); }"
|
||||
));
|
||||
|
||||
ConsoleMessage[] message2 = {null};
|
||||
ConsoleMessage[] message3 = {null};
|
||||
|
||||
page.onConsoleMessage(msg -> message2[0] = msg);
|
||||
page.context().onConsoleMessage(msg -> message3[0] = msg);
|
||||
|
||||
ConsoleMessage message1 = worker.waitForConsoleMessage(() -> {
|
||||
worker.evaluate("() => console.log('hello from worker')");
|
||||
});
|
||||
|
||||
assertEquals("hello from worker", message1.text());
|
||||
assertSame(message1, message2[0]);
|
||||
assertSame(message1, message3[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -39,8 +39,7 @@ public class TestFixtureDeviceOption {
|
||||
public void testPredefinedDeviceParameters(Server server, Page page) {
|
||||
page.navigate(server.EMPTY_PAGE);
|
||||
assertEquals("webkit", page.context().browser().browserType().name());
|
||||
// TODO: failing since 1.57 roll.
|
||||
// assertEquals(3, page.evaluate("window.devicePixelRatio"));
|
||||
assertEquals(3, page.evaluate("window.devicePixelRatio"));
|
||||
assertEquals(980, page.evaluate("window.innerWidth"));
|
||||
assertEquals(1668, page.evaluate("window.innerHeight"));
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Playwright Parent Project</name>
|
||||
<description>Java library to automate Chromium, Firefox and WebKit with a single API.
|
||||
@@ -45,7 +45,7 @@
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<maven.compiler.parameters>true</maven.compiler.parameters>
|
||||
<gson.version>2.13.2</gson.version>
|
||||
<junit.version>5.14.1</junit.version>
|
||||
<junit.version>5.13.4</junit.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<websocket.version>1.6.0</websocket.version>
|
||||
<slf4j.version>2.0.17</slf4j.version>
|
||||
@@ -123,7 +123,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>3.4.0</version>
|
||||
<version>3.3.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@@ -143,7 +143,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.4.0</version>
|
||||
<version>3.3.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@@ -186,7 +186,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.5.0</version>
|
||||
<version>3.4.2</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.57.0-beta-1764692940000
|
||||
1.56.1
|
||||
|
||||
@@ -39,7 +39,7 @@ do
|
||||
cd $PLATFORM
|
||||
echo "Downloading driver for $PLATFORM to $(pwd)"
|
||||
|
||||
URL=https://cdn.playwright.dev/builds/driver
|
||||
URL=https://playwright.azureedge.net/builds/driver
|
||||
if [[ "$DRIVER_VERSION" == *-alpha* || "$DRIVER_VERSION" == *-beta* || "$DRIVER_VERSION" == *-next* ]]; then
|
||||
URL=$URL/next
|
||||
fi
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>api-generator</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Playwright - API Generator</name>
|
||||
<description>
|
||||
This is an internal module used to generate Java API from the upstream Playwright
|
||||
|
||||
@@ -1011,7 +1011,7 @@ class Interface extends TypeDefinition {
|
||||
output.add("import java.util.function.BooleanSupplier;");
|
||||
}
|
||||
|
||||
if (asList("Page", "Frame", "BrowserContext", "WebSocket", "Worker").contains(jsonName)) {
|
||||
if (asList("Page", "Frame", "BrowserContext", "WebSocket").contains(jsonName)) {
|
||||
output.add("import java.util.function.Predicate;");
|
||||
}
|
||||
if (asList("Page", "Frame", "FrameLocator", "Locator", "Browser", "BrowserType", "BrowserContext", "PageAssertions", "LocatorAssertions").contains(jsonName)) {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-cli-fatjar</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Test Playwright Command Line FatJar</name>
|
||||
<properties>
|
||||
<compiler.version>1.8</compiler.version>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-cli-version</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Test Playwright Command Line Version</name>
|
||||
<properties>
|
||||
<compiler.version>1.8</compiler.version>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-local-installation</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Test local installation</name>
|
||||
<description>Runs Playwright test suite (copied from playwright module) against locally cached Playwright</description>
|
||||
<properties>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-spring-boot-starter</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Test Playwright With Spring Boot</name>
|
||||
<properties>
|
||||
<spring.version>2.4.3</spring.version>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>update-version</artifactId>
|
||||
<version>1.57.0</version>
|
||||
<version>1.56.0</version>
|
||||
<name>Playwright - Update Version in Documentation</name>
|
||||
<description>
|
||||
This is an internal module used to update versions in the documentation based on
|
||||
|
||||
Reference in New Issue
Block a user