1
0
mirror of synced 2026-05-23 11:13:15 +00:00

Compare commits

...

10 Commits

Author SHA1 Message Date
Yury Semikhatsky f0c034da7d chore: mark 1.57.0 (#1872) 2025-12-04 10:41:23 -08:00
Yury Semikhatsky 63bb008857 chore: roll driver to 1.57.0-beta-1764692940000 (#1870) 2025-12-02 13:59:36 -08:00
dependabot[bot] 9b3a788806 chore(deps): bump actions/checkout from 5 to 6 in the actions group (#1868) 2025-12-01 15:00:50 -08:00
dependabot[bot] 2f387edf0d chore(deps): bump the all group with 3 updates (#1867) 2025-12-01 14:59:52 -08:00
arukiidou 6eb30e275c chore(deps): bump junit.version from 5.13.4 to 5.14.1 (#1859) 2025-11-12 10:00:13 -08:00
arukiidou 0f14588df1 Migrate ExtensionContext.Store.CloseableResource to AutoCloseable (#1860) 2025-11-12 09:59:06 -08:00
arukiidou e417cad372 Fix document typo - setContextOptions (#1862) 2025-11-12 09:45:13 -08:00
Yury Semikhatsky 059667e311 chore: remove background pages implementation (#1861) 2025-10-31 10:25:35 -07:00
Yury Semikhatsky 98296d9cdf devops: update ado approver (#1857) 2025-10-24 13:38:05 -07:00
Yury Semikhatsky 1599e1c7bc chore: roll 1.56.1 (#1855) 2025-10-17 11:11:43 -07:00
45 changed files with 548 additions and 75 deletions
+1 -1
View File
@@ -90,7 +90,7 @@ extends:
folderlocation: '$(Build.ArtifactStagingDirectory)/esrp-build'
waitforreleasecompletion: true
owners: 'yurys@microsoft.com'
approvers: 'maxschmitt@microsoft.com'
approvers: 'yurys@microsoft.com'
serviceendpointurl: 'https://api.esrp.microsoft.com'
mainpublisher: 'Playwright'
domaintenantid: '975f013f-7f24-47e8-a7d3-abc4752bf346'
+2 -2
View File
@@ -13,7 +13,7 @@ jobs:
environment: Docker
if: github.repository == 'microsoft/playwright-java'
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- 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@v5
- uses: actions/checkout@v6
- run: ./utils/docker/publish_docker.sh stable
+3 -3
View File
@@ -20,7 +20,7 @@ jobs:
browser: [chromium, firefox, webkit]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- 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@v5
- uses: actions/checkout@v6
- 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@v5
- uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
+1 -1
View File
@@ -13,7 +13,7 @@ jobs:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Cache Maven packages
uses: actions/cache@v4
with:
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
flavor: [jammy, noble]
runs-on: [ubuntu-24.04, ubuntu-24.04-arm]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Build Docker image
run: |
ARCH="${{ matrix.runs-on == 'ubuntu-24.04-arm' && 'arm64' || 'amd64' }}"
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Download drivers
run: scripts/download_driver.sh
- name: Regenerate APIs
+2 -2
View File
@@ -10,9 +10,9 @@ Playwright is a Java library to automate [Chromium](https://www.chromium.org/Hom
| | Linux | macOS | Windows |
| :--- | :---: | :---: | :---: |
| Chromium <!-- GEN:chromium-version -->141.0.7390.37<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Chromium <!-- GEN:chromium-version -->143.0.7499.4<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| WebKit <!-- GEN:webkit-version -->26.0<!-- GEN:stop --> | ✅ | ✅ | ✅ |
| Firefox <!-- GEN:firefox-version -->142.0.1<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Firefox <!-- GEN:firefox-version -->144.0.2<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
## Documentation
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.microsoft.playwright</groupId>
<artifactId>parent-pom</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
</parent>
<artifactId>driver-bundle</artifactId>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>com.microsoft.playwright</groupId>
<artifactId>parent-pom</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
</parent>
<artifactId>driver</artifactId>
+2 -2
View File
@@ -6,11 +6,11 @@
<groupId>org.example</groupId>
<artifactId>examples</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Playwright Client Examples</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<playwright.version>1.56.0</playwright.version>
<playwright.version>1.57.0</playwright.version>
</properties>
<dependencies>
<dependency>
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>com.microsoft.playwright</groupId>
<artifactId>parent-pom</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
</parent>
<artifactId>playwright</artifactId>
@@ -856,6 +856,8 @@ public interface BrowserContext extends AutoCloseable {
* <li> {@code "clipboard-write"}</li>
* <li> {@code "geolocation"}</li>
* <li> {@code "gyroscope"}</li>
* <li> {@code "local-fonts"}</li>
* <li> {@code "local-network-access"}</li>
* <li> {@code "magnetometer"}</li>
* <li> {@code "microphone"}</li>
* <li> {@code "midi-sysex"} (system-exclusive midi)</li>
@@ -863,7 +865,6 @@ public interface BrowserContext extends AutoCloseable {
* <li> {@code "notifications"}</li>
* <li> {@code "payment-handler"}</li>
* <li> {@code "storage-access"}</li>
* <li> {@code "local-fonts"}</li>
* </ul>
* @since v1.8
*/
@@ -889,6 +890,8 @@ public interface BrowserContext extends AutoCloseable {
* <li> {@code "clipboard-write"}</li>
* <li> {@code "geolocation"}</li>
* <li> {@code "gyroscope"}</li>
* <li> {@code "local-fonts"}</li>
* <li> {@code "local-network-access"}</li>
* <li> {@code "magnetometer"}</li>
* <li> {@code "microphone"}</li>
* <li> {@code "midi-sysex"} (system-exclusive midi)</li>
@@ -896,7 +899,6 @@ public interface BrowserContext extends AutoCloseable {
* <li> {@code "notifications"}</li>
* <li> {@code "payment-handler"}</li>
* <li> {@code "storage-access"}</li>
* <li> {@code "local-fonts"}</li>
* </ul>
* @since v1.8
*/
@@ -78,5 +78,12 @@ 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,6 +48,9 @@ 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,6 +170,12 @@ 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
@@ -244,6 +250,15 @@ 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
@@ -293,6 +308,12 @@ 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
@@ -360,6 +381,15 @@ 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,6 +563,11 @@ 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.
@@ -617,6 +622,14 @@ 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,6 +245,12 @@ 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
@@ -320,6 +326,15 @@ 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
@@ -370,6 +385,12 @@ 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
@@ -438,6 +459,15 @@ 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
@@ -494,6 +524,11 @@ 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.
@@ -543,6 +578,14 @@ 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.
@@ -2616,6 +2659,23 @@ 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,12 +127,16 @@ public interface Mouse {
}
class MoveOptions {
/**
* Defaults to 1. Sends intermediate {@code mousemove} events.
* 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;
/**
* Defaults to 1. Sends intermediate {@code mousemove} events.
* 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 MoveOptions setSteps(int steps) {
this.steps = steps;
@@ -860,6 +860,11 @@ 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.
@@ -914,6 +919,14 @@ 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,6 +17,7 @@
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>.
@@ -44,6 +45,16 @@ 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
@@ -62,6 +73,35 @@ 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}.
*
@@ -158,5 +198,21 @@ 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,7 +46,6 @@ 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();
@@ -81,7 +80,6 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
}
enum EventType {
BACKGROUNDPAGE,
CLOSE,
CONSOLE,
DIALOG,
@@ -133,12 +131,10 @@ 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
@@ -340,7 +336,7 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
@Override
public List<Page> backgroundPages() {
return new ArrayList<>(backgroundPages);
return Collections.emptyList();
}
@Override
@@ -719,10 +715,6 @@ 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());
@@ -734,8 +726,15 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
if (params.has("page")) {
page = connection.getExistingObject(params.getAsJsonObject("page").get("guid").getAsString());
}
ConsoleMessageImpl message = new ConsoleMessageImpl(connection, params, page);
WorkerImpl worker = null;
if (params.has("worker")) {
worker = connection.getExistingObject(params.getAsJsonObject("worker").get("guid").getAsString());
}
ConsoleMessageImpl message = new ConsoleMessageImpl(connection, params, page, worker);
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,6 +20,7 @@ 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;
@@ -27,11 +28,13 @@ 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) {
public ConsoleMessageImpl(Connection connection, JsonObject initializer, PageImpl page, WorkerImpl worker) {
this.connection = connection;
this.page = page;
this.worker = worker;
this.initializer = initializer;
}
@@ -39,6 +42,11 @@ 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,15 +229,18 @@ public class FrameImpl extends ChannelOwner implements Frame {
@Override
public void click(String selector, ClickOptions options) {
clickImpl(selector, options);
clickImpl(selector, options, null);
}
void clickImpl(String selector, ClickOptions options) {
void clickImpl(String selector, ClickOptions options, Integer steps) {
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));
}
@@ -248,11 +251,18 @@ 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));
}
@@ -440,16 +450,19 @@ public class FrameImpl extends ChannelOwner implements Frame {
@Override
public void dragAndDrop(String source, String target, DragAndDropOptions options) {
dragAndDropImpl(source, target, options);
dragAndDropImpl(source, target, options, null);
}
void dragAndDropImpl(String source, String target, DragAndDropOptions options) {
void dragAndDropImpl(String source, String target, DragAndDropOptions options, Integer steps) {
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));
}
@@ -627,7 +640,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,7 +16,6 @@
package com.microsoft.playwright.impl;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.*;
@@ -25,6 +24,7 @@ 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.click(selector, convertType(options, Frame.ClickOptions.class).setStrict(true));
frame.clickImpl(selector, convertType(options, Frame.ClickOptions.class).setStrict(true), options.steps);
}
@Override
@@ -174,12 +174,33 @@ 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.dblclick(selector, convertType(options, Frame.DblclickOptions.class).setStrict(true));
frame.dblclickImpl(selector, convertType(options, Frame.DblclickOptions.class).setStrict(true), options.steps);
}
@Override
@@ -197,7 +218,7 @@ class LocatorImpl implements Locator {
}
Frame.DragAndDropOptions frameOptions = convertType(options, Frame.DragAndDropOptions.class);
frameOptions.setStrict(true);
frame.dragAndDrop(selector, ((LocatorImpl) target).selector, frameOptions);
frame.dragAndDropImpl(selector, ((LocatorImpl) target).selector, frameOptions, options.steps);
}
@Override
@@ -627,6 +648,10 @@ class LocatorImpl implements Locator {
@Override
public String toString() {
String description = description();
if (description != null) {
return description;
}
return "Locator@" + selector;
}
@@ -237,7 +237,6 @@ public class PageImpl extends ChannelOwner implements Page {
void didClose() {
isClosed = true;
browserContext.pages.remove(this);
browserContext.backgroundPages.remove(this);
listeners.notify(EventType.CLOSE, this);
}
@@ -689,7 +688,7 @@ public class PageImpl extends ChannelOwner implements Page {
@Override
public void click(String selector, ClickOptions options) {
mainFrame.clickImpl(selector, convertType(options, Frame.ClickOptions.class));
mainFrame.clickImpl(selector, convertType(options, Frame.ClickOptions.class), null);
}
@Override
@@ -704,7 +703,7 @@ public class PageImpl extends ChannelOwner implements Page {
@Override
public void dblclick(String selector, DblclickOptions options) {
mainFrame.dblclick(selector, convertType(options, Frame.DblclickOptions.class));
mainFrame.dblclickImpl(selector, convertType(options, Frame.DblclickOptions.class), null);
}
@Override
@@ -937,7 +936,10 @@ public class PageImpl extends ChannelOwner implements Page {
@Override
public void dragAndDrop(String source, String target, DragAndDropOptions options) {
mainFrame.dragAndDropImpl(source, target, convertType(options, Frame.DragAndDropOptions.class));
if (options == null) {
options = new DragAndDropOptions();
}
mainFrame.dragAndDropImpl(source, target, convertType(options, Frame.DragAndDropOptions.class), options.steps);
}
@Override
@@ -1001,7 +1003,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));
result.add(new ConsoleMessageImpl(connection, item.getAsJsonObject(), this, null));
}
return result;
}
@@ -18,21 +18,25 @@ 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 {
private final ListenerCollection<EventType> listeners = new ListenerCollection<>();
final ListenerCollection<EventType> listeners = new ListenerCollection<>();
PageImpl page;
enum EventType {
CLOSE,
CONSOLE,
}
WorkerImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
@@ -49,9 +53,19 @@ class WorkerImpl extends ChannelOwner implements Worker {
listeners.remove(EventType.CLOSE, handler);
}
private <T> T waitForEventWithTimeout(EventType eventType, Runnable code, Double timeout) {
@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) {
List<Waitable<T>> waitables = new ArrayList<>();
waitables.add(new WaitableEvent<>(listeners, eventType));
waitables.add(new WaitableEvent<>(listeners, eventType, predicate));
waitables.add(page.createWaitForCloseHelper());
waitables.add(page.createWaitableTimeout(timeout));
return runUntil(code, new WaitableRace<>(waitables));
@@ -62,11 +76,23 @@ 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, options.timeout);
return waitForEventWithTimeout(EventType.CLOSE, code, null, options.timeout);
}
@Override
@@ -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 ExtensionContext.Store.CloseableResource {
static class PlaywrightRegistry implements AutoCloseable {
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() throws Throwable {
public void close() {
for (Playwright playwright : playwrightList) {
playwright.close();
}
@@ -36,7 +36,7 @@ package com.microsoft.playwright.junit;
* public Options getOptions() {
* return new Options()
* .setHeadless(false)
* .setContextOption(new Browser.NewContextOptions()
* .setContextOptions(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 url or domain / path are required. Optional.
* Either {@code url} or both {@code domain} and {@code 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 url or
* domain / path are required. Optional.
* 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.
*/
public String domain;
/**
* Either url or domain / path are required Optional.
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
*/
public String path;
/**
@@ -60,22 +60,22 @@ public class Cookie {
this.value = value;
}
/**
* Either url or domain / path are required. Optional.
* Either {@code url} or both {@code domain} and {@code 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 url or
* domain / path are required. Optional.
* 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.
*/
public Cookie setDomain(String domain) {
this.domain = domain;
return this;
}
/**
* Either url or domain / path are required Optional.
* Either {@code url} or both {@code domain} and {@code path} are required. Optional.
*/
public Cookie setPath(String path) {
this.path = path;
@@ -65,4 +65,41 @@ 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,4 +186,53 @@ 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,4 +124,94 @@ 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,6 +161,16 @@ 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());
@@ -186,6 +196,10 @@ 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,5 +196,26 @@ 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]);
}
}
@@ -39,7 +39,8 @@ public class TestFixtureDeviceOption {
public void testPredefinedDeviceParameters(Server server, Page page) {
page.navigate(server.EMPTY_PAGE);
assertEquals("webkit", page.context().browser().browserType().name());
assertEquals(3, page.evaluate("window.devicePixelRatio"));
// TODO: failing since 1.57 roll.
// assertEquals(3, page.evaluate("window.devicePixelRatio"));
assertEquals(980, page.evaluate("window.innerWidth"));
assertEquals(1668, page.evaluate("window.innerHeight"));
}
+5 -5
View File
@@ -6,7 +6,7 @@
<groupId>com.microsoft.playwright</groupId>
<artifactId>parent-pom</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.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.13.4</junit.version>
<junit.version>5.14.1</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.3.1</version>
<version>3.4.0</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.3.1</version>
<version>3.4.0</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.4.2</version>
<version>3.5.0</version>
<configuration>
<archive>
<manifest>
+1 -1
View File
@@ -1 +1 @@
1.56.0-beta-1759527268000
1.57.0-beta-1764692940000
+1 -1
View File
@@ -39,7 +39,7 @@ do
cd $PLATFORM
echo "Downloading driver for $PLATFORM to $(pwd)"
URL=https://playwright.azureedge.net/builds/driver
URL=https://cdn.playwright.dev/builds/driver
if [[ "$DRIVER_VERSION" == *-alpha* || "$DRIVER_VERSION" == *-beta* || "$DRIVER_VERSION" == *-next* ]]; then
URL=$URL/next
fi
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>com.microsoft.playwright</groupId>
<artifactId>api-generator</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.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").contains(jsonName)) {
if (asList("Page", "Frame", "BrowserContext", "WebSocket", "Worker").contains(jsonName)) {
output.add("import java.util.function.Predicate;");
}
if (asList("Page", "Frame", "FrameLocator", "Locator", "Browser", "BrowserType", "BrowserContext", "PageAssertions", "LocatorAssertions").contains(jsonName)) {
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.microsoft.playwright</groupId>
<artifactId>test-cli-fatjar</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Test Playwright Command Line FatJar</name>
<properties>
<compiler.version>1.8</compiler.version>
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.microsoft.playwright</groupId>
<artifactId>test-cli-version</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Test Playwright Command Line Version</name>
<properties>
<compiler.version>1.8</compiler.version>
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.microsoft.playwright</groupId>
<artifactId>test-local-installation</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Test local installation</name>
<description>Runs Playwright test suite (copied from playwright module) against locally cached Playwright</description>
<properties>
+1 -1
View File
@@ -9,7 +9,7 @@
</parent>
<groupId>com.microsoft.playwright</groupId>
<artifactId>test-spring-boot-starter</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Test Playwright With Spring Boot</name>
<properties>
<spring.version>2.4.3</spring.version>
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>com.microsoft.playwright</groupId>
<artifactId>update-version</artifactId>
<version>1.50.0-SNAPSHOT</version>
<version>1.57.0</version>
<name>Playwright - Update Version in Documentation</name>
<description>
This is an internal module used to update versions in the documentation based on