Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 64115bfb60 | |||
| 15eefc54af | |||
| abf245ccc7 | |||
| 10592ce5c7 | |||
| ef7f50c48a | |||
| 473b1ce794 | |||
| 98ecb7e0a0 | |||
| 04eb228813 | |||
| 298e01ee80 | |||
| b6b54af13c | |||
| b8d2ccae08 | |||
| 59e7c0cc94 | |||
| 54d0366b9e | |||
| 9845a05544 | |||
| 41fd9a6f75 |
@@ -0,0 +1,21 @@
|
||||
name: "Internal Tests"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- release-*
|
||||
|
||||
jobs:
|
||||
trigger:
|
||||
name: "trigger"
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- run: |
|
||||
curl -X POST \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
-H "Authorization: token ${GH_TOKEN}" \
|
||||
--data "{\"event_type\": \"playwright_tests_java\", \"client_payload\": {\"ref\": \"${GITHUB_SHA}\"}}" \
|
||||
https://api.github.com/repos/microsoft/playwright-internal/dispatches
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.REPOSITORY_DISPATCH_PERSONAL_ACCESS_TOKEN }}
|
||||
+1
-1
@@ -8,7 +8,7 @@ Install git, Java JDK (version >= 8), Maven (tested with version 3.6.3), on Ubun
|
||||
just run the following command:
|
||||
|
||||
```sh
|
||||
sudo apt-get install git openjdk-11-jdk maven
|
||||
sudo apt-get install git openjdk-11-jdk maven unzip
|
||||
```
|
||||
|
||||
### Getting the Code
|
||||
|
||||
@@ -11,9 +11,9 @@ Playwright is a Java library to automate [Chromium](https://www.chromium.org/Hom
|
||||
|
||||
| | Linux | macOS | Windows |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| Chromium <!-- GEN:chromium-version -->101.0.4951.15<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| Chromium <!-- GEN:chromium-version -->102.0.5005.40<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| WebKit <!-- GEN:webkit-version -->15.4<!-- GEN:stop --> | ✅ | ✅ | ✅ |
|
||||
| Firefox <!-- GEN:firefox-version -->98.0.2<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| Firefox <!-- GEN:firefox-version -->99.0.1<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
|
||||
Headless execution is supported for all the browsers on all platforms. Check out [system requirements](https://playwright.dev/java/docs/next/intro/#system-requirements) for details.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver-bundle</artifactId>
|
||||
|
||||
@@ -139,11 +139,17 @@ public class DriverJar extends Driver {
|
||||
|
||||
private static String platformDir() {
|
||||
String name = System.getProperty("os.name").toLowerCase();
|
||||
String arch = System.getProperty("os.arch").toLowerCase();
|
||||
|
||||
if (name.contains("windows")) {
|
||||
return "win32_x64";
|
||||
}
|
||||
if (name.contains("linux")) {
|
||||
return "linux";
|
||||
if (arch.equals("aarch64")) {
|
||||
return "linux-arm64";
|
||||
} else {
|
||||
return "linux";
|
||||
}
|
||||
}
|
||||
if (name.contains("mac os x")) {
|
||||
return "mac";
|
||||
|
||||
@@ -45,9 +45,11 @@ public class TestInstall {
|
||||
|
||||
@Test
|
||||
@Tags({@Tag("isolated"), @Tag("driverThrowTest")})
|
||||
void shouldThrowWhenBrowserPathIsInvalid() {
|
||||
void shouldThrowWhenBrowserPathIsInvalid(@TempDir Path tmpDir) {
|
||||
Map<String,String> env = new HashMap<>();
|
||||
env.put("PLAYWRIGHT_BROWSERS_PATH", "/some/bad/path/that/should/not/exist/i/hope");
|
||||
env.put("PLAYWRIGHT_DOWNLOAD_HOST", "https://127.0.0.127");
|
||||
// Make sure the browsers are not installed yet by pointing at an empty dir.
|
||||
env.put("PLAYWRIGHT_BROWSERS_PATH", tmpDir.toString());
|
||||
|
||||
assertThrows(RuntimeException.class, () -> Driver.ensureDriverInstalled(env, true));
|
||||
assertThrows(RuntimeException.class, () -> Driver.ensureDriverInstalled(env, true));
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver</artifactId>
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>examples</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
<name>Playwright Client Examples</name>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.example;
|
||||
|
||||
import com.microsoft.playwright.*;
|
||||
|
||||
public class SelectorsAndKeyboardManipulation {
|
||||
public static void main(String[] args) {
|
||||
try(Playwright playwright = Playwright.create()) {
|
||||
Browser browser = playwright.firefox().launch();
|
||||
BrowserContext context = browser.newContext();
|
||||
Page page = context.newPage();
|
||||
page.navigate("https://playwright.dev/java/");
|
||||
page.locator("text=SearchK").click();
|
||||
page.locator("[placeholder=\"Search docs\"]").fill("getting started");
|
||||
page.locator("div[role=\"button\"]:has-text(\"CancelIntroductionGetting startedInstallationGetting startedUsageGetting start\")").click();
|
||||
page.waitForSelector("h1:has-text(\"Getting started\")"); // Waits for the new page to load before screenshotting.
|
||||
page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get("Screenshot.png")));
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>playwright</artifactId>
|
||||
|
||||
@@ -1601,13 +1601,21 @@ public interface ElementHandle extends JSHandle {
|
||||
*/
|
||||
String innerText();
|
||||
/**
|
||||
* Returns {@code input.value} for {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*/
|
||||
default String inputValue() {
|
||||
return inputValue(null);
|
||||
}
|
||||
/**
|
||||
* Returns {@code input.value} for {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*/
|
||||
String inputValue(InputValueOptions options);
|
||||
/**
|
||||
@@ -1709,19 +1717,27 @@ public interface ElementHandle extends JSHandle {
|
||||
*/
|
||||
List<ElementHandle> querySelectorAll(String selector);
|
||||
/**
|
||||
* Returns the buffer with the captured screenshot.
|
||||
* This method captures a screenshot of the page, clipped to the size and position of this particular element. If the
|
||||
* element is covered by other elements, it will not be actually visible on the screenshot. If the element is a scrollable
|
||||
* container, only the currently scrolled content will be visible on the screenshot.
|
||||
*
|
||||
* <p> This method waits for the <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then
|
||||
* scrolls element into view before taking a screenshot. If the element is detached from DOM, the method throws an error.
|
||||
*
|
||||
* <p> Returns the buffer with the captured screenshot.
|
||||
*/
|
||||
default byte[] screenshot() {
|
||||
return screenshot(null);
|
||||
}
|
||||
/**
|
||||
* Returns the buffer with the captured screenshot.
|
||||
* This method captures a screenshot of the page, clipped to the size and position of this particular element. If the
|
||||
* element is covered by other elements, it will not be actually visible on the screenshot. If the element is a scrollable
|
||||
* container, only the currently scrolled content will be visible on the screenshot.
|
||||
*
|
||||
* <p> This method waits for the <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then
|
||||
* scrolls element into view before taking a screenshot. If the element is detached from DOM, the method throws an error.
|
||||
*
|
||||
* <p> Returns the buffer with the captured screenshot.
|
||||
*/
|
||||
byte[] screenshot(ScreenshotOptions options);
|
||||
/**
|
||||
@@ -2071,6 +2087,10 @@ public interface ElementHandle extends JSHandle {
|
||||
/**
|
||||
* This method waits for <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then focuses
|
||||
* the element and selects all its text content.
|
||||
*
|
||||
* <p> If the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, focuses and selects text
|
||||
* in the control instead.
|
||||
*/
|
||||
default void selectText() {
|
||||
selectText(null);
|
||||
@@ -2078,6 +2098,10 @@ public interface ElementHandle extends JSHandle {
|
||||
/**
|
||||
* This method waits for <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then focuses
|
||||
* the element and selects all its text content.
|
||||
*
|
||||
* <p> If the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, focuses and selects text
|
||||
* in the control instead.
|
||||
*/
|
||||
void selectText(SelectTextOptions options);
|
||||
/**
|
||||
@@ -2121,75 +2145,99 @@ public interface ElementHandle extends JSHandle {
|
||||
*/
|
||||
void setChecked(boolean checked, SetCheckedOptions options);
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(Path files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(Path files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(Path[] files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(Path[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(FilePayload files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(FilePayload files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(FilePayload[] files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code elementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code ElementHandle} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(FilePayload[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
|
||||
@@ -74,50 +74,50 @@ public interface FileChooser {
|
||||
Page page();
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
default void setFiles(Path files) {
|
||||
setFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
void setFiles(Path files, SetFilesOptions options);
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
default void setFiles(Path[] files) {
|
||||
setFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
void setFiles(Path[] files, SetFilesOptions options);
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
default void setFiles(FilePayload files) {
|
||||
setFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
void setFiles(FilePayload files, SetFilesOptions options);
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
default void setFiles(FilePayload[] files) {
|
||||
setFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* Sets the value of the file input this chooser is associated with. If some of the {@code filePaths} are relative paths, then
|
||||
* they are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* they are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*/
|
||||
void setFiles(FilePayload[] files, SetFilesOptions options);
|
||||
}
|
||||
|
||||
@@ -2868,7 +2868,11 @@ public interface Frame {
|
||||
*/
|
||||
String innerText(String selector, InnerTextOptions options);
|
||||
/**
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -2877,7 +2881,11 @@ public interface Frame {
|
||||
return inputValue(selector, null);
|
||||
}
|
||||
/**
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -2996,6 +3004,8 @@ public interface Frame {
|
||||
* element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
|
||||
* different DOM elements. That would happen if the DOM structure between those actions has changed.
|
||||
*
|
||||
* <p> <a href="https://playwright.dev/java/docs/locators">Learn more about locators</a>.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
* selectors</a> for more details.
|
||||
*/
|
||||
@@ -3007,6 +3017,8 @@ public interface Frame {
|
||||
* element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
|
||||
* different DOM elements. That would happen if the DOM structure between those actions has changed.
|
||||
*
|
||||
* <p> <a href="https://playwright.dev/java/docs/locators">Learn more about locators</a>.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
* selectors</a> for more details.
|
||||
*/
|
||||
@@ -3539,11 +3551,14 @@ public interface Frame {
|
||||
*/
|
||||
void setContent(String html, SetContentOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -3552,22 +3567,28 @@ public interface Frame {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, Path files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -3576,22 +3597,28 @@ public interface Frame {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, Path[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -3600,22 +3627,28 @@ public interface Frame {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, FilePayload files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -3624,11 +3657,14 @@ public interface Frame {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
|
||||
@@ -590,6 +590,50 @@ public interface Locator {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
class FilterOptions {
|
||||
/**
|
||||
* Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one.
|
||||
* For example, {@code article} that has {@code text=Playwright} matches {@code <article><div>Playwright</div></article>}.
|
||||
*
|
||||
* <p> Note that outer and inner locators must belong to the same frame. Inner locator must not contain {@code FrameLocator}s.
|
||||
*/
|
||||
public Locator has;
|
||||
/**
|
||||
* Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. When passed a
|
||||
* [string], matching is case-insensitive and searches for a substring. For example, {@code "Playwright"} matches
|
||||
* {@code <article><div>Playwright</div></article>}.
|
||||
*/
|
||||
public Object hasText;
|
||||
|
||||
/**
|
||||
* Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one.
|
||||
* For example, {@code article} that has {@code text=Playwright} matches {@code <article><div>Playwright</div></article>}.
|
||||
*
|
||||
* <p> Note that outer and inner locators must belong to the same frame. Inner locator must not contain {@code FrameLocator}s.
|
||||
*/
|
||||
public FilterOptions setHas(Locator has) {
|
||||
this.has = has;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. When passed a
|
||||
* [string], matching is case-insensitive and searches for a substring. For example, {@code "Playwright"} matches
|
||||
* {@code <article><div>Playwright</div></article>}.
|
||||
*/
|
||||
public FilterOptions setHasText(String hasText) {
|
||||
this.hasText = hasText;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. When passed a
|
||||
* [string], matching is case-insensitive and searches for a substring. For example, {@code "Playwright"} matches
|
||||
* {@code <article><div>Playwright</div></article>}.
|
||||
*/
|
||||
public FilterOptions setHasText(Pattern hasText) {
|
||||
this.hasText = hasText;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
class FocusOptions {
|
||||
/**
|
||||
* Maximum time in milliseconds, defaults to 30 seconds, pass {@code 0} to disable timeout. The default value can be changed by
|
||||
@@ -2074,6 +2118,16 @@ public interface Locator {
|
||||
* @param value Value to set for the {@code <input>}, {@code <textarea>} or {@code [contenteditable]} element.
|
||||
*/
|
||||
void fill(String value, FillOptions options);
|
||||
/**
|
||||
* This method narrows existing locator according to the options, for example filters by text.
|
||||
*/
|
||||
default Locator filter() {
|
||||
return filter(null);
|
||||
}
|
||||
/**
|
||||
* This method narrows existing locator according to the options, for example filters by text.
|
||||
*/
|
||||
Locator filter(FilterOptions options);
|
||||
/**
|
||||
* Returns locator to the first matching element.
|
||||
*/
|
||||
@@ -2174,13 +2228,21 @@ public interface Locator {
|
||||
*/
|
||||
String innerText(InnerTextOptions options);
|
||||
/**
|
||||
* Returns {@code input.value} for {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*/
|
||||
default String inputValue() {
|
||||
return inputValue(null);
|
||||
}
|
||||
/**
|
||||
* Returns {@code input.value} for {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*/
|
||||
String inputValue(InputValueOptions options);
|
||||
/**
|
||||
@@ -2252,7 +2314,8 @@ public interface Locator {
|
||||
*/
|
||||
Locator last();
|
||||
/**
|
||||
* The method finds an element matching the specified selector in the {@code Locator}'s subtree.
|
||||
* The method finds an element matching the specified selector in the {@code Locator}'s subtree. It also accepts filter options,
|
||||
* similar to {@link Locator#filter Locator.filter()} method.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
* selectors</a> for more details.
|
||||
@@ -2261,7 +2324,8 @@ public interface Locator {
|
||||
return locator(selector, null);
|
||||
}
|
||||
/**
|
||||
* The method finds an element matching the specified selector in the {@code Locator}'s subtree.
|
||||
* The method finds an element matching the specified selector in the {@code Locator}'s subtree. It also accepts filter options,
|
||||
* similar to {@link Locator#filter Locator.filter()} method.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
* selectors</a> for more details.
|
||||
@@ -2326,19 +2390,27 @@ public interface Locator {
|
||||
*/
|
||||
void press(String key, PressOptions options);
|
||||
/**
|
||||
* Returns the buffer with the captured screenshot.
|
||||
* This method captures a screenshot of the page, clipped to the size and position of a particular element matching the
|
||||
* locator. If the element is covered by other elements, it will not be actually visible on the screenshot. If the element
|
||||
* is a scrollable container, only the currently scrolled content will be visible on the screenshot.
|
||||
*
|
||||
* <p> This method waits for the <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then
|
||||
* scrolls element into view before taking a screenshot. If the element is detached from DOM, the method throws an error.
|
||||
*
|
||||
* <p> Returns the buffer with the captured screenshot.
|
||||
*/
|
||||
default byte[] screenshot() {
|
||||
return screenshot(null);
|
||||
}
|
||||
/**
|
||||
* Returns the buffer with the captured screenshot.
|
||||
* This method captures a screenshot of the page, clipped to the size and position of a particular element matching the
|
||||
* locator. If the element is covered by other elements, it will not be actually visible on the screenshot. If the element
|
||||
* is a scrollable container, only the currently scrolled content will be visible on the screenshot.
|
||||
*
|
||||
* <p> This method waits for the <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then
|
||||
* scrolls element into view before taking a screenshot. If the element is detached from DOM, the method throws an error.
|
||||
*
|
||||
* <p> Returns the buffer with the captured screenshot.
|
||||
*/
|
||||
byte[] screenshot(ScreenshotOptions options);
|
||||
/**
|
||||
@@ -2682,6 +2754,10 @@ public interface Locator {
|
||||
/**
|
||||
* This method waits for <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then focuses
|
||||
* the element and selects all its text content.
|
||||
*
|
||||
* <p> If the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, focuses and selects text
|
||||
* in the control instead.
|
||||
*/
|
||||
default void selectText() {
|
||||
selectText(null);
|
||||
@@ -2689,6 +2765,10 @@ public interface Locator {
|
||||
/**
|
||||
* This method waits for <a href="https://playwright.dev/java/docs/actionability">actionability</a> checks, then focuses
|
||||
* the element and selects all its text content.
|
||||
*
|
||||
* <p> If the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, focuses and selects text
|
||||
* in the control instead.
|
||||
*/
|
||||
void selectText(SelectTextOptions options);
|
||||
/**
|
||||
@@ -2732,75 +2812,99 @@ public interface Locator {
|
||||
*/
|
||||
void setChecked(boolean checked, SetCheckedOptions options);
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(Path files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(Path files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(Path[] files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(Path[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(FilePayload files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(FilePayload files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
default void setInputFiles(FilePayload[] files) {
|
||||
setInputFiles(files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code element} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code Locator} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*/
|
||||
void setInputFiles(FilePayload[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
|
||||
@@ -4201,8 +4201,8 @@ public interface Page extends AutoCloseable {
|
||||
*/
|
||||
Response goForward(GoForwardOptions options);
|
||||
/**
|
||||
* Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
|
||||
* last redirect.
|
||||
* Returns the main resource response. In case of multiple redirects, the navigation will resolve with the first
|
||||
* non-redirect response.
|
||||
*
|
||||
* <p> The method will throw an error if:
|
||||
* <ul>
|
||||
@@ -4233,8 +4233,8 @@ public interface Page extends AutoCloseable {
|
||||
return navigate(url, null);
|
||||
}
|
||||
/**
|
||||
* Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
|
||||
* last redirect.
|
||||
* Returns the main resource response. In case of multiple redirects, the navigation will resolve with the first
|
||||
* non-redirect response.
|
||||
*
|
||||
* <p> The method will throw an error if:
|
||||
* <ul>
|
||||
@@ -4337,7 +4337,11 @@ public interface Page extends AutoCloseable {
|
||||
*/
|
||||
String innerText(String selector, InnerTextOptions options);
|
||||
/**
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -4346,7 +4350,11 @@ public interface Page extends AutoCloseable {
|
||||
return inputValue(selector, null);
|
||||
}
|
||||
/**
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element. Throws for non-input elements.
|
||||
* Returns {@code input.value} for the selected {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> Throws for non-input elements. However, if the element is inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, returns the value of the
|
||||
* control.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -4466,6 +4474,8 @@ public interface Page extends AutoCloseable {
|
||||
* element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
|
||||
* different DOM elements. That would happen if the DOM structure between those actions has changed.
|
||||
*
|
||||
* <p> <a href="https://playwright.dev/java/docs/locators">Learn more about locators</a>.
|
||||
*
|
||||
* <p> Shortcut for main frame's {@link Frame#locator Frame.locator()}.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
@@ -4479,6 +4489,8 @@ public interface Page extends AutoCloseable {
|
||||
* element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
|
||||
* different DOM elements. That would happen if the DOM structure between those actions has changed.
|
||||
*
|
||||
* <p> <a href="https://playwright.dev/java/docs/locators">Learn more about locators</a>.
|
||||
*
|
||||
* <p> Shortcut for main frame's {@link Frame#locator Frame.locator()}.
|
||||
*
|
||||
* @param selector A selector to use when resolving DOM element. See <a href="https://playwright.dev/java/docs/selectors">working with
|
||||
@@ -5552,11 +5564,14 @@ public interface Page extends AutoCloseable {
|
||||
*/
|
||||
void setExtraHTTPHeaders(Map<String, String> headers);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -5565,22 +5580,28 @@ public interface Page extends AutoCloseable {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, Path files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -5589,22 +5610,28 @@ public interface Page extends AutoCloseable {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, Path[] files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -5613,22 +5640,28 @@ public interface Page extends AutoCloseable {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
*/
|
||||
void setInputFiles(String selector, FilePayload files, SetInputFilesOptions options);
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
@@ -5637,11 +5670,14 @@ public interface Page extends AutoCloseable {
|
||||
setInputFiles(selector, files, null);
|
||||
}
|
||||
/**
|
||||
* This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>.
|
||||
* Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the current working directory. For empty array, clears the selected files.
|
||||
*
|
||||
* <p> Sets the value of the file input to these file paths or files. If some of the {@code filePaths} are relative paths, then they
|
||||
* are resolved relative to the the current working directory. For empty array, clears the selected files.
|
||||
* <p> This method expects {@code selector} to point to an <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">input element</a>. However, if the element is
|
||||
* inside the {@code <label>} element that has an associated <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/control">control</a>, targets the control
|
||||
* instead.
|
||||
*
|
||||
* @param selector A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
|
||||
* <a href="https://playwright.dev/java/docs/selectors">working with selectors</a> for more details.
|
||||
|
||||
@@ -22,6 +22,8 @@ import java.util.*;
|
||||
/**
|
||||
* Whenever a network route is set up with {@link Page#route Page.route()} or {@link BrowserContext#route
|
||||
* BrowserContext.route()}, the {@code Route} object allows to handle the route.
|
||||
*
|
||||
* <p> Learn more about <a href="https://playwright.dev/java/docs/network">networking</a>.
|
||||
*/
|
||||
public interface Route {
|
||||
class ResumeOptions {
|
||||
|
||||
+12
-4
@@ -328,7 +328,11 @@ public interface LocatorAssertions {
|
||||
*/
|
||||
void isChecked(IsCheckedOptions options);
|
||||
/**
|
||||
* Ensures the {@code Locator} points to a disabled element.
|
||||
* Ensures the {@code Locator} points to a disabled element. Element is disabled if it has "disabled" attribute or is disabled
|
||||
* via <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-disabled">'aria-disabled'</a>.
|
||||
* Note that only native control elements such as HTML {@code button}, {@code input}, {@code select}, {@code textarea}, {@code option}, {@code optgroup} can be
|
||||
* disabled by setting "disabled" attribute. "disabled" attribute on other elements is ignored by the browser.
|
||||
* <pre>{@code
|
||||
* assertThat(page.locator("button.submit")).isDisabled();
|
||||
* }</pre>
|
||||
@@ -337,7 +341,11 @@ public interface LocatorAssertions {
|
||||
isDisabled(null);
|
||||
}
|
||||
/**
|
||||
* Ensures the {@code Locator} points to a disabled element.
|
||||
* Ensures the {@code Locator} points to a disabled element. Element is disabled if it has "disabled" attribute or is disabled
|
||||
* via <a
|
||||
* href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-disabled">'aria-disabled'</a>.
|
||||
* Note that only native control elements such as HTML {@code button}, {@code input}, {@code select}, {@code textarea}, {@code option}, {@code optgroup} can be
|
||||
* disabled by setting "disabled" attribute. "disabled" attribute on other elements is ignored by the browser.
|
||||
* <pre>{@code
|
||||
* assertThat(page.locator("button.submit")).isDisabled();
|
||||
* }</pre>
|
||||
@@ -429,7 +437,7 @@ public interface LocatorAssertions {
|
||||
* Ensures the {@code Locator} points to a <a href="https://playwright.dev/java/docs/api/actionability#visible">visible</a> DOM
|
||||
* node.
|
||||
* <pre>{@code
|
||||
* assertThat(page.locator(".my-element")).toBeVisible();
|
||||
* assertThat(page.locator(".my-element")).isVisible();
|
||||
* }</pre>
|
||||
*/
|
||||
default void isVisible() {
|
||||
@@ -439,7 +447,7 @@ public interface LocatorAssertions {
|
||||
* Ensures the {@code Locator} points to a <a href="https://playwright.dev/java/docs/api/actionability#visible">visible</a> DOM
|
||||
* node.
|
||||
* <pre>{@code
|
||||
* assertThat(page.locator(".my-element")).toBeVisible();
|
||||
* assertThat(page.locator(".my-element")).isVisible();
|
||||
* }</pre>
|
||||
*/
|
||||
void isVisible(IsVisibleOptions options);
|
||||
|
||||
@@ -257,7 +257,8 @@ public class LocatorAssertionsImpl extends AssertionsBase implements LocatorAsse
|
||||
|
||||
@Override
|
||||
public void isChecked(IsCheckedOptions options) {
|
||||
expectTrue("to.be.checked", "Locator expected to be checked", convertType(options, FrameExpectOptions.class));
|
||||
String expression = (options != null && options.checked != null && !options.checked) ? "to.be.unchecked" : "to.be.checked";
|
||||
expectTrue(expression, "Locator expected to be checked", convertType(options, FrameExpectOptions.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.*;
|
||||
@@ -9,8 +8,11 @@ import com.microsoft.playwright.options.FilePayload;
|
||||
import com.microsoft.playwright.options.SelectOption;
|
||||
import com.microsoft.playwright.options.WaitForSelectorState;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.file.Path;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -22,6 +24,43 @@ class LocatorImpl implements Locator {
|
||||
private final FrameImpl frame;
|
||||
private final String selector;
|
||||
|
||||
private static class Filters {
|
||||
private final Map<Field, String> filterFieldToEngine = new LinkedHashMap<>();
|
||||
private void addFilter(String name, String engine) throws NoSuchFieldException {
|
||||
filterFieldToEngine.put(LocatorOptions.class.getField(name), engine);
|
||||
}
|
||||
{
|
||||
try {
|
||||
addFilter("has", "has");
|
||||
// addFilter("leftOf", "left-of");
|
||||
// addFilter("rightOf", "right-of");
|
||||
// addFilter("above", "above");
|
||||
// addFilter("below", "below");
|
||||
// addFilter("near", "near");
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw new InternalError(e);
|
||||
}
|
||||
}
|
||||
String addFiltersToSelector(String selector, LocatorOptions options, Frame frame) {
|
||||
try {
|
||||
for (Map.Entry<Field, String> p : filterFieldToEngine.entrySet()) {
|
||||
LocatorImpl filter = (LocatorImpl) p.getKey().get(options);
|
||||
if (filter == null) {
|
||||
continue;
|
||||
}
|
||||
if (filter.frame != frame) {
|
||||
throw new PlaywrightException("Inner '" + p.getKey().getName() + "' locator must belong to the same frame.");
|
||||
}
|
||||
selector += " >> " + p.getValue() + "=" + gson().toJson(filter.selector);
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new PlaywrightException("Unexpected options", e);
|
||||
}
|
||||
return selector;
|
||||
}
|
||||
}
|
||||
private static final Filters filters = new Filters();
|
||||
|
||||
public LocatorImpl(FrameImpl frame, String selector, LocatorOptions options) {
|
||||
this.frame = frame;
|
||||
if (options != null) {
|
||||
@@ -34,14 +73,7 @@ class LocatorImpl implements Locator {
|
||||
selector += " >> :scope:has-text(" + escapeWithQuotes(text) + ")";
|
||||
}
|
||||
}
|
||||
if (options.has != null) {
|
||||
LocatorImpl has = (LocatorImpl) options.has;
|
||||
if (has.frame != frame) {
|
||||
throw new PlaywrightException("Inner 'has' locator must belong to the same frame.");
|
||||
}
|
||||
selector += " >> has=" + gson().toJson(has.selector);
|
||||
}
|
||||
|
||||
selector = filters.addFiltersToSelector(selector, options, frame);
|
||||
}
|
||||
this.selector = selector;
|
||||
}
|
||||
@@ -170,6 +202,11 @@ class LocatorImpl implements Locator {
|
||||
frame.fill(selector, value, convertType(options, Frame.FillOptions.class).setStrict(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locator filter(FilterOptions options) {
|
||||
return new LocatorImpl(frame, selector, convertType(options,LocatorOptions.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locator first() {
|
||||
return new LocatorImpl(frame, selector + " >> nth=0", null);
|
||||
|
||||
@@ -43,6 +43,8 @@ class SerializedValue{
|
||||
}
|
||||
O[] o;
|
||||
Number h;
|
||||
Integer id;
|
||||
Integer ref;
|
||||
}
|
||||
|
||||
class SerializedArgument{
|
||||
|
||||
@@ -71,82 +71,128 @@ class Serialization {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static SerializedValue serializeValue(Object value, List<JSHandleImpl> handles, int depth) {
|
||||
if (depth > 100) {
|
||||
throw new PlaywrightException("Maximum argument depth exceeded");
|
||||
private static class ValueSerializer {
|
||||
// hashCode() of a map containing itself as a key will throw stackoverflow exception,
|
||||
// so we user wrappers.
|
||||
private static class HashableValue {
|
||||
final Object value;
|
||||
HashableValue(Object value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return value == ((HashableValue) o).value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return System.identityHashCode(value);
|
||||
}
|
||||
}
|
||||
SerializedValue result = new SerializedValue();
|
||||
if (value instanceof JSHandleImpl) {
|
||||
result.h = handles.size();
|
||||
handles.add((JSHandleImpl) value);
|
||||
private final Map<HashableValue, Integer> valueToId = new HashMap<>();
|
||||
private int lastId = 0;
|
||||
private final List<JSHandleImpl> handles = new ArrayList<>();
|
||||
private final SerializedValue serializedValue;
|
||||
|
||||
ValueSerializer(Object value) {
|
||||
serializedValue = serializeValue(value);
|
||||
}
|
||||
|
||||
SerializedArgument toSerializedArgument() {
|
||||
SerializedArgument result = new SerializedArgument();
|
||||
result.value = serializedValue;
|
||||
result.handles = new Channel[handles.size()];
|
||||
int i = 0;
|
||||
for (JSHandleImpl handle : handles) {
|
||||
result.handles[i] = new Channel();
|
||||
result.handles[i].guid = handle.guid;
|
||||
++i;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
if (value == null) {
|
||||
result.v = "undefined";
|
||||
} else if (value instanceof Double) {
|
||||
double d = ((Double) value);
|
||||
if (d == Double.POSITIVE_INFINITY) {
|
||||
result.v = "Infinity";
|
||||
} else if (d == Double.NEGATIVE_INFINITY) {
|
||||
result.v = "-Infinity";
|
||||
} else if (d == -0) {
|
||||
result.v = "-0";
|
||||
} else if (Double.isNaN(d)) {
|
||||
result.v = "NaN";
|
||||
|
||||
private SerializedValue serializeValue(Object value) {
|
||||
SerializedValue result = new SerializedValue();
|
||||
if (value instanceof JSHandleImpl) {
|
||||
result.h = handles.size();
|
||||
handles.add((JSHandleImpl) value);
|
||||
return result;
|
||||
}
|
||||
if (value == null) {
|
||||
result.v = "undefined";
|
||||
} else if (value instanceof Double) {
|
||||
double d = ((Double) value);
|
||||
if (d == Double.POSITIVE_INFINITY) {
|
||||
result.v = "Infinity";
|
||||
} else if (d == Double.NEGATIVE_INFINITY) {
|
||||
result.v = "-Infinity";
|
||||
} else if (d == -0) {
|
||||
result.v = "-0";
|
||||
} else if (Double.isNaN(d)) {
|
||||
result.v = "NaN";
|
||||
} else {
|
||||
result.n = d;
|
||||
}
|
||||
} else if (value instanceof Boolean) {
|
||||
result.b = (Boolean) value;
|
||||
} else if (value instanceof Integer) {
|
||||
result.n = (Integer) value;
|
||||
} else if (value instanceof String) {
|
||||
result.s = (String) value;
|
||||
} else {
|
||||
result.n = d;
|
||||
HashableValue mapKey = new HashableValue(value);
|
||||
Integer id = valueToId.get(mapKey);
|
||||
if (id != null) {
|
||||
result.ref = id;
|
||||
} else {
|
||||
result.id = ++lastId;
|
||||
valueToId.put(mapKey, lastId);
|
||||
if (value instanceof List) {
|
||||
List<SerializedValue> list = new ArrayList<>();
|
||||
for (Object o : (List<?>) value) {
|
||||
list.add(serializeValue(o));
|
||||
}
|
||||
result.a = list.toArray(new SerializedValue[0]);
|
||||
} else if (value instanceof Map) {
|
||||
List<SerializedValue.O> list = new ArrayList<>();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, ?> map = (Map<String, ?>) value;
|
||||
for (Map.Entry<String, ?> e : map.entrySet()) {
|
||||
SerializedValue.O o = new SerializedValue.O();
|
||||
o.k = e.getKey();
|
||||
o.v = serializeValue(e.getValue());
|
||||
list.add(o);
|
||||
}
|
||||
result.o = list.toArray(new SerializedValue.O[0]);
|
||||
} else if (value instanceof Object[]) {
|
||||
List<SerializedValue> list = new ArrayList<>();
|
||||
for (Object o : (Object[]) value) {
|
||||
list.add(serializeValue(o));
|
||||
}
|
||||
result.a = list.toArray(new SerializedValue[0]);
|
||||
} else {
|
||||
throw new PlaywrightException("Unsupported type of argument: " + value);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (value instanceof Boolean) {
|
||||
result.b = (Boolean) value;
|
||||
} else if (value instanceof Integer) {
|
||||
result.n = (Integer) value;
|
||||
} else if (value instanceof String) {
|
||||
result.s = (String) value;
|
||||
} else if (value instanceof List) {
|
||||
List<SerializedValue> list = new ArrayList<>();
|
||||
for (Object o : (List<?>) value) {
|
||||
list.add(serializeValue(o, handles, depth + 1));
|
||||
}
|
||||
result.a = list.toArray(new SerializedValue[0]);
|
||||
} else if (value instanceof Map) {
|
||||
List<SerializedValue.O> list = new ArrayList<>();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, ?> map = (Map<String, ?>) value;
|
||||
for (Map.Entry<String, ?> e : map.entrySet()) {
|
||||
SerializedValue.O o = new SerializedValue.O();
|
||||
o.k = e.getKey();
|
||||
o.v = serializeValue(e.getValue(), handles, depth + 1);
|
||||
list.add(o);
|
||||
}
|
||||
result.o = list.toArray(new SerializedValue.O[0]);
|
||||
} else if (value instanceof Object[]) {
|
||||
List<SerializedValue> list = new ArrayList<>();
|
||||
for (Object o : (Object[]) value) {
|
||||
list.add(serializeValue(o, handles, depth + 1));
|
||||
}
|
||||
result.a = list.toArray(new SerializedValue[0]);
|
||||
} else {
|
||||
throw new PlaywrightException("Unsupported type of argument: " + value);
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static SerializedArgument serializeArgument(Object arg) {
|
||||
SerializedArgument result = new SerializedArgument();
|
||||
List<JSHandleImpl> handles = new ArrayList<>();
|
||||
result.value = serializeValue(arg, handles, 0);
|
||||
result.handles = new Channel[handles.size()];
|
||||
int i = 0;
|
||||
for (JSHandleImpl handle : handles) {
|
||||
result.handles[i] = new Channel();
|
||||
result.handles[i].guid = handle.guid;
|
||||
++i;
|
||||
}
|
||||
return result;
|
||||
return new ValueSerializer(arg).toSerializedArgument();
|
||||
}
|
||||
|
||||
static <T> T deserialize(SerializedValue value) {
|
||||
return deserialize(value, new HashMap<>());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static <T> T deserialize(SerializedValue value) {
|
||||
private static <T> T deserialize(SerializedValue value, Map<Integer, Object> idToValue) {
|
||||
if (value.ref != null) {
|
||||
return (T) idToValue.get(value.ref);
|
||||
}
|
||||
if (value.n != null) {
|
||||
if (value.n.doubleValue() == (double) value.n.intValue()) {
|
||||
return (T) Integer.valueOf(value.n.intValue());
|
||||
@@ -177,15 +223,17 @@ class Serialization {
|
||||
}
|
||||
if (value.a != null) {
|
||||
List<Object> list = new ArrayList<>();
|
||||
idToValue.put(value.id, list);
|
||||
for (SerializedValue v : value.a) {
|
||||
list.add(deserialize(v));
|
||||
list.add(deserialize(v, idToValue));
|
||||
}
|
||||
return (T) list;
|
||||
}
|
||||
if (value.o != null) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
idToValue.put(value.id, map);
|
||||
for (SerializedValue.O o : value.o) {
|
||||
map.put(o.k, deserialize(o.v));
|
||||
map.put(o.k, deserialize(o.v, idToValue));
|
||||
}
|
||||
return (T) map;
|
||||
}
|
||||
@@ -215,7 +263,7 @@ class Serialization {
|
||||
static JsonArray toJsonArray(Path[] files) {
|
||||
JsonArray jsonFiles = new JsonArray();
|
||||
for (Path p : files) {
|
||||
jsonFiles.add(p.toString());
|
||||
jsonFiles.add(p.toAbsolutePath().toString());
|
||||
}
|
||||
return jsonFiles;
|
||||
}
|
||||
|
||||
@@ -118,6 +118,13 @@ public class TestLocatorAssertions extends TestBase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasTextWTextInnerTextPass() {
|
||||
page.setContent("<div id=node>Text <span hidden>garbage</span> content</div>");
|
||||
Locator locator = page.locator("#node");
|
||||
assertThat(locator).hasText("Text content", new LocatorAssertions.HasTextOptions().setUseInnerText(true));
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasTextWTextArrayPass() {
|
||||
page.setContent("<div>Text \n1</div><div>Text 2a</div>");
|
||||
@@ -577,6 +584,13 @@ public class TestLocatorAssertions extends TestBase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void isCheckedFalsePass() {
|
||||
page.setContent("<input type=checkbox></input>");
|
||||
Locator locator = page.locator("input");
|
||||
assertThat(locator).isChecked(new LocatorAssertions.IsCheckedOptions().setChecked(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
void isDisabledPass() {
|
||||
page.setContent("<button disabled>Text</button>");
|
||||
|
||||
@@ -345,31 +345,13 @@ public class TestPageEvaluate extends TestBase {
|
||||
|
||||
@Test
|
||||
void shouldReturnUndefinedForNonSerializableObjects() {
|
||||
assertEquals(null, page.evaluate("() => window"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldFailForCircularObject() {
|
||||
Object result = page.evaluate("() => {\n" +
|
||||
" const a = {};\n" +
|
||||
" const b = { a };\n" +
|
||||
" a.b = b;\n" +
|
||||
" return a;\n" +
|
||||
"}");
|
||||
assertNull(result);
|
||||
assertEquals(null, page.evaluate("() => () => {}"));
|
||||
assertEquals("ref: <Window>", page.evaluate("() => window"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldBeAbleToThrowATrickyError() {
|
||||
JSHandle windowHandle = page.evaluateHandle("() => window");
|
||||
String errorText = null;
|
||||
try {
|
||||
windowHandle.jsonValue();
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
errorText = e.getMessage();
|
||||
}
|
||||
assertNotNull(errorText);
|
||||
String errorText = "My error";
|
||||
try {
|
||||
page.evaluate("errorText => {\n" +
|
||||
" throw new Error(errorText);\n" +
|
||||
@@ -619,4 +601,23 @@ public class TestPageEvaluate extends TestBase {
|
||||
JSHandle resultHandle = page.evaluateHandle("() => ({ toJSON: () => 'string', data: 'data' })");
|
||||
assertEquals(mapOf("data", "data", "toJSON", emptyMap()), resultHandle.jsonValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldAliasWindowDocumentAndNode() {
|
||||
Object object = page.evaluate("[window, document, document.body]");
|
||||
assertEquals(asList("ref: <Window>", "ref: <Document>", "ref: <Node>"), object);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldWorkForCircularObject() {
|
||||
Object result = page.evaluate("() => {\n" +
|
||||
" const a = {};\n" +
|
||||
" a.b = a;\n" +
|
||||
" return a;\n" +
|
||||
" }");
|
||||
|
||||
Map<String, Object> map = (Map<String, Object>) result;
|
||||
assertEquals(1, map.size());
|
||||
assertTrue(map == map.get("b"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,5 +227,15 @@ public class TestPageExposeFunction extends TestBase {
|
||||
assertTrue(e.getMessage().contains("exposeBindingHandle supports a single argument, 2 received"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldSerializeCycles() {
|
||||
Object[] object = { null };
|
||||
page.exposeBinding("log", (source, obj) -> object[0] = obj[0]);
|
||||
page.evaluate("const a = {}; a.b = a; window.log(a)");
|
||||
Map<String, Object> map = (Map<String, Object>) object[0];
|
||||
assertEquals(1, map.size());
|
||||
assertTrue(map == map.get("b"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -134,4 +134,19 @@ public class TestPageLocatorQuery extends TestBase {
|
||||
assertThat(page.locator("div", new Page.LocatorOptions()
|
||||
.setHas(page.locator("span")).setHasText("wor"))).hasCount(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldSupportLocatorFilter() {
|
||||
page.setContent("<section><div><span>hello</span></div><div><span>world</span></div></section>");
|
||||
assertThat(page.locator("div").filter(new Locator.FilterOptions().setHasText("hello"))).hasCount(1);
|
||||
assertThat(page.locator("div", new Page.LocatorOptions().setHasText("hello")).filter(new Locator.FilterOptions().setHasText("hello"))).hasCount(1);
|
||||
assertThat(page.locator("div", new Page.LocatorOptions().setHasText("hello")).filter(new Locator.FilterOptions().setHasText("world"))).hasCount(0);
|
||||
assertThat(page.locator("section", new Page.LocatorOptions().setHasText("hello")).filter(new Locator.FilterOptions().setHasText("world"))).hasCount(1);
|
||||
assertThat(page.locator("div").filter(new Locator.FilterOptions().setHasText("hello")).locator("span")).hasCount(1);
|
||||
assertThat(page.locator("div").filter(new Locator.FilterOptions().setHas(page.locator("span", new Page.LocatorOptions().setHasText("world"))))).hasCount(1);
|
||||
assertThat(page.locator("div").filter(new Locator.FilterOptions().setHas(page.locator("span")))).hasCount(2);
|
||||
assertThat(page.locator("div").filter(new Locator.FilterOptions()
|
||||
.setHas(page.locator("span"))
|
||||
.setHasText("world"))).hasCount(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,7 +256,7 @@ public class TestPageRoute extends TestBase {
|
||||
}
|
||||
assertNotNull(failedRequest[0]);
|
||||
if (isWebKit()) {
|
||||
assertEquals("Request intercepted", failedRequest[0].failure());
|
||||
assertEquals("Blocked by Web Inspector", failedRequest[0].failure());
|
||||
} else if (isFirefox()) {
|
||||
assertEquals("NS_ERROR_OFFLINE", failedRequest[0].failure());
|
||||
} else {
|
||||
@@ -281,7 +281,7 @@ public class TestPageRoute extends TestBase {
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
if (isWebKit())
|
||||
assertTrue(e.getMessage().contains("Request intercepted"));
|
||||
assertTrue(e.getMessage().contains("Blocked by Web Inspector"), e.getMessage());
|
||||
else if (isFirefox())
|
||||
assertTrue(e.getMessage().contains("NS_ERROR_FAILURE"));
|
||||
else
|
||||
|
||||
@@ -41,7 +41,8 @@ public class TestPlaywrightCreate {
|
||||
getBrowserTypeFromEnv(playwright).launch();
|
||||
fail("Did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("Looks like Playwright Test or Playwright was just installed or updated"), e.getMessage());
|
||||
assertTrue(e.getMessage().contains("Looks like Playwright Test or Playwright was just installed or updated") ||
|
||||
e.getMessage().contains("Looks like Playwright was just installed or updated."), e.getMessage());
|
||||
}
|
||||
|
||||
try (DirectoryStream<Path> ds = Files.newDirectoryStream(browsersDir)) {
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
package com.microsoft.playwright;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class TestSelectorsMisc extends TestBase {
|
||||
|
||||
@Test
|
||||
void shouldWorkWithLayoutSelectors() {
|
||||
/*
|
||||
|
||||
+--+ +--+
|
||||
| 1| | 2|
|
||||
+--+ ++-++
|
||||
| 3| | 4|
|
||||
+-------+ ++-++
|
||||
| 0 | | 5|
|
||||
| +--+ +--+--+
|
||||
| | 6| | 7|
|
||||
| +--+ +--+
|
||||
| |
|
||||
O-------+
|
||||
+--+
|
||||
| 8|
|
||||
+--++--+
|
||||
| 9|
|
||||
+--+
|
||||
|
||||
*/
|
||||
Object[][] boxes = {
|
||||
// x, y, width, height
|
||||
{0, 0, 150, 150},
|
||||
{100, 200, 50, 50},
|
||||
{200, 200, 50, 50},
|
||||
{100, 150, 50, 50},
|
||||
{201, 150, 50, 50},
|
||||
{200, 100, 50, 50},
|
||||
{50, 50, 50, 50},
|
||||
{150, 50, 50, 50},
|
||||
{150, -51, 50, 50},
|
||||
{201, -101, 50, 50},
|
||||
};
|
||||
page.setContent("<container style='width: 500px; height: 500px; position: relative;'></container>");
|
||||
page.evalOnSelector("container", "(container, boxes) => {\n" +
|
||||
" for (let i = 0; i < boxes.length; i++) {\n" +
|
||||
" const div = document.createElement('div');\n" +
|
||||
" div.style.position = 'absolute';\n" +
|
||||
" div.style.overflow = 'hidden';\n" +
|
||||
" div.style.boxSizing = 'border-box';\n" +
|
||||
" div.style.border = '1px solid black';\n" +
|
||||
" div.id = 'id' + i;\n" +
|
||||
" div.textContent = 'id' + i;\n" +
|
||||
" const box = boxes[i];\n" +
|
||||
" div.style.left = box[0] + 'px';\n" +
|
||||
" // Note that top is a flipped y coordinate.\n" +
|
||||
" div.style.top = (250 - box[1] - box[3]) + 'px';\n" +
|
||||
" div.style.width = box[2] + 'px';\n" +
|
||||
" div.style.height = box[3] + 'px';\n" +
|
||||
" container.appendChild(div);\n" +
|
||||
" const span = document.createElement('span');\n" +
|
||||
" span.textContent = '' + i;\n" +
|
||||
" div.appendChild(span);\n" +
|
||||
" }\n" +
|
||||
" }", boxes);
|
||||
|
||||
assertEquals("id7", page.evalOnSelector("div:right-of(#id6)", "e => e.id"));
|
||||
// assertEquals("id7", page.evalOnSelector("div >> right-of=\"#id6\"", "e => e.id"));
|
||||
// assertEquals("id7", page.locator("div", new Page.LocatorOptions().setRightOf(page.locator("#id6")))
|
||||
// .first().evaluate("e => e.id"));
|
||||
assertEquals("id2", page.evalOnSelector("div:right-of(#id1)", "e => e.id"));
|
||||
// assertEquals("id2", page.evalOnSelector("div >> right-of=\"#id1\"", "e => e.id"));
|
||||
assertEquals("id4", page.evalOnSelector("div:right-of(#id3)", "e => e.id"));
|
||||
// assertEquals("id4", page.evalOnSelector("div >> right-of=\"#id3\"", "e => e.id"));
|
||||
assertNull(page.querySelector("div:right-of(#id4)"));
|
||||
// assertNull(page.querySelector("div >> right-of=\"#id4\""));
|
||||
assertEquals("id7", page.evalOnSelector("div:right-of(#id0)", "e => e.id"));
|
||||
// assertEquals("id7", page.evalOnSelector("div >> right-of=\"#id0\"", "e => e.id"));
|
||||
assertEquals("id9", page.evalOnSelector("div:right-of(#id8)", "e => e.id"));
|
||||
// assertEquals("id9", page.evalOnSelector("div >> right-of=\"#id8\"", "e => e.id"));
|
||||
assertEquals("id4,id2,id5,id7,id8,id9", page.evalOnSelectorAll("div:right-of(#id3)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id4,id2,id5,id7,id8,id9", page.evalOnSelectorAll("div >> right-of=\"#id3\"", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("4,2,5,7,8,9", page.locator("div",
|
||||
// new Page.LocatorOptions().setRightOf(page.locator("#id3"))).locator("span")
|
||||
// .evaluateAll("els => els.map(e => e.textContent).join(',')"));
|
||||
assertEquals("id2,id5,id7,id8", page.evalOnSelectorAll("div:right-of(#id3, 50)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id2,id5,id7,id8", page.evalOnSelectorAll("div >> right-of=\"#id3\",50", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("2,5,7,8", page.evalOnSelectorAll("div >> right-of=\"#id3\",50 >> span", "els => els.map(e => e.textContent).join(',')"));
|
||||
// assertEquals("4,2,5,7,8,9", page.locator("div", new Page.LocatorOptions().setRightOf(page.locator("#id3")))
|
||||
// .locator("span").evaluateAll("els => els.map(e => e.textContent).join(',')"));
|
||||
assertEquals("id7,id8", page.evalOnSelectorAll("div:right-of(#id3, 49)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id7,id8", page.evalOnSelectorAll("div >> right-of=\"#id3\",49", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("7,8", page.evalOnSelectorAll("div >> right-of=\"#id3\",49 >> span", "els => els.map(e => e.textContent).join(',')"));
|
||||
// assertEquals("4,2,5,7,8,9", page.locator("div", new Page.LocatorOptions().setRightOf(page.locator("#id3")))
|
||||
// .locator("span").evaluateAll("els => els.map(e => e.textContent).join(',')"));
|
||||
|
||||
assertEquals("id1", page.evalOnSelector("div:left-of(#id2)", "e => e.id"));
|
||||
// assertEquals("id1", page.evalOnSelector("div >> left-of=\"#id2\"", "e => e.id"));
|
||||
// assertEquals("id1", page.locator("div", new Page.LocatorOptions().setLeftOf(page.locator("#id2"))).first().evaluate("e => e.id"));
|
||||
assertNull(page.querySelector("div:left-of(#id0)"));
|
||||
// assertNull(page.querySelector("div >> left-of=\"#id0\""));
|
||||
assertEquals("id0", page.evalOnSelector("div:left-of(#id5)", "e => e.id"));
|
||||
// assertEquals("id0", page.evalOnSelector("div >> left-of=\"#id5\"", "e => e.id"));
|
||||
assertEquals("id8", page.evalOnSelector("div:left-of(#id9)", "e => e.id"));
|
||||
// assertEquals("id8", page.evalOnSelector("div >> left-of=\"#id9\"", "e => e.id"));
|
||||
assertEquals("id3", page.evalOnSelector("div:left-of(#id4)", "e => e.id"));
|
||||
// assertEquals("id3", page.evalOnSelector("div >> left-of=\"#id4\"", "e => e.id"));
|
||||
assertEquals("id0,id7,id3,id1,id6,id8", page.evalOnSelectorAll("div:left-of(#id5)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0,id7,id3,id1,id6,id8", page.evalOnSelectorAll("div >> left-of=\"#id5\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id7,id8", page.evalOnSelectorAll("div:left-of(#id5, 3)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id7,id8", page.evalOnSelectorAll("div >> left-of=\"#id5\",3", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("7,8", page.evalOnSelectorAll("div >> left-of=\"#id5\",3 >> span", "els => els.map(e => e.textContent).join(',')"));
|
||||
|
||||
assertEquals("id3", page.evalOnSelector("div:above(#id0)", "e => e.id"));
|
||||
// assertEquals("id3", page.evalOnSelector("div >> above=\"#id0\"", "e => e.id"));
|
||||
// assertEquals("id3", page.locator("div", new Page.LocatorOptions().setAbove(page.locator("#id0")))
|
||||
// .first().evaluate("e => e.id"));
|
||||
assertEquals("id4", page.evalOnSelector("div:above(#id5)", "e => e.id"));
|
||||
// assertEquals("id4", page.evalOnSelector("div >> above=\"#id5\"", "e => e.id"));
|
||||
assertEquals("id5", page.evalOnSelector("div:above(#id7)", "e => e.id"));
|
||||
// assertEquals("id5", page.evalOnSelector("div >> above=\"#id7\"", "e => e.id"));
|
||||
assertEquals("id0", page.evalOnSelector("div:above(#id8)", "e => e.id"));
|
||||
// assertEquals("id0", page.evalOnSelector("div >> above=\"#id8\"", "e => e.id"));
|
||||
assertEquals("id8", page.evalOnSelector("div:above(#id9)", "e => e.id"));
|
||||
// assertEquals("id8", page.evalOnSelector("div >> above=\"#id9\"", "e => e.id"));
|
||||
assertNull(page.querySelector("div:above(#id2)"));
|
||||
// assertNull(page.querySelector("div >> above=\"#id2\""));
|
||||
assertEquals("id4,id2,id3,id1", page.evalOnSelectorAll("div:above(#id5)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id4,id2,id3,id1", page.evalOnSelectorAll("div >> above=\"#id5\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id4,id3", page.evalOnSelectorAll("div:above(#id5, 20)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id4,id3", page.evalOnSelectorAll("div >> above=\"#id5\",20", "els => els.map(e => e.id).join(',')"));
|
||||
|
||||
assertEquals("id5", page.evalOnSelector("div:below(#id4)", "e => e.id"));
|
||||
// assertEquals("id5", page.evalOnSelector("div >> below=\"#id4\"", "e => e.id"));
|
||||
// assertEquals("id5", page.locator("div", new Page.LocatorOptions().setBelow(page.locator("#id4")))
|
||||
// .first().evaluate("e => e.id"));
|
||||
assertEquals("id0", page.evalOnSelector("div:below(#id3)", "e => e.id"));
|
||||
// assertEquals("id0", page.evalOnSelector("div >> below=\"#id3\"", "e => e.id"));
|
||||
assertEquals("id4", page.evalOnSelector("div:below(#id2)", "e => e.id"));
|
||||
// assertEquals("id4", page.evalOnSelector("div >> below=\"#id2\"", "e => e.id"));
|
||||
assertEquals("id8", page.evalOnSelector("div:below(#id6)", "e => e.id"));
|
||||
// assertEquals("id8", page.evalOnSelector("div >> below=\"#id6\"", "e => e.id"));
|
||||
assertEquals("id8", page.evalOnSelector("div:below(#id7)", "e => e.id"));
|
||||
// assertEquals("id8", page.evalOnSelector("div >> below=\"#id7\"", "e => e.id"));
|
||||
assertEquals("id9", page.evalOnSelector("div:below(#id8)", "e => e.id"));
|
||||
// assertEquals("id9", page.evalOnSelector("div >> below=\"#id8\"", "e => e.id"));
|
||||
assertNull(page.querySelector("div:below(#id9)"));
|
||||
// assertNull(page.querySelector("div >> below=\"#id9\""));
|
||||
assertEquals("id0,id5,id6,id7,id8,id9", page.evalOnSelectorAll("div:below(#id3)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0,id5,id6,id7,id8,id9", page.evalOnSelectorAll("div >> below=\"#id3\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id0,id5,id6,id7", page.evalOnSelectorAll("div:below(#id3, 105)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0,id5,id6,id7", page.evalOnSelectorAll("div >> below=\"#id3\" , 105", "els => els.map(e => e.id).join(',')"));
|
||||
|
||||
assertEquals("id3", page.evalOnSelector("div:near(#id0)", "e => e.id"));
|
||||
// assertEquals("id3", page.evalOnSelector("div >> near=\"#id0\"", "e => e.id"));
|
||||
// assertEquals("id3", page.locator("div", new Page.LocatorOptions().setNear(page.locator("#id0")))
|
||||
// .first().evaluate("e => e.id"));
|
||||
assertEquals("id0,id5,id3,id6", page.evalOnSelectorAll("div:near(#id7)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0,id5,id3,id6", page.evalOnSelectorAll("div >> near=\"#id7\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id3,id6,id7,id8,id1,id5", page.evalOnSelectorAll("div:near(#id0)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id3,id6,id7,id8,id1,id5", page.evalOnSelectorAll("div >> near=\"#id0\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id0,id3,id7", page.evalOnSelectorAll("div:near(#id6)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0,id3,id7", page.evalOnSelectorAll("div >> near=\"#id6\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id0", page.evalOnSelectorAll("div:near(#id6, 10)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id0", page.evalOnSelectorAll("div >> near=\"#id6\",10", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id3,id6,id7,id8,id1,id5,id4,id2", page.evalOnSelectorAll("div:near(#id0, 100)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id3,id6,id7,id8,id1,id5,id4,id2", page.evalOnSelectorAll("div >> near=\"#id0\",100", "els => els.map(e => e.id).join(',')"));
|
||||
|
||||
assertEquals("id7,id6", page.evalOnSelectorAll("div:below(#id5):above(#id8)", "els => els.map(e => e.id).join(',')"));
|
||||
// assertEquals("id7,id6", page.evalOnSelectorAll("div >> below=\"#id5\" >> above=\"#id8\"", "els => els.map(e => e.id).join(',')"));
|
||||
assertEquals("id7", page.evalOnSelector("div:below(#id5):above(#id8)", "e => e.id"));
|
||||
// assertEquals("id7", page.evalOnSelector("div >> below=\"#id5\" >> above=\"#id8\"", "e => e.id"));
|
||||
// assertEquals("id7", page.locator("div", new Page.LocatorOptions()
|
||||
// .setBelow(page.locator("#id5"))
|
||||
// .setAbove(page.locator("#id8"))).first().evaluate("e => e.id"));
|
||||
|
||||
assertEquals("id5,id6,id3", page.evalOnSelectorAll("div:right-of(#id0) + div:above(#id8)", "els => els.map(e => e.id).join(',')"));
|
||||
|
||||
try {
|
||||
ElementHandle error = page.querySelector(":near(50)");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("\"near\" engine expects a selector list and optional maximum distance in pixels"), e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
ElementHandle error1 = page.querySelector("div >> left-of=abc");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("Malformed selector: left-of=abc"));
|
||||
}
|
||||
|
||||
try {
|
||||
ElementHandle error2 = page.querySelector("left-of=\"div\"");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("\"left-of\" selector cannot be first"), e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
ElementHandle error3 = page.querySelector("div >> left-of=33");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("Malformed selector: left-of=33"));
|
||||
}
|
||||
|
||||
try {
|
||||
ElementHandle error4 = page.querySelector("div >> left-of='span','foo'");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("Malformed selector: left-of='span','foo'"));
|
||||
}
|
||||
|
||||
try {
|
||||
ElementHandle error5 = page.querySelector("div >> left-of='span',3,4");
|
||||
fail("did not throw");
|
||||
} catch (PlaywrightException e) {
|
||||
assertTrue(e.getMessage().contains("Malformed selector: left-of='span',3,4"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,24 @@ import static com.microsoft.playwright.Utils.mapOf;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class TestWheel extends TestBase {
|
||||
private void expectEvent(Map<String, Object> expected) {
|
||||
// Chromium reports deltaX/deltaY scaled by host device scale factor.
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=1324819
|
||||
// https://github.com/microsoft/playwright/issues/7362
|
||||
// Different bots have different scale factors (usually 1 or 2), so we just ignore the values
|
||||
// instead of guessing the host scale factor.
|
||||
// This first appeared in Chromium 102.
|
||||
boolean ignoreDelta = isChromium() && isMac;
|
||||
Map<String, Object> received = (Map<String, Object>) page.evaluate("window.lastEvent");
|
||||
if (ignoreDelta) {
|
||||
expected.remove("deltaX");
|
||||
expected.remove("deltaY");
|
||||
received.remove("deltaX");
|
||||
received.remove("deltaY");
|
||||
}
|
||||
assertEquals(expected, received);
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldDispatchWheelEvents() {
|
||||
page.setContent("<div style='width: 5000px; height: 5000px;'></div>");
|
||||
@@ -42,7 +60,7 @@ public class TestWheel extends TestBase {
|
||||
"altKey", false,
|
||||
"metaKey", false);
|
||||
page.waitForFunction("window.scrollY === 100");
|
||||
assertEquals(expected, page.evaluate("window.lastEvent"));
|
||||
expectEvent(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -71,7 +89,7 @@ public class TestWheel extends TestBase {
|
||||
"shiftKey", true,
|
||||
"altKey", false,
|
||||
"metaKey", false);
|
||||
assertEquals(expected, page.evaluate("window.lastEvent"));
|
||||
expectEvent(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -90,7 +108,7 @@ public class TestWheel extends TestBase {
|
||||
"shiftKey", false,
|
||||
"altKey", false,
|
||||
"metaKey", false);
|
||||
assertEquals(expected, page.evaluate("window.lastEvent"));
|
||||
expectEvent(expected);
|
||||
page.waitForFunction("window.scrollX === 100");
|
||||
}
|
||||
|
||||
@@ -113,7 +131,7 @@ public class TestWheel extends TestBase {
|
||||
"shiftKey", false,
|
||||
"altKey", false,
|
||||
"metaKey", false);
|
||||
assertEquals(expected, page.evaluate("window.lastEvent"));
|
||||
expectEvent(expected);
|
||||
// give the page a chacne to scroll
|
||||
page.waitForTimeout(100);
|
||||
// ensure that it did not.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Playwright Parent Project</name>
|
||||
<description>Java library to automate Chromium, Firefox and WebKit with a single API.
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
1.21.0
|
||||
1.22.0
|
||||
|
||||
@@ -33,7 +33,7 @@ fi
|
||||
mkdir -p driver
|
||||
cd driver
|
||||
|
||||
for PLATFORM in mac linux win32_x64
|
||||
for PLATFORM in mac linux linux-arm64 win32_x64
|
||||
do
|
||||
FILE_NAME=$FILE_PREFIX-$PLATFORM.zip
|
||||
if [[ -d $PLATFORM ]]; then
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>api-generator</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
<name>Playwright - API Generator</name>
|
||||
<description>
|
||||
This is an internal module used to generate Java API from the upstream Playwright
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-cli-version</artifactId>
|
||||
<version>1.21.0</version>
|
||||
<version>1.22.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.21.0</version>
|
||||
<version>1.22.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.21.0</version>
|
||||
<version>1.22.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.21.0</version>
|
||||
<version>1.22.0</version>
|
||||
<name>Playwright - Update Version in Documentation</name>
|
||||
<description>
|
||||
This is an internal module used to update versions in the documentation based on
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
FROM ubuntu:focal
|
||||
|
||||
ARG DOCKER_IMAGE_NAME_TEMPLATE="mcr.microsoft.com/playwright/java:v%version%-focal"
|
||||
|
||||
# === INSTALL JDK and Maven ===
|
||||
|
||||
RUN apt-get update && \
|
||||
@@ -13,7 +15,8 @@ RUN apt-get update && \
|
||||
# Create the pwuser
|
||||
adduser pwuser
|
||||
|
||||
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
||||
ARG PW_TARGET_ARCH
|
||||
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-${PW_TARGET_ARCH}
|
||||
|
||||
# === BAKE BROWSERS INTO IMAGE ===
|
||||
|
||||
@@ -35,5 +38,7 @@ RUN cd /tmp/pw-java && \
|
||||
-D exec.args="install-deps" -f playwright/pom.xml --no-transfer-progress && \
|
||||
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI \
|
||||
-D exec.args="install" -f playwright/pom.xml --no-transfer-progress && \
|
||||
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI \
|
||||
-D exec.args="mark-docker-image '${DOCKER_IMAGE_NAME_TEMPLATE}'" -f playwright/pom.xml --no-transfer-progress && \
|
||||
rm -rf /tmp/pw-java && \
|
||||
chmod -R 777 $PLAYWRIGHT_BROWSERS_PATH
|
||||
|
||||
@@ -32,4 +32,6 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker build --platform "${PLATFORM}" -t "$3" -f "Dockerfile.$2" ../../
|
||||
PW_TARGET_ARCH=$(echo $1 | cut -c3-)
|
||||
|
||||
docker build --platform "${PLATFORM}" --build-arg "PW_TARGET_ARCH=${PW_TARGET_ARCH}" -t "$3" -f "Dockerfile.$2" ../../
|
||||
|
||||
@@ -117,4 +117,5 @@ publish_docker_manifest () {
|
||||
}
|
||||
|
||||
publish_docker_images_with_arch_suffix focal amd64
|
||||
publish_docker_manifest focal amd64
|
||||
publish_docker_images_with_arch_suffix focal arm64
|
||||
publish_docker_manifest focal amd64 arm64
|
||||
|
||||
Reference in New Issue
Block a user