Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 414abb83fe |
@@ -11,11 +11,11 @@ Playwright is a Java library to automate [Chromium](https://www.chromium.org/Hom
|
||||
|
||||
| | Linux | macOS | Windows |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| Chromium <!-- GEN:chromium-version -->119.0.6045.9<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| WebKit <!-- GEN:webkit-version -->17.4<!-- GEN:stop --> | ✅ | ✅ | ✅ |
|
||||
| Firefox <!-- GEN:firefox-version -->118.0.1<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| Chromium <!-- GEN:chromium-version -->117.0.5938.62<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|
||||
| WebKit <!-- GEN:webkit-version -->17.0<!-- GEN:stop --> | ✅ | ✅ | ✅ |
|
||||
| Firefox <!-- GEN:firefox-version -->117.0<!-- 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/intro#system-requirements) for details.
|
||||
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.
|
||||
|
||||
* [Usage](#usage)
|
||||
- [Add Maven dependency](#add-maven-dependency)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver-bundle</artifactId>
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>driver</artifactId>
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>examples</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
<name>Playwright Client Examples</name>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>playwright</artifactId>
|
||||
|
||||
@@ -1878,7 +1878,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -1909,7 +1909,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -1938,7 +1938,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -1969,7 +1969,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -1998,7 +1998,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2029,7 +2029,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2058,7 +2058,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2089,7 +2089,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2118,7 +2118,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2149,7 +2149,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2178,7 +2178,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
@@ -2209,7 +2209,7 @@ public interface ElementHandle extends JSHandle {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* handle.selectOption("blue");
|
||||
* // single selection matching the label
|
||||
* handle.selectOption(new SelectOption().setLabel("Blue"));
|
||||
|
||||
@@ -4058,7 +4058,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4091,7 +4091,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4122,7 +4122,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4155,7 +4155,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4186,7 +4186,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4219,7 +4219,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4250,7 +4250,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4283,7 +4283,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4314,7 +4314,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4347,7 +4347,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4378,7 +4378,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -4411,7 +4411,7 @@ public interface Frame {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* frame.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* frame.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
|
||||
@@ -2096,10 +2096,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns an array of {@code node.innerText} values for all matching nodes.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} with {@code
|
||||
* useInnerText} option to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions
|
||||
* guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* String[] texts = page.getByRole(AriaRole.LINK).allInnerTexts();
|
||||
@@ -2111,9 +2107,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns an array of {@code node.textContent} values for all matching nodes.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} to avoid
|
||||
* flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* String[] texts = page.getByRole(AriaRole.LINK).allTextContents();
|
||||
@@ -2387,10 +2380,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the number of elements matching the locator.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert the number of elements on the page, prefer {@link LocatorAssertions#hasCount
|
||||
* LocatorAssertions.hasCount()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* int count = page.getByRole(AriaRole.LISTITEM).count();
|
||||
@@ -2997,10 +2986,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the matching element's attribute value.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert an element's attribute, prefer {@link LocatorAssertions#hasAttribute
|
||||
* LocatorAssertions.hasAttribute()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* @param name Attribute name to get the value for.
|
||||
* @since v1.14
|
||||
*/
|
||||
@@ -3010,10 +2995,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the matching element's attribute value.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert an element's attribute, prefer {@link LocatorAssertions#hasAttribute
|
||||
* LocatorAssertions.hasAttribute()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* @param name Attribute name to get the value for.
|
||||
* @since v1.14
|
||||
*/
|
||||
@@ -3653,10 +3634,6 @@ public interface Locator {
|
||||
* Returns the <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText">{@code
|
||||
* element.innerText}</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} with {@code
|
||||
* useInnerText} option to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions
|
||||
* guide</a> for more details.
|
||||
*
|
||||
* @since v1.14
|
||||
*/
|
||||
default String innerText() {
|
||||
@@ -3666,19 +3643,12 @@ public interface Locator {
|
||||
* Returns the <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText">{@code
|
||||
* element.innerText}</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} with {@code
|
||||
* useInnerText} option to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions
|
||||
* guide</a> for more details.
|
||||
*
|
||||
* @since v1.14
|
||||
*/
|
||||
String innerText(InnerTextOptions options);
|
||||
/**
|
||||
* Returns the value for the matching {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert input value, prefer {@link LocatorAssertions#hasValue LocatorAssertions.hasValue()} to avoid
|
||||
* flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* String value = page.getByRole(AriaRole.TEXTBOX).inputValue();
|
||||
@@ -3699,9 +3669,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the value for the matching {@code <input>} or {@code <textarea>} or {@code <select>} element.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert input value, prefer {@link LocatorAssertions#hasValue LocatorAssertions.hasValue()} to avoid
|
||||
* flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* String value = page.getByRole(AriaRole.TEXTBOX).inputValue();
|
||||
@@ -3720,10 +3687,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that checkbox is checked, prefer {@link LocatorAssertions#isChecked LocatorAssertions.isChecked()}
|
||||
* to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more
|
||||
* details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean checked = page.getByRole(AriaRole.CHECKBOX).isChecked();
|
||||
@@ -3737,10 +3700,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is checked. Throws if the element is not a checkbox or radio input.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that checkbox is checked, prefer {@link LocatorAssertions#isChecked LocatorAssertions.isChecked()}
|
||||
* to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more
|
||||
* details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean checked = page.getByRole(AriaRole.CHECKBOX).isChecked();
|
||||
@@ -3753,10 +3712,6 @@ public interface Locator {
|
||||
* Returns whether the element is disabled, the opposite of <a
|
||||
* href="https://playwright.dev/java/docs/actionability#enabled">enabled</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is disabled, prefer {@link LocatorAssertions#isDisabled
|
||||
* LocatorAssertions.isDisabled()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean disabled = page.getByRole(AriaRole.BUTTON).isDisabled();
|
||||
@@ -3771,10 +3726,6 @@ public interface Locator {
|
||||
* Returns whether the element is disabled, the opposite of <a
|
||||
* href="https://playwright.dev/java/docs/actionability#enabled">enabled</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is disabled, prefer {@link LocatorAssertions#isDisabled
|
||||
* LocatorAssertions.isDisabled()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean disabled = page.getByRole(AriaRole.BUTTON).isDisabled();
|
||||
@@ -3786,10 +3737,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#editable">editable</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is editable, prefer {@link LocatorAssertions#isEditable
|
||||
* LocatorAssertions.isEditable()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean editable = page.getByRole(AriaRole.TEXTBOX).isEditable();
|
||||
@@ -3803,10 +3750,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#editable">editable</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is editable, prefer {@link LocatorAssertions#isEditable
|
||||
* LocatorAssertions.isEditable()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean editable = page.getByRole(AriaRole.TEXTBOX).isEditable();
|
||||
@@ -3818,10 +3761,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#enabled">enabled</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is enabled, prefer {@link LocatorAssertions#isEnabled
|
||||
* LocatorAssertions.isEnabled()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean enabled = page.getByRole(AriaRole.BUTTON).isEnabled();
|
||||
@@ -3835,10 +3774,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#enabled">enabled</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that an element is enabled, prefer {@link LocatorAssertions#isEnabled
|
||||
* LocatorAssertions.isEnabled()} to avoid flakiness. See <a
|
||||
* href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean enabled = page.getByRole(AriaRole.BUTTON).isEnabled();
|
||||
@@ -3851,9 +3786,6 @@ public interface Locator {
|
||||
* Returns whether the element is hidden, the opposite of <a
|
||||
* href="https://playwright.dev/java/docs/actionability#visible">visible</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that element is hidden, prefer {@link LocatorAssertions#isHidden LocatorAssertions.isHidden()} to
|
||||
* avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean hidden = page.getByRole(AriaRole.BUTTON).isHidden();
|
||||
@@ -3868,9 +3800,6 @@ public interface Locator {
|
||||
* Returns whether the element is hidden, the opposite of <a
|
||||
* href="https://playwright.dev/java/docs/actionability#visible">visible</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that element is hidden, prefer {@link LocatorAssertions#isHidden LocatorAssertions.isHidden()} to
|
||||
* avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean hidden = page.getByRole(AriaRole.BUTTON).isHidden();
|
||||
@@ -3882,10 +3811,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#visible">visible</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that element is visible, prefer {@link LocatorAssertions#isVisible LocatorAssertions.isVisible()}
|
||||
* to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more
|
||||
* details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean visible = page.getByRole(AriaRole.BUTTON).isVisible();
|
||||
@@ -3899,10 +3824,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns whether the element is <a href="https://playwright.dev/java/docs/actionability#visible">visible</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert that element is visible, prefer {@link LocatorAssertions#isVisible LocatorAssertions.isVisible()}
|
||||
* to avoid flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more
|
||||
* details.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* boolean visible = page.getByRole(AriaRole.BUTTON).isVisible();
|
||||
@@ -5030,9 +4951,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent">{@code node.textContent}</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} to avoid
|
||||
* flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* @since v1.14
|
||||
*/
|
||||
default String textContent() {
|
||||
@@ -5041,9 +4959,6 @@ public interface Locator {
|
||||
/**
|
||||
* Returns the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent">{@code node.textContent}</a>.
|
||||
*
|
||||
* <p> <strong>NOTE:</strong> If you need to assert text on the page, prefer {@link LocatorAssertions#hasText LocatorAssertions.hasText()} to avoid
|
||||
* flakiness. See <a href="https://playwright.dev/java/docs/test-assertions">assertions guide</a> for more details.
|
||||
*
|
||||
* @since v1.14
|
||||
*/
|
||||
String textContent(TextContentOptions options);
|
||||
|
||||
@@ -6257,7 +6257,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6290,7 +6290,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6321,7 +6321,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6354,7 +6354,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6385,7 +6385,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6418,7 +6418,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6449,7 +6449,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6482,7 +6482,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6513,7 +6513,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6546,7 +6546,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6577,7 +6577,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -6610,7 +6610,7 @@ public interface Page extends AutoCloseable {
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // Single selection matching the value or label
|
||||
* // single selection matching the value
|
||||
* page.selectOption("select#colors", "blue");
|
||||
* // single selection matching both the value and the label
|
||||
* page.selectOption("select#colors", new SelectOption().setLabel("Blue"));
|
||||
@@ -7818,8 +7818,8 @@ public interface Page extends AutoCloseable {
|
||||
*/
|
||||
ElementHandle waitForSelector(String selector, WaitForSelectorOptions options);
|
||||
/**
|
||||
* The method will block until the condition returns true. All Playwright events will be dispatched while the method is
|
||||
* waiting for the condition.
|
||||
* The method will block until the codition returns true. All Playwright events will be dispatched while the method is
|
||||
* waiting for the codition.
|
||||
*
|
||||
* <p> **Usage**
|
||||
*
|
||||
@@ -7831,15 +7831,15 @@ public interface Page extends AutoCloseable {
|
||||
* page.waitForCondition(() -> messages.size() > 3);
|
||||
* }</pre>
|
||||
*
|
||||
* @param condition Condition to wait for.
|
||||
* @param condition Codition to wait for.
|
||||
* @since v1.32
|
||||
*/
|
||||
default void waitForCondition(BooleanSupplier condition) {
|
||||
waitForCondition(condition, null);
|
||||
}
|
||||
/**
|
||||
* The method will block until the condition returns true. All Playwright events will be dispatched while the method is
|
||||
* waiting for the condition.
|
||||
* The method will block until the codition returns true. All Playwright events will be dispatched while the method is
|
||||
* waiting for the codition.
|
||||
*
|
||||
* <p> **Usage**
|
||||
*
|
||||
@@ -7851,7 +7851,7 @@ public interface Page extends AutoCloseable {
|
||||
* page.waitForCondition(() -> messages.size() > 3);
|
||||
* }</pre>
|
||||
*
|
||||
* @param condition Condition to wait for.
|
||||
* @param condition Codition to wait for.
|
||||
* @since v1.32
|
||||
*/
|
||||
void waitForCondition(BooleanSupplier condition, WaitForConditionOptions options);
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.microsoft.playwright;
|
||||
|
||||
|
||||
/**
|
||||
* {@code WebError} class represents an unhandled exception thrown in the page. It is dispatched via the {@link
|
||||
* {@code WebError} class represents an unhandled exeception thrown in the page. It is dispatched via the {@link
|
||||
* BrowserContext#onWebError BrowserContext.onWebError()} event.
|
||||
* <pre>{@code
|
||||
* // Log all uncaught errors to the terminal
|
||||
|
||||
@@ -661,22 +661,9 @@ public interface LocatorAssertions {
|
||||
* Ensures that {@code Locator} points to an <a href="https://playwright.dev/java/docs/actionability#attached">attached</a>
|
||||
* and <a href="https://playwright.dev/java/docs/actionability#visible">visible</a> DOM node.
|
||||
*
|
||||
* <p> To check that at least one element from the list is visible, use {@link Locator#first Locator.first()}.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // A specific element is visible.
|
||||
* assertThat(page.getByText("Welcome")).isVisible();
|
||||
*
|
||||
* // At least one item in the list is visible.
|
||||
* asserThat(page.getByTestId("todo-item").first()).isVisible();
|
||||
*
|
||||
* // At least one of the two elements is visible, possibly both.
|
||||
* asserThat(
|
||||
* page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
|
||||
* .or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up")))
|
||||
* .first()
|
||||
* ).isVisible();
|
||||
* }</pre>
|
||||
*
|
||||
* @since v1.20
|
||||
@@ -688,22 +675,9 @@ public interface LocatorAssertions {
|
||||
* Ensures that {@code Locator} points to an <a href="https://playwright.dev/java/docs/actionability#attached">attached</a>
|
||||
* and <a href="https://playwright.dev/java/docs/actionability#visible">visible</a> DOM node.
|
||||
*
|
||||
* <p> To check that at least one element from the list is visible, use {@link Locator#first Locator.first()}.
|
||||
*
|
||||
* <p> **Usage**
|
||||
* <pre>{@code
|
||||
* // A specific element is visible.
|
||||
* assertThat(page.getByText("Welcome")).isVisible();
|
||||
*
|
||||
* // At least one item in the list is visible.
|
||||
* asserThat(page.getByTestId("todo-item").first()).isVisible();
|
||||
*
|
||||
* // At least one of the two elements is visible, possibly both.
|
||||
* asserThat(
|
||||
* page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
|
||||
* .or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up")))
|
||||
* .first()
|
||||
* ).isVisible();
|
||||
* }</pre>
|
||||
*
|
||||
* @since v1.20
|
||||
|
||||
@@ -672,7 +672,8 @@ class BrowserContextImpl extends ChannelOwner implements BrowserContext {
|
||||
bindingCall.call(binding);
|
||||
}
|
||||
} else if ("console".equals(event)) {
|
||||
ConsoleMessageImpl message = new ConsoleMessageImpl(connection, params);
|
||||
String guid = params.getAsJsonObject("message").get("guid").getAsString();
|
||||
ConsoleMessageImpl message = connection.getExistingObject(guid);
|
||||
listeners.notify(BrowserContextImpl.EventType.CONSOLE, message);
|
||||
PageImpl page = message.page();
|
||||
if (page != null) {
|
||||
|
||||
@@ -183,7 +183,7 @@ class BrowserImpl extends ChannelOwner implements Browser {
|
||||
}
|
||||
if (options.recordVideoDir != null) {
|
||||
JsonObject recordVideo = new JsonObject();
|
||||
recordVideo.addProperty("dir", options.recordVideoDir.toAbsolutePath().toString());
|
||||
recordVideo.addProperty("dir", options.recordVideoDir.toString());
|
||||
if (options.recordVideoSize != null) {
|
||||
recordVideo.add("size", gson().toJsonTree(options.recordVideoSize));
|
||||
}
|
||||
|
||||
@@ -33,6 +33,8 @@ import static com.microsoft.playwright.impl.Serialization.gson;
|
||||
import static com.microsoft.playwright.impl.Utils.convertType;
|
||||
|
||||
class BrowserTypeImpl extends ChannelOwner implements BrowserType {
|
||||
LocalUtils localUtils;
|
||||
|
||||
BrowserTypeImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
super(parent, type, guid, initializer);
|
||||
}
|
||||
@@ -201,7 +203,7 @@ class BrowserTypeImpl extends ChannelOwner implements BrowserType {
|
||||
}
|
||||
if (options.recordVideoDir != null) {
|
||||
JsonObject recordVideo = new JsonObject();
|
||||
recordVideo.addProperty("dir", options.recordVideoDir.toAbsolutePath().toString());
|
||||
recordVideo.addProperty("dir", options.recordVideoDir.toString());
|
||||
if (options.recordVideoSize != null) {
|
||||
recordVideo.add("size", gson().toJsonTree(options.recordVideoSize));
|
||||
}
|
||||
|
||||
@@ -18,11 +18,11 @@ package com.microsoft.playwright.impl;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.microsoft.playwright.PlaywrightException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -34,7 +34,6 @@ class ChannelOwner extends LoggingSupport {
|
||||
final String type;
|
||||
final String guid;
|
||||
final JsonObject initializer;
|
||||
private boolean wasCollected;
|
||||
|
||||
protected ChannelOwner(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
this(parent.connection, parent, type, guid, initializer);
|
||||
@@ -58,16 +57,15 @@ class ChannelOwner extends LoggingSupport {
|
||||
}
|
||||
}
|
||||
|
||||
void disposeChannelOwner(boolean wasGarbageCollected) {
|
||||
void disconnect() {
|
||||
// Clean up from parent and connection.
|
||||
if (parent != null) {
|
||||
parent.objects.remove(guid);
|
||||
}
|
||||
connection.unregisterObject(guid);
|
||||
wasCollected = wasGarbageCollected;
|
||||
// Dispose all children.
|
||||
for (ChannelOwner child : new ArrayList<>(objects.values())) {
|
||||
child.disposeChannelOwner(wasGarbageCollected);
|
||||
child.disconnect();
|
||||
}
|
||||
objects.clear();
|
||||
}
|
||||
@@ -93,7 +91,6 @@ class ChannelOwner extends LoggingSupport {
|
||||
}
|
||||
|
||||
WaitableResult<JsonElement> sendMessageAsync(String method, JsonObject params) {
|
||||
checkNotCollected();
|
||||
return connection.sendMessageAsync(guid, method, params);
|
||||
}
|
||||
|
||||
@@ -102,15 +99,9 @@ class ChannelOwner extends LoggingSupport {
|
||||
}
|
||||
|
||||
JsonElement sendMessage(String method, JsonObject params) {
|
||||
checkNotCollected();
|
||||
return connection.sendMessage(guid, method, params);
|
||||
}
|
||||
|
||||
private void checkNotCollected() {
|
||||
if (wasCollected)
|
||||
throw new PlaywrightException("The object has been collected to prevent unbounded heap growth.");
|
||||
}
|
||||
|
||||
<T> T runUntil(Runnable code, Waitable<T> waitable) {
|
||||
try {
|
||||
code.run();
|
||||
|
||||
@@ -252,8 +252,7 @@ public class Connection {
|
||||
return;
|
||||
}
|
||||
if (message.method.equals("__dispose__")) {
|
||||
boolean wasCollected = message.params.has("reason") && "gc".equals(message.params.get("reason").getAsString());
|
||||
object.disposeChannelOwner(wasCollected);
|
||||
object.disconnect();
|
||||
return;
|
||||
}
|
||||
object.handleEvent(message.method, message.params);
|
||||
@@ -294,6 +293,9 @@ public class Connection {
|
||||
case "BrowserContext":
|
||||
result = new BrowserContextImpl(parent, type, guid, initializer);
|
||||
break;
|
||||
case "ConsoleMessage":
|
||||
result = new ConsoleMessageImpl(parent, type, guid, initializer);
|
||||
break;
|
||||
case "Dialog":
|
||||
result = new DialogImpl(parent, type, guid, initializer);
|
||||
break;
|
||||
|
||||
@@ -27,20 +27,17 @@ import java.util.List;
|
||||
|
||||
import static com.microsoft.playwright.impl.Serialization.gson;
|
||||
|
||||
public class ConsoleMessageImpl implements ConsoleMessage {
|
||||
private final Connection connection;
|
||||
public class ConsoleMessageImpl extends ChannelOwner implements ConsoleMessage {
|
||||
private PageImpl page;
|
||||
private final JsonObject initializer;
|
||||
|
||||
public ConsoleMessageImpl(Connection connection, JsonObject initializer) {
|
||||
this.connection = connection;
|
||||
public ConsoleMessageImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
super(parent, type, guid, initializer);
|
||||
// Note: currently, we only report console messages for pages and they always have a page.
|
||||
// However, in the future we might report console messages for service workers or something else,
|
||||
// where page() would be null.
|
||||
if (initializer.has("page")) {
|
||||
page = connection.getExistingObject(initializer.getAsJsonObject("page").get("guid").getAsString());
|
||||
}
|
||||
this.initializer = initializer;
|
||||
}
|
||||
|
||||
public String type() {
|
||||
|
||||
@@ -105,7 +105,7 @@ public class LocatorAssertionsImpl extends AssertionsBase implements LocatorAsse
|
||||
if (expectedValue instanceof Pattern) {
|
||||
message += " matching regex";
|
||||
}
|
||||
expectImpl("to.have.attribute.value", expectedText, expectedValue, message, commonOptions);
|
||||
expectImpl("to.have.attribute", expectedText, expectedValue, message, commonOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -63,6 +63,7 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright {
|
||||
private final BrowserTypeImpl webkit;
|
||||
private final SelectorsImpl selectors;
|
||||
private final APIRequestImpl apiRequest;
|
||||
private final LocalUtils localUtils;
|
||||
private SharedSelectors sharedSelectors;
|
||||
|
||||
PlaywrightImpl(ChannelOwner parent, String type, String guid, JsonObject initializer) {
|
||||
@@ -73,6 +74,10 @@ public class PlaywrightImpl extends ChannelOwner implements Playwright {
|
||||
|
||||
selectors = connection.getExistingObject(initializer.getAsJsonObject("selectors").get("guid").getAsString());
|
||||
apiRequest = new APIRequestImpl(this);
|
||||
localUtils = connection.getExistingObject(initializer.getAsJsonObject("utils").get("guid").getAsString());
|
||||
chromium.localUtils = localUtils;
|
||||
firefox.localUtils = localUtils;
|
||||
webkit.localUtils = localUtils;
|
||||
}
|
||||
|
||||
void initSharedSelectors(PlaywrightImpl parent) {
|
||||
|
||||
@@ -77,8 +77,19 @@ class TracingImpl extends ChannelOwner implements Tracing {
|
||||
connection.localUtils.zip(path, new JsonArray(), stacksId, true, includeSources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(StartOptions options) {
|
||||
withLogging("Tracing.start", () -> startImpl(options));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startChunk(StartChunkOptions options) {
|
||||
withLogging("Tracing.startChunk", () -> {
|
||||
startChunkImpl(options);
|
||||
});
|
||||
}
|
||||
|
||||
private void startChunkImpl(StartChunkOptions options) {
|
||||
if (options == null) {
|
||||
options = new StartChunkOptions();
|
||||
}
|
||||
@@ -105,8 +116,7 @@ class TracingImpl extends ChannelOwner implements Tracing {
|
||||
stacksId = connection.localUtils().tracingStarted(tracesDir == null ? null : tracesDir.toString(), traceName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(StartOptions options) {
|
||||
private void startImpl(StartOptions options) {
|
||||
if (options == null) {
|
||||
options = new StartOptions();
|
||||
}
|
||||
@@ -121,13 +131,17 @@ class TracingImpl extends ChannelOwner implements Tracing {
|
||||
|
||||
@Override
|
||||
public void stop(StopOptions options) {
|
||||
stopChunkImpl(options == null ? null : options.path);
|
||||
sendMessage("tracingStop");
|
||||
withLogging("Tracing.stop", () -> {
|
||||
stopChunkImpl(options == null ? null : options.path);
|
||||
sendMessage("tracingStop");
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopChunk(StopChunkOptions options) {
|
||||
stopChunkImpl(options == null ? null : options.path);
|
||||
withLogging("Tracing.stopChunk", () -> {
|
||||
stopChunkImpl(options == null ? null : options.path);
|
||||
});
|
||||
}
|
||||
|
||||
void setTracesDir(Path tracesDir) {
|
||||
|
||||
@@ -38,14 +38,6 @@ public class TestBrowserContextAddCookies extends TestBase {
|
||||
assertEquals("password=123456", page.evaluate("document.cookie"));
|
||||
}
|
||||
|
||||
// Slightly different rounding on chromium win.
|
||||
private static List<Cookie> normalizeExpires(List<Cookie> cookies) {
|
||||
for (Cookie cookie: cookies) {
|
||||
cookie.expires = (double) Math.round(cookie.expires);
|
||||
}
|
||||
return cookies;
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldRoundtripCookie() {
|
||||
page.navigate(server.EMPTY_PAGE);
|
||||
@@ -61,7 +53,7 @@ public class TestBrowserContextAddCookies extends TestBase {
|
||||
context.clearCookies();
|
||||
assertEquals(0, context.cookies().size());
|
||||
context.addCookies(cookies);
|
||||
assertJsonEquals(normalizeExpires(cookies), normalizeExpires(context.cookies()));
|
||||
assertJsonEquals(cookies, context.cookies());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -175,33 +175,17 @@ public class TestBrowserContextProxy extends TestBase {
|
||||
// @see https://gist.github.com/CollinChaffin/24f6c9652efb3d6d5ef2f5502720ef00
|
||||
.setBypass("1.non.existent.domain.for.the.test, 2.non.existent.domain.for.the.test, .another.test")));
|
||||
|
||||
{
|
||||
Page page = context.newPage();
|
||||
page.navigate("http://0.non.existent.domain.for.the.test/target.html");
|
||||
assertEquals("Served by the proxy", page.title());
|
||||
page.close();
|
||||
}
|
||||
{
|
||||
Page page = context.newPage();
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://1.non.existent.domain.for.the.test/target.html"));
|
||||
page.close();
|
||||
}
|
||||
{
|
||||
Page page = context.newPage();
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://2.non.existent.domain.for.the.test/target.html"));
|
||||
page.close();
|
||||
}
|
||||
{
|
||||
Page page = context.newPage();
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://foo.is.the.another.test/target.html"));
|
||||
page.close();
|
||||
}
|
||||
{
|
||||
Page page = context.newPage();
|
||||
page.navigate("http://3.non.existent.domain.for.the.test/target.html");
|
||||
assertEquals("Served by the proxy", page.title());
|
||||
page.close();
|
||||
}
|
||||
Page page = context.newPage();
|
||||
page.navigate("http://0.non.existent.domain.for.the.test/target.html");
|
||||
assertEquals("Served by the proxy", page.title());
|
||||
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://1.non.existent.domain.for.the.test/target.html"));
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://2.non.existent.domain.for.the.test/target.html"));
|
||||
assertThrows(PlaywrightException.class, () -> page.navigate("http://foo.is.the.another.test/target.html"));
|
||||
|
||||
page.navigate("http://3.non.existent.domain.for.the.test/target.html");
|
||||
assertEquals("Served by the proxy", page.title());
|
||||
|
||||
context.close();
|
||||
}
|
||||
|
||||
|
||||
@@ -379,7 +379,11 @@ public class TestPageKeyboard extends TestBase {
|
||||
} else {
|
||||
assertEquals("Meta", eventData.get("key"));
|
||||
}
|
||||
assertEquals("MetaLeft", eventData.get("code"));
|
||||
if (isFirefox()) {
|
||||
assertEquals("OSLeft", eventData.get("code"));
|
||||
} else {
|
||||
assertEquals("MetaLeft", eventData.get("code"));
|
||||
}
|
||||
if (isFirefox() && !isMac) {
|
||||
assertFalse((Boolean) eventData.get("metaKey"), eventData.toString());
|
||||
} else {
|
||||
|
||||
@@ -135,14 +135,4 @@ public class TestPageNetworkRequest extends TestBase {
|
||||
assertTrue(error[0].getMessage().contains("Frame for this navigation request is not available"), error[0].getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldThrowIfRequestWasGCed() {
|
||||
List<Request> requests = new ArrayList<>();
|
||||
page.onRequest(req -> requests.add(req));
|
||||
for (int i = 0; i < 1001; i++) {
|
||||
page.navigate(server.EMPTY_PAGE);
|
||||
}
|
||||
PlaywrightException e = assertThrows(PlaywrightException.class, () -> requests.get(0).response());
|
||||
assertEquals("The object has been collected to prevent unbounded heap growth.", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -389,7 +389,7 @@ public class TestPageRoute extends TestBase {
|
||||
Request r = intercepted.get(1);
|
||||
for (String url : asList("/one-style.css", "/two-style.css", "/three-style.css", "/four-style.css")) {
|
||||
assertEquals("stylesheet", r.resourceType());
|
||||
assertTrue(r.url().contains(url), "actual: " + r.url() + "; expected: " + url);
|
||||
assertTrue(r.url().contains(url));
|
||||
r = r.redirectedTo();
|
||||
}
|
||||
assertNull(r);
|
||||
|
||||
@@ -21,7 +21,6 @@ import com.microsoft.playwright.options.FilePayload;
|
||||
import org.junit.jupiter.api.Assumptions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import org.junit.platform.commons.support.AnnotationSupport;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
@@ -37,7 +36,6 @@ import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static com.microsoft.playwright.Utils.relativePathOrSkipTest;
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
@@ -147,7 +145,8 @@ public class TestPageSetInputFiles extends TestBase {
|
||||
" return events;\n" +
|
||||
" }");
|
||||
|
||||
Path relativeUploadPath = relativePathOrSkipTest(uploadFile);
|
||||
Path cwd = Paths.get("").toAbsolutePath();
|
||||
Path relativeUploadPath = cwd.relativize(uploadFile);
|
||||
assertFalse(relativeUploadPath.isAbsolute());
|
||||
input.setInputFiles(relativeUploadPath);
|
||||
assertEquals("200MB.zip", input.evaluate("e => e.files[0].name"));
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package com.microsoft.playwright;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static com.microsoft.playwright.Utils.relativePathOrSkipTest;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class TestVideo extends TestBase {
|
||||
@Test
|
||||
void shouldWorkWithRelativePathForRecordVideoDir(@TempDir Path tmpDir) {
|
||||
Path relativeDir = relativePathOrSkipTest(tmpDir);
|
||||
BrowserContext context = browser.newContext(new Browser.NewContextOptions()
|
||||
.setRecordVideoSize(320, 240).setRecordVideoDir(relativeDir));
|
||||
Page page = context.newPage();
|
||||
Path videoPath = page.video().path();
|
||||
context.close();
|
||||
assertTrue(videoPath.isAbsolute(), "videosPath = " + videoPath);
|
||||
assertTrue(Files.exists(videoPath), "videosPath = " + videoPath);
|
||||
}
|
||||
}
|
||||
@@ -19,13 +19,11 @@ package com.microsoft.playwright;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.junit.jupiter.api.Assumptions;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.ServerSocket;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -216,17 +214,4 @@ class Utils {
|
||||
static String generateDifferentOriginPort(final Server server){
|
||||
return server.PREFIX.replace(String.valueOf(server.PORT), String.valueOf(server.PORT+1));
|
||||
}
|
||||
|
||||
static Path relativePathOrSkipTest(Path path) {
|
||||
Path cwd = Paths.get("").toAbsolutePath();
|
||||
try {
|
||||
return cwd.relativize(path.toAbsolutePath());
|
||||
} catch (IllegalArgumentException e) {
|
||||
// May happen on Windows when the path and temp are on different disks.
|
||||
if (e.getMessage().contains("has different root")) {
|
||||
Assumptions.assumeTrue(false, "cwd is on another disk, skipping the test.");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>parent-pom</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.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.39.0
|
||||
1.38.0
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>api-generator</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.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-fatjar</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
<name>Test Playwright Command Line FatJar</name>
|
||||
<properties>
|
||||
<compiler.version>1.8</compiler.version>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.microsoft.playwright</groupId>
|
||||
<artifactId>test-cli-version</artifactId>
|
||||
<version>1.39.0</version>
|
||||
<version>1.38.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.39.0</version>
|
||||
<version>1.38.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.39.0</version>
|
||||
<version>1.38.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.39.0</version>
|
||||
<version>1.38.0</version>
|
||||
<name>Playwright - Update Version in Documentation</name>
|
||||
<description>
|
||||
This is an internal module used to update versions in the documentation based on
|
||||
|
||||
@@ -24,7 +24,7 @@ RUN apt-get update && \
|
||||
# Create the pwuser
|
||||
adduser pwuser
|
||||
|
||||
RUN VERSION=3.9.4 && \
|
||||
RUN VERSION=3.8.8 && \
|
||||
curl -o - https://archive.apache.org/dist/maven/maven-3/$VERSION/binaries/apache-maven-$VERSION-bin.tar.gz | tar zxfv - -C /opt/ && \
|
||||
ln -s /opt/apache-maven-$VERSION/bin/mvn /usr/local/bin/
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ RUN apt-get update && \
|
||||
# Create the pwuser
|
||||
adduser pwuser
|
||||
|
||||
RUN VERSION=3.9.4 && \
|
||||
RUN VERSION=3.8.8 && \
|
||||
curl -o - https://archive.apache.org/dist/maven/maven-3/$VERSION/binaries/apache-maven-$VERSION-bin.tar.gz | tar zxfv - -C /opt/ && \
|
||||
ln -s /opt/apache-maven-$VERSION/bin/mvn /usr/local/bin/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user