diff --git a/AGENTS.md b/AGENTS.md
index 043c345..43ea7a6 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,40 +1,69 @@
# Repository Guidelines
## Project Structure & Module Organization
-- `dramafinder/` — Core Playwright helpers for Vaadin (`src/main/java/...`), resources under `src/main/resources`.
-- `dramafinder-demo/` — Spring Boot Vaadin demo app; integration tests in `src/test/java` with `*IT.java`.
-- `dramafinder-test-reporting/` — Utilities for test reporting/aggregation.
-- Root `pom.xml` — Maven multi-module parent (Java 17).
+
+- Root `pom.xml` — Core Playwright helpers for Vaadin (`src/main/java/...`),
+ resources under `src/main/resources`.
## Build, Test, and Development Commands
+
- Build all modules + unit tests: `./mvnw clean install`
-- Run demo locally: `./mvnw -pl dramafinder-demo spring-boot:run` (serves at http://localhost:8080)
-- Run integration tests (Failsafe, includes `**/*IT.java`): `./mvnw -pl dramafinder-demo verify -Pit`
+- Run demo locally: `./mvnw -pl dramafinder-demo spring-boot:run` (serves
+ at http://localhost:8080)
+- Run integration tests (Failsafe, includes `**/*IT.java`):
+ `./mvnw -B verify --file pom.xml`
- Run a single test:
- - Unit: `./mvnw -Dtest=MyClassTest test`
- - IT: `./mvnw -pl dramafinder-demo -Dit.test=MyViewIT -Pit verify`
+ - IT: `./mvnw -Dit.test=MyViewIT -Pit verify`
## Coding Style & Naming Conventions
-- Java 17; 4-space indent; organize imports; no trailing whitespace.
-- Packages: lowercase (`org.vaadin.dramafinder`); classes: `PascalCase`; methods/fields: `camelCase`; constants: `UPPER_SNAKE_CASE`.
-- Public API in `dramafinder` should be small, cohesive, and documented with Javadoc.
+
+- Java 21; 4-space indent; organize imports; no trailing whitespace.
+- Packages: lowercase (`org.vaadin.dramafinder`); classes: `PascalCase`;
+ methods/fields: `camelCase`; constants: `UPPER_SNAKE_CASE`.
+- Public API in `dramafinder` should be small, cohesive, and documented with
+ Javadoc.
+- Prefer aria role for internal locators
+
+### Javadoc Conventions
+
+- Add a class-level Javadoc for each element class and shared mixin:
+ - Identify the Vaadin tag using inline code (e.g., `vaadin-text-field`).
+ - One–two sentence summary of responsibilities and notable behaviors.
+ - For factory helpers (e.g., `getByLabel`), mention the ARIA role used.
+- For public methods, document parameters, return values, and null semantics
+ (especially for assertion helpers where `null` implies absence).
+- Use `{@inheritDoc}` on simple overrides (e.g., locator accessors) to avoid
+ duplication.
+- Keep Javadoc concise and consistent; prefer present tense and active voice.
## Testing Guidelines
+
- Frameworks: JUnit 5, Playwright (Java), Axe-core checks in demo.
-- Unit tests live with their module; integration tests go in `dramafinder-demo/src/test/java/**/*IT.java`.
-- Tests should be deterministic; avoid timing sleeps—prefer Playwright waits and assertions.
+- Unit tests live with their module; integration tests go in
+ `src/test/java/**/*IT.java`.
+- Tests should be deterministic; avoid timing sleeps—prefer Playwright waits and
+ assertions.
## Commit & Pull Request Guidelines
-- Commits: short, imperative subject; optional scope prefix (e.g., `core:`, `demo:`). Example: `core: add VaadinQuery helper for nested locators`.
-- PRs: describe intent and approach, link issues, list test coverage and manual steps; include screenshots/gifs for UI changes.
-- Keep changes module-scoped; update README/AGENTS.md when commands or workflows change.
+
+- Commits: short, imperative subject; optional scope prefix (e.g., `core:`,
+ `demo:`). Example: `core: add TestFieldElement to test a Vaadin Textfield`.
+- PRs: describe intent and approach, link issues, list test coverage and manual
+ steps; include screenshots/gifs for UI changes.
+- Keep changes module-scoped; update README/AGENTS.md when commands or workflows
+ change.
## Security & Configuration Tips
-- Requires Java 17. Vaadin demo uses Node tooling; first runs may download frontend and Playwright browser binaries.
-- Do not commit generated/build output: `target/`, `frontend/generated/`, `vite.generated.ts`.
-- Prefer configuration via `application.properties` in each module’s `src/main/resources`.
+
+- Requires Java 21. Vaadin demo uses Node tooling; first runs may download
+ frontend and Playwright browser binaries.
+- Do not commit generated/build output: `target/`, `frontend/generated/`,
+ `vite.generated.ts`.
+- Prefer configuration via `application.properties` in each module’s
+ `src/main/resources`.
## Agent-Specific Instructions
-- Follow this file’s conventions for any edits. Keep patches minimal and focused.
-- Add unit tests for new public APIs in `dramafinder`; use `*IT.java` only for end-to-end flows in `dramafinder-demo`.
+- Follow this file’s conventions for any edits. Keep patches minimal and
+ focused.
+- Use `*IT.java` only for end-to-end tests executed by Failsafe.
diff --git a/GEMINI.md b/GEMINI.md
new file mode 100644
index 0000000..631d054
--- /dev/null
+++ b/GEMINI.md
@@ -0,0 +1,75 @@
+# Drama Finder Project Overview
+
+This document provides an overview of the Drama Finder project, its purpose, and key development aspects relevant for automated agents.
+
+## Project Purpose
+
+Drama Finder is a set of helper classes designed to facilitate testing of Vaadin applications using Playwright. It offers a collection of assertions and actions for Vaadin components, simplifying the creation of robust integration tests.
+
+## Key Technologies
+
+* **Vaadin:** Frontend framework for web applications.
+* **Playwright:** A Node.js library to automate Chromium, Firefox and WebKit with a single API. Used here for browser automation and testing.
+* **Spring Boot:** Used for the test/demo server and integration tests.
+* **Maven:** Project build automation tool.
+* **JUnit:** Testing framework.
+* **Axe-core:** Used for accessibility testing within integration tests.
+
+## Project Structure Highlights
+
+* `src/main/java/`: Contains the core Java helper classes for Vaadin and Playwright integration.
+* `src/test/java/`: Contains unit and integration tests for the Drama Finder library itself, as well as demo application tests.
+* `pom.xml`: Maven project configuration, including dependencies and build profiles.
+
+## Development & Testing
+
+### Starting the Demo Server
+
+To run the demo application (used for testing the Drama Finder library):
+
+```bash
+mvn spring-boot:run
+```
+
+The demo will be available at `http://localhost:8080`.
+
+### Running Unit Tests
+
+```bash
+mvn test
+```
+
+### Running Integration Tests
+
+Integration tests are located in `src/test/java/.../it/` and are run with the `it` Maven profile.
+
+```bash
+mvn -Pit verify
+```
+
+## How to Use Drama Finder
+
+To incorporate Drama Finder into a Vaadin project, add it as a test dependency in your `pom.xml`:
+
+```xml
+
+ * Provides shared behavior for numeric inputs, including access to step
+ * controls (increase/decrease buttons) and common mixins for validation,
+ * input handling, theming, accessibility, and focus.
+ */
public abstract class AbstractNumberFieldElement extends VaadinElement
implements HasValidationPropertiesElement, HasInputFieldElement,
HasPrefixElement, HasSuffixElement, HasClearButtonElement,
HasPlaceholderElement, HasAllowedCharPatternElement, HasThemeElement,
FocusableElement, HasAriaLabelElement, HasEnabledElement, HasTooltipElement {
+ /**
+ * Creates a new {@code AbstractNumberFieldElement}.
+ *
+ * @param locator the locator pointing at the component root element
+ */
public AbstractNumberFieldElement(Locator locator) {
super(locator);
}
-
+ /**
+ * Whether the step controls (increase/decrease buttons) are visible.
+ *
+ * @return {@code true} if the attribute is present, otherwise {@code false}
+ */
public boolean getHasControls() {
String v = getLocator().getAttribute("step-buttons-visible");
return Boolean.parseBoolean(v);
}
+ /**
+ * Assert the visibility of step controls.
+ *
+ * @param hasControls expected presence of the controls
+ */
public void assertHasControls(boolean hasControls) {
if (hasControls) {
assertThat(getLocator()).hasAttribute("step-buttons-visible", "");
@@ -40,10 +61,16 @@ public void assertHasControls(boolean hasControls) {
}
}
+ /**
+ * Click the increase button.
+ */
public void clickIncreaseButton() {
getLocator().locator("[part='increase-button']").click();
}
+ /**
+ * Click the decrease button.
+ */
public void clickDecreaseButton() {
getLocator().locator("[part='decrease-button']").click();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/AccordionElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/AccordionElement.java
index 758b135..e22f6af 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/AccordionElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/AccordionElement.java
@@ -5,44 +5,79 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * PlaywrightElement for {@code
+ * Provides helpers to access panels by their summary text and to assert
+ * open/closed state and panel count.
+ */
@PlaywrightElement(AccordionElement.FIELD_TAG_NAME)
public class AccordionElement extends VaadinElement implements HasStyleElement {
public static final String FIELD_TAG_NAME = "vaadin-accordion";
+ /**
+ * Create a new {@code AccordionElement}.
+ *
+ * @param locator the locator for the {@code
+ * Offers utilities to toggle open state, read summary and access content.
+ */
@PlaywrightElement(AccordionPanelElement.FIELD_TAG_NAME)
public class AccordionPanelElement extends VaadinElement {
public static final String FIELD_TAG_NAME = "vaadin-accordion-panel";
public static final String FIELD_HEADING_TAG_NAME = "vaadin-accordion-heading";
+ /**
+ * Create a new {@code AccordionPanelElement}.
+ */
public AccordionPanelElement(Locator locator) {
super(locator);
}
+ /** Assert that the panel is opened. */
public void assertOpened() {
assertThat(getLocator()).hasAttribute("opened", "");
}
+ /** Assert that the panel is closed. */
public void assertClosed() {
assertThat(getLocator()).not().hasAttribute("opened", "");
}
+ /** Whether the panel is open. */
public boolean isOpen() {
return getLocator().getAttribute("opened") != null;
}
+ /** Set the open state by clicking the summary when needed. */
public void setOpen(boolean open) {
if (isOpen() != open) {
getSummaryLocator().click();
}
}
+ /** Locator pointing to the summary heading. */
public Locator getSummaryLocator() {
return getLocator().locator(FIELD_HEADING_TAG_NAME);
}
+ /** Text content of the summary heading. */
public String getSummaryText() {
return getSummaryLocator().textContent();
}
+ /** Locator pointing to the first non-slotted content element. */
public Locator getContentLocator() {
return getLocator().locator("xpath=./*[not(@slot)][1]");
}
+ /** Assert that the content area is visible. */
public void assertContentVisible() {
assertThat(getContentLocator()).isVisible();
}
+ /** Assert that the content area is not visible. */
public void assertContentNotVisible() {
assertThat(getContentLocator()).not().isVisible();
}
+ /** Get an accordion panel by its summary text within a scope. */
public static AccordionPanelElement getAccordionPanelBySummary(Locator locator, String summary) {
return new AccordionPanelElement(locator.locator(FIELD_TAG_NAME).filter(
new Locator.FilterOptions().setHas(
@@ -61,6 +79,7 @@ public static AccordionPanelElement getAccordionPanelBySummary(Locator locator,
)));
}
+ /** Get the currently opened accordion panel within a scope. */
public static AccordionPanelElement getOpenedAccordionPanel(Locator locator) {
return new AccordionPanelElement(locator.locator(FIELD_TAG_NAME).filter(
new Locator.FilterOptions().setHas(
@@ -68,10 +87,12 @@ public static AccordionPanelElement getOpenedAccordionPanel(Locator locator) {
)));
}
+ /** Assert that the panel is enabled. */
public void assertEnabled() {
assertThat(getLocator()).not().hasAttribute("disabled", "");
}
+ /** Assert that the panel is disabled. */
public void assertDisabled() {
assertThat(getLocator()).hasAttribute("disabled", "");
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/BigDecimalFieldElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/BigDecimalFieldElement.java
index 571d58c..4862ce4 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/BigDecimalFieldElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/BigDecimalFieldElement.java
@@ -16,6 +16,9 @@
import org.vaadin.addons.dramafinder.element.shared.HasTooltipElement;
import org.vaadin.addons.dramafinder.element.shared.HasValidationPropertiesElement;
+/**
+ * PlaywrightElement for {@code
+ * Provides lookup helpers based on accessible name or visible text and
+ * exposes common focus, aria-label, enablement, prefix/suffix and theming mixins.
+ */
@PlaywrightElement(ButtonElement.FIELD_TAG_NAME)
public class ButtonElement extends VaadinElement
implements FocusableElement, HasAriaLabelElement, HasEnabledElement,
@@ -19,21 +25,33 @@ public class ButtonElement extends VaadinElement
public static final String FIELD_TAG_NAME = "vaadin-button";
+ /**
+ * Create a new {@code ButtonElement}.
+ *
+ * @param locator the locator for the {@code
+ * Provides helpers to read and modify checked/indeterminate state and
+ * access common mixins for label, helper, validation and enablement.
+ */
@PlaywrightElement(CheckboxElement.FIELD_TAG_NAME)
public class CheckboxElement extends VaadinElement
implements FocusableElement, HasAriaLabelElement, HasEnabledElement,
@@ -21,6 +27,11 @@ public class CheckboxElement extends VaadinElement
public static final String FIELD_TAG_NAME = "vaadin-checkbox";
+ /**
+ * Create a new {@code CheckboxElement}.
+ *
+ * @param locator the locator for the {@code
+ * Adds convenience methods for {@link LocalDate} values and lookup by label.
+ */
@PlaywrightElement(DatePickerElement.FIELD_TAG_NAME)
public class DatePickerElement extends VaadinElement implements HasInputFieldElement, HasValidationPropertiesElement,
HasClearButtonElement, HasPlaceholderElement, HasThemeElement, FocusableElement, HasAriaLabelElement,
@@ -27,15 +32,30 @@ public class DatePickerElement extends VaadinElement implements HasInputFieldEle
public static final String FIELD_TAG_NAME = "vaadin-date-picker";
+ /**
+ * Create a new {@code DatePickerElement}.
+ *
+ * @param locator the locator for the {@code
+ * Composes a {@link DatePickerElement} and {@link TimePickerElement} and exposes
+ * helpers to interact using {@link LocalDateTime}.
+ */
@PlaywrightElement(DateTimePickerElement.FIELD_TAG_NAME)
public class DateTimePickerElement extends VaadinElement implements HasInputFieldElement, HasValidationPropertiesElement,
HasClearButtonElement, HasPlaceholderElement, HasThemeElement, FocusableElement, HasAriaLabelElement,
@@ -37,18 +43,33 @@ public class DateTimePickerElement extends VaadinElement implements HasInputFiel
.append(TimePickerElement.LOCAL_TIME)
.toFormatter();
+ /**
+ * Create a new {@code DateTimePickerElement}.
+ *
+ * @param locator the locator for the {@code
+ * Provides helpers to open/close and access the summary/content.
+ */
@PlaywrightElement(DetailsElement.FIELD_TAG_NAME)
public class DetailsElement extends VaadinElement implements HasStyleElement, HasThemeElement,
HasTooltipElement {
public static final String FIELD_TAG_NAME = "vaadin-details";
+ /** Create a new {@code DetailsElement}. */
public DetailsElement(Locator locator) {
super(locator);
}
+ /** Assert that the component is enabled. */
public void assertEnabled() {
assertThat(getLocator()).not().hasAttribute("disabled", "");
}
+ /** Assert that the component is disabled. */
public void assertDisabled() {
assertThat(getLocator()).hasAttribute("disabled", "");
}
+ /** Assert that the details is opened. */
public void assertOpened() {
assertThat(getLocator()).hasAttribute("opened", "");
}
+ /** Assert that the details is closed. */
public void assertClosed() {
assertThat(getLocator()).not().hasAttribute("opened", "");
}
+ /** Whether the details is opened. */
public boolean isOpen() {
return getLocator().getAttribute("opened") != null;
}
+ /** Set the opened state by clicking the summary when necessary. */
public void setOpen(boolean open) {
if (isOpen() != open) {
getSummaryLocator().click();
}
}
+ /** Locator for the summary element. */
public Locator getSummaryLocator() {
return getLocator().locator("vaadin-details-summary");
}
+ /** Text of the summary element. */
public String getSummaryText() {
return getSummaryLocator().textContent();
}
+ /** Locator for the currently visible content container. */
public Locator getContentLocator() {
return getLocator().locator("> div[aria-hidden='false']");
}
+ /** Get a details component by its summary text. */
public static DetailsElement getBySummaryText(Page page, String summary) {
return new DetailsElement(
page.locator(FIELD_TAG_NAME).filter(
@@ -67,10 +83,12 @@ public static DetailsElement getBySummaryText(Page page, String summary) {
);
}
+ /** Assert that the content is visible. */
public void assertContentVisible() {
assertThat(getContentLocator()).isVisible();
}
+ /** Assert that the content is not visible. */
public void assertContentNotVisible() {
assertThat(getContentLocator()).not().isVisible();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/DialogElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/DialogElement.java
index f4d82b9..f8f7860 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/DialogElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/DialogElement.java
@@ -8,67 +8,89 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * PlaywrightElement for {@code
+ * Provides access to header/content/footer slots, modal flags and open state.
+ */
public class DialogElement extends VaadinElement implements HasThemeElement, HasStyleElement {
public static final String FIELD_TAG_NAME = "vaadin-dialog-overlay";
+ /**
+ * Create a {@code DialogElement} by resolving the dialog with ARIA role.
+ */
public DialogElement(Page page) {
super(page.locator(FIELD_TAG_NAME));
}
+ /** Create a {@code DialogElement} from an existing locator. */
public DialogElement(Locator locator) {
super(locator);
}
+ /** Close the dialog using the Escape key. */
public void closeWithEscape() {
getLocator().press("Escape");
}
+ /** Whether the dialog is open (visible). */
public boolean isOpen() {
return getLocator().isVisible();
}
+ /** Assert that the dialog is open. */
public void assertOpen() {
assertThat(getLocator()).hasAttribute("opened", "");
}
+ /** Whether the dialog is modal (i.e. not modeless). */
public boolean isModal() {
return getLocator().getAttribute("modeless") == null;
}
+ /** Assert that the dialog is modal. */
public void assertModal() {
assertThat(getLocator()).not().hasAttribute("modeless", "");
}
+ /** Assert that the dialog is modeless. */
public void assertModeless() {
assertThat(getLocator()).hasAttribute("modeless", "");
}
+ /** Assert that the dialog is closed (hidden). */
public void assertClosed() {
assertThat(getLocator()).isHidden();
}
+ /** Get the header text from the title slot. */
public String getHeaderText() {
return getLocator().locator("> [slot='title']").textContent();
}
+ /** Assert the header text matches. */
public void assertHeaderText(String headerText) {
assertThat(getLocator().locator("> [slot='title']")).hasText(headerText);
}
+ /** Locator for the header content slot. */
public Locator getHeaderLocator() {
return getLocator().locator("> [slot='header-content']");
}
+ /** Locator for the dialog content (first non-slotted child). */
public Locator getContentLocator() {
// using xpath to not pierce the shadow dom
return getLocator().locator("xpath=./*[not(@slot)][1]");
}
+ /** Locator for the footer slot. */
public Locator getFooterLocator() {
return getLocator().locator("> [slot='footer']");
}
+ /** Get a dialog by its header text (accessible name). */
public static DialogElement getByHeaderText(Page page, String summary) {
return new DialogElement(
page.getByRole(AriaRole.DIALOG, new Page.GetByRoleOptions().setName(summary))
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/EmailFieldElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/EmailFieldElement.java
index f36613d..ba4bfea 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/EmailFieldElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/EmailFieldElement.java
@@ -4,15 +4,30 @@
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
+/**
+ * PlaywrightElement for {@code
+ * Provides typed helpers to read and modify integer-specific attributes
+ * such as {@code min}, {@code max}, and {@code step}, and convenient
+ * factory methods to locate the element by its accessible label.
+ */
@PlaywrightElement(IntegerFieldElement.FIELD_TAG_NAME)
public class IntegerFieldElement extends AbstractNumberFieldElement {
public static final String FIELD_TAG_NAME = "vaadin-integer-field";
+ /**
+ * Creates a new {@code IntegerFieldElement}.
+ *
+ * @param locator the locator for the {@code Matches the internal input by ARIA role {@code spinbutton} and accessible name. Searches under the provided locator and matches by accessible label.
+ * Supports single and multiple selection, item-level enablement assertions,
+ * and label-based lookup.
+ */
@PlaywrightElement(ListBoxElement.FIELD_TAG_NAME)
public class ListBoxElement extends VaadinElement
implements HasAriaLabelElement, HasStyleElement, HasTooltipElement,
@@ -22,24 +28,35 @@ public class ListBoxElement extends VaadinElement
public static final String FIELD_ITEM_TAG_NAME = "vaadin-item";
public static final String MULTIPLE_ATTRIBUTE = "multiple";
+ /**
+ * Create a new {@code ListBoxElement}.
+ *
+ * @param locator the locator for the {@code
+ * Provides utilities to access menu items and open submenus.
+ */
public class MenuBarElement extends VaadinElement implements HasThemeElement, HasStyleElement, HasAriaLabelElement {
public static final String FIELD_TAG_NAME = "vaadin-menu-bar";
+ /** Create a {@code MenuBarElement} from the page. */
public MenuBarElement(Page page) {
this(page.locator(FIELD_TAG_NAME));
}
+ /** Create a {@code MenuBarElement} from an existing locator. */
public MenuBarElement(Locator locator) {
super(locator);
}
+ /** Get a menu item by visible label. */
public MenuItemElement getMenuItemElement(String name) {
return MenuItemElement.getByLabel(getLocator(), name);
}
+ /**
+ * Click a menu item to open its submenu and return the submenu overlay.
+ */
public MenuElement openSubMenu(String name) {
MenuItemElement menuItemElement = getMenuItemElement(name);
menuItemElement.click();
@@ -30,6 +41,7 @@ public MenuElement openSubMenu(String name) {
return new MenuElement(getLocator().page());
}
+ /** Get a menu bar by its accessible label. */
public static MenuBarElement getByLabel(Page page, String label) {
return new MenuBarElement(
page.getByRole(AriaRole.MENUBAR, new Page.GetByRoleOptions().setName(label))
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/MenuElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/MenuElement.java
index 6858e2e..ec30255 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/MenuElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/MenuElement.java
@@ -7,22 +7,29 @@
import org.vaadin.addons.dramafinder.element.shared.HasStyleElement;
import org.vaadin.addons.dramafinder.element.shared.HasThemeElement;
+/**
+ * PlaywrightElement for the menu overlay list {@code
+ * Provides helpers for numeric attributes ({@code min}, {@code max}, {@code step})
+ * using {@link Double} types and locator utilities to find the component by
+ * its accessible label.
+ */
@PlaywrightElement(NumberFieldElement.FIELD_TAG_NAME)
public class NumberFieldElement extends AbstractNumberFieldElement {
public static final String FIELD_TAG_NAME = "vaadin-number-field";
+ /**
+ * Creates a new {@code NumberFieldElement}.
+ *
+ * @param locator the locator for the {@code Matches the internal input by ARIA role {@code spinbutton} and accessible name. Searches under the provided locator and matches by accessible label.
+ * Supports value/min/max setters and assertions and indeterminate state.
+ */
@PlaywrightElement(ProgressBarElement.FIELD_TAG_NAME)
public class ProgressBarElement extends VaadinElement implements HasThemeElement, HasStyleElement {
public static final String FIELD_TAG_NAME = "vaadin-progress-bar";
public static final String INDETERMINATE_ATTRIBUTE = "indeterminate";
+ /** Create a {@code ProgressBarElement} from an existing locator. */
public ProgressBarElement(Locator locator) {
super(locator);
}
+ /** Current numeric value parsed from {@code aria-valuenow}. */
public double getValue() {
return Double.parseDouble(getLocator().getAttribute("aria-valuenow"));
}
+ /** Set the progress bar {@code value}. */
public void setValue(double min) {
getLocator().evaluate("(el, v) => el.value = v", min);
}
+ /** Assert that the numeric value matches. */
public void assertValue(Double expected) {
if (expected != null) {
assertThat(getLocator()).hasAttribute("aria-valuenow", NumberUtils.formatDouble(expected));
@@ -33,44 +42,54 @@ public void assertValue(Double expected) {
}
}
+ /** Get the {@code min} value. */
public Double getMin() {
String v = getLocator().getAttribute("aria-valuemin");
return v == null ? null : Double.valueOf(v);
}
+ /** Set the {@code min} value. */
public void setMin(double min) {
getLocator().evaluate("(el, v) => el.min = v", min);
}
+ /** Assert that {@code min} matches the expected value. */
public void assertMin(double min) {
assertThat(getLocator()).hasAttribute("aria-valuemin", NumberUtils.formatDouble(min));
}
+ /** Get the {@code max} value. */
public Double getMax() {
String v = getLocator().getAttribute("aria-valuemax");
return v == null ? null : Double.valueOf(v);
}
+ /** Set the {@code max} value. */
public void setMax(double max) {
getLocator().evaluate("(el, v) => el.max = v", max);
}
+ /** Assert that {@code max} matches the expected value. */
public void assertMax(double max) {
assertThat(getLocator()).hasAttribute("aria-valuemax", NumberUtils.formatDouble(max));
}
+ /** Whether the bar is indeterminate. */
public boolean isIndeterminate() {
return getLocator().getAttribute(INDETERMINATE_ATTRIBUTE) != null;
}
+ /** Assert indeterminate state. */
public void assertIndeterminate() {
assertThat(getLocator()).hasAttribute(INDETERMINATE_ATTRIBUTE, "");
}
+ /** Assert not indeterminate. */
public void assertNotIndeterminate() {
assertThat(getLocator()).not().hasAttribute(INDETERMINATE_ATTRIBUTE, "");
}
+ /** Set the indeterminate state. */
public void setIndeterminate(boolean indeterminate) {
getLocator().evaluate("(el, val) => el.indeterminate = val", indeterminate);
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/RadioButtonElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/RadioButtonElement.java
index 3e83f29..d5bd844 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/RadioButtonElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/RadioButtonElement.java
@@ -14,6 +14,9 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * PlaywrightElement for {@code
+ * Provides helpers to select by label/value and assert selected state.
+ */
@PlaywrightElement(RadioButtonGroupElement.FIELD_TAG_NAME)
public class RadioButtonGroupElement extends VaadinElement
implements HasLabelElement, HasEnabledElement, HasHelperElement, HasValidationPropertiesElement {
public static final String FIELD_TAG_NAME = "vaadin-radio-group";
+ /**
+ * Create a new {@code RadioButtonGroupElement}.
+ *
+ * @param locator the locator for the {@code
+ * Provides helpers to open the overlay and pick items by visible text,
+ * along with aria/placeholder/validation mixins.
+ */
@PlaywrightElement(SelectElement.FIELD_TAG_NAME)
public class SelectElement extends VaadinElement
implements FocusableElement, HasAriaLabelElement, HasInputFieldElement,
@@ -32,12 +38,17 @@ public Locator getInputLocator() {
return getLocator().locator("*[slot=\"value\"]").first();
}
+ /**
+ * Create a new {@code SelectElement}.
+ *
+ * @param locator the locator for the {@code
+ * Provides helpers to access/select tabs and current content panel.
+ */
@PlaywrightElement(TabSheetElement.FIELD_TAG_NAME)
public class TabSheetElement extends VaadinElement {
public static final String FIELD_TAG_NAME = "vaadin-tabsheet";
+ /** Create a {@code TabSheetElement} from an existing locator. */
public TabSheetElement(Locator locator) {
super(locator);
}
+ /** Get the first tabsheet instance on the page. */
public static TabSheetElement get(Page page) {
return new TabSheetElement(page.locator(FIELD_TAG_NAME).first());
}
+ /** Assert the count of tabs. */
public void assertTabsCount(int count) {
Locator tabs = getLocator().locator(TabElement.FIELD_TAG_NAME);
assertThat(tabs).hasCount(count);
}
+ /** Get a tab by its label. */
public TabElement getTab(String label) {
return TabElement.getTabByText(getLocator(), label);
}
+ /** Get the currently selected tab. */
public TabElement getSelectedTab() {
return TabElement.getSelectedTab(getLocator());
}
+ /** Select a tab by label text. */
public void selectTab(String label) {
TabElement tab = getTab(label);
if (tab != null) {
@@ -38,6 +49,7 @@ public void selectTab(String label) {
}
}
+ /** Locator for the currently visible content panel. */
public Locator getContentLocator() {
return getLocator().locator("[tab]:not([hidden])");
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/TextAreaElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/TextAreaElement.java
index ff02bad..6b35cad 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/TextAreaElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/TextAreaElement.java
@@ -4,19 +4,39 @@
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
+/**
+ * PlaywrightElement for {@code
+ * Extends {@link TextFieldElement} with a textarea input slot and label-based lookup.
+ */
@PlaywrightElement(TextAreaElement.FIELD_TAG_NAME)
public class TextAreaElement extends TextFieldElement {
public static final String FIELD_TAG_NAME = "vaadin-text-area";
+ /**
+ * Create a new {@code TextAreaElement}.
+ *
+ * @param locator the locator for the {@code
+ * Adds convenience methods for {@link LocalTime} values and lookup by label.
+ */
@PlaywrightElement(TimePickerElement.FIELD_TAG_NAME)
public class TimePickerElement extends VaadinElement implements HasInputFieldElement, HasValidationPropertiesElement,
HasClearButtonElement, HasPlaceholderElement, HasThemeElement, FocusableElement, HasAriaLabelElement,
@@ -28,15 +33,30 @@ public class TimePickerElement extends VaadinElement implements HasInputFieldEle
public static final String FIELD_TAG_NAME = "vaadin-time-picker";
public static final DateTimeFormatter LOCAL_TIME = DateTimeFormatter.ofPattern("HH:mm");
+ /**
+ * Create a new {@code TimePickerElement}.
+ *
+ * @param locator the locator for the {@code
+ * Exposes common helpers such as clicking, visibility assertions, text
+ * retrieval and generic DOM property access. Concrete components add
+ * component-specific APIs on top of this.
+ */
public abstract class VaadinElement implements HasLocatorElement {
protected final Locator locator;
+ /**
+ * Create a new VaadinElement wrapper.
+ *
+ * @param locator the locator pointing to the component root element
+ */
public VaadinElement(Locator locator) {
this.locator = locator;
}
+ /**
+ * Click the component root.
+ */
public void click() {
locator.click();
}
+ /**
+ * Get the textual content of the component root.
+ *
+ * @return the text content, or {@code null} if none
+ */
public String getText() {
return locator.textContent();
}
@Override
+ /** {@inheritDoc} */
public Locator getLocator() {
return locator;
}
/**
- * Set a DOM property (e.g. `value`, `disabled`, etc.)
+ * Set a DOM property on the underlying element (e.g. {@code value}, {@code disabled}).
+ *
+ * @param name property name
+ * @param value property value
*/
public void setProperty(String name, Object value) {
locator.evaluate("(el, args) => el[args.name] = args.value", Map.of("name", name, "value", value));
}
/**
- * Optional: get a DOM property
+ * Get a DOM property from the underlying element.
+ *
+ * @param name property name
+ * @return the property value or {@code null} if absent
*/
public Object getProperty(String name) {
return locator.evaluate("(el, args) => el[args.name]", Map.of("name", name));
}
+ /**
+ * Whether the component is visible.
+ *
+ * @return {@code true} when visible
+ */
public boolean isVisible() {
return locator.isVisible();
}
+ /**
+ * Assert that the component is visible.
+ */
public void assertVisible() {
assertThat(getLocator()).isVisible();
}
+ /**
+ * Assert that the component is hidden.
+ */
public void assertHidden() {
assertThat(getLocator()).isHidden();
}
+ /**
+ * Whether the component is hidden.
+ *
+ * @return {@code true} when hidden
+ */
public boolean isHidden() {
return !isVisible();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/FocusableElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/FocusableElement.java
index 0f62fde..36ab633 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/FocusableElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/FocusableElement.java
@@ -4,34 +4,45 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that can receive keyboard focus.
+ */
public interface FocusableElement extends HasLocatorElement {
+ /**
+ * The locator to focus/blur. Defaults to the component root.
+ */
default Locator getFocusLocator() {
return getLocator();
}
/**
- * Focus the field
+ * Focus the component.
*/
default void focus() {
getFocusLocator().focus();
}
/**
- * Blur the field
+ * Blur the component.
*/
default void blur() {
getFocusLocator().blur();
}
+ /**
+ * Current tab index as string (from {@code tabIndex} attribute).
+ */
default String getTabIndex() {
return getFocusLocator().getAttribute("tabIndex");
}
+ /** Assert that the component has focus. */
default void assertIsFocused() {
assertThat(getFocusLocator()).isFocused();
}
+ /** Assert that the component does not have focus. */
default void assertIsNotFocused() {
assertThat(getFocusLocator()).not().isFocused();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAllowedCharPatternElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAllowedCharPatternElement.java
index f9c5413..507521e 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAllowedCharPatternElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAllowedCharPatternElement.java
@@ -4,16 +4,34 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components supporting {@code allowedCharPattern} to constrain input.
+ */
public interface HasAllowedCharPatternElement extends HasLocatorElement {
+ /**
+ * Get the current {@code allowedCharPattern}.
+ *
+ * @return the pattern string or {@code null}
+ */
default String getAllowedCharPattern() {
return getLocator().evaluate("el => el.allowedCharPattern").toString();
}
+ /**
+ * Set the {@code allowedCharPattern}.
+ *
+ * @param pattern the pattern to apply
+ */
default void setAllowedCharPattern(String pattern) {
getLocator().evaluate("(el, p) => el.allowedCharPattern = p", pattern);
}
+ /**
+ * Assert that the {@code allowedCharPattern} matches the expected value.
+ *
+ * @param pattern expected pattern, or {@code null} to assert absence
+ */
default void assertAllowedCharPattern(String pattern) {
if (pattern != null) {
assertThat(getLocator()).hasJSProperty("allowedCharPattern", pattern);
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAriaLabelElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAriaLabelElement.java
index fbcd7b1..33291d6 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAriaLabelElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasAriaLabelElement.java
@@ -6,16 +6,24 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components exposing an ARIA label.
+ */
public interface HasAriaLabelElement extends HasLocatorElement {
+ /** Locator where the {@code aria-label} is applied. Defaults to root. */
default Locator getAriaLabelLocator() {
return getLocator();
}
+ /** Get the current {@code aria-label} value. */
default String getAriaLabel() {
return getAriaLabelLocator().getAttribute("aria-label");
}
+ /**
+ * Assert that the {@code aria-label} matches the expected text, or is absent when null.
+ */
default void assertAriaLabel(String ariaLabel) {
if (ariaLabel != null) {
assertThat(getAriaLabelLocator()).hasAttribute("aria-label", ariaLabel);
@@ -24,4 +32,4 @@ default void assertAriaLabel(String ariaLabel) {
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasClearButtonElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasClearButtonElement.java
index e959a82..cd96503 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasClearButtonElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasClearButtonElement.java
@@ -4,24 +4,32 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components with a clear button part.
+ */
public interface HasClearButtonElement extends HasLocatorElement {
+ /** Locator for the clear button ({@code part~=clear-button}). */
default Locator getClearButtonLocator() {
return getLocator().locator("[part=\"clear-button\"]");
}
+ /** Click the clear button. */
default void clickClearButton() {
getClearButtonLocator().click();
}
+ /** Whether the clear button is visible. */
default boolean isClearButtonVisible() {
return getClearButtonLocator().isVisible();
}
+ /** Assert that the clear button is visible. */
default void assertClearButtonVisible() {
assertThat(getClearButtonLocator()).isVisible();
}
+ /** Assert that the clear button is not visible. */
default void assertClearButtonNotVisible() {
assertThat(getClearButtonLocator()).not().isVisible();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasEnabledElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasEnabledElement.java
index eb933c9..5f34ae3 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasEnabledElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasEnabledElement.java
@@ -4,20 +4,27 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that expose enabled/disabled state.
+ */
public interface HasEnabledElement extends HasLocatorElement {
+ /** Locator used to check enablement. Defaults to root. */
default Locator getEnabledLocator() {
return getLocator();
}
+ /** Whether the component is enabled. */
default boolean isEnabled() {
return getEnabledLocator().isEnabled();
}
+ /** Assert that the component is enabled. */
default void assertEnabled() {
assertThat(getEnabledLocator()).isEnabled();
}
+ /** Assert that the component is disabled. */
default void assertDisabled() {
assertThat(getEnabledLocator()).isDisabled();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasHelperElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasHelperElement.java
index a2b89b8..e13bd2f 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasHelperElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasHelperElement.java
@@ -4,16 +4,22 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that provide helper text via the {@code helper} slot.
+ */
public interface HasHelperElement extends HasLocatorElement {
+ /** Locator for the helper slot content. */
default Locator getHelperLocator() {
return getLocator().locator("*[slot=\"helper\"]").first(); // slot="helper"
}
+ /** Text content of the helper slot. */
default String getHelperText() {
return getHelperLocator().textContent(); // slot="helper"
}
+ /** Assert that the helper slot has the expected text. */
default void assertHelperHasText(String helperText) {
assertThat(getHelperLocator()).hasText(helperText);
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasInputFieldElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasInputFieldElement.java
index 272a9a3..17d2c22 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasInputFieldElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasInputFieldElement.java
@@ -1,4 +1,8 @@
package org.vaadin.addons.dramafinder.element.shared;
+/**
+ * Convenience mixin grouping common capabilities of Vaadin input fields
+ * (label, value handling, helper and styling).
+ */
public interface HasInputFieldElement extends HasHelperElement, HasValueElement, HasStyleElement, HasLabelElement {
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLabelElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLabelElement.java
index 15ddd24..8077fc9 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLabelElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLabelElement.java
@@ -4,16 +4,22 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that render a visible label.
+ */
public interface HasLabelElement extends HasLocatorElement {
+ /** Locator for the visible label element. */
default Locator getLabelLocator() {
return getLocator().locator("label").first();
}
+ /** Get the label text. */
default String getLabel() {
return getLabelLocator().textContent();
}
+ /** Assert that the label text matches, or is hidden when null. */
default void assertLabel(String label) {
if (label != null) {
assertThat(getLabelLocator()).hasText(label);
@@ -22,4 +28,4 @@ default void assertLabel(String label) {
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLocatorElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLocatorElement.java
index 2b88401..7b9b792 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLocatorElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasLocatorElement.java
@@ -2,6 +2,10 @@
import com.microsoft.playwright.Locator;
+/**
+ * Base contract for objects that expose a Playwright {@link Locator}.
+ */
public interface HasLocatorElement {
+ /** The root locator for the component. */
Locator getLocator();
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPlaceholderElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPlaceholderElement.java
index 2863185..38109f8 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPlaceholderElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPlaceholderElement.java
@@ -2,16 +2,22 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that support the {@code placeholder} attribute.
+ */
public interface HasPlaceholderElement extends HasLocatorElement {
+ /** Set the {@code placeholder} attribute. */
default void setPlaceholder(String placeholder) {
getLocator().evaluate("(el, placeholder) => el.placeholder = placeholder", placeholder);
}
+ /** Get the current {@code placeholder} text. */
default String getPlaceholder() {
return getLocator().evaluate("el => el.placeholder").toString();
}
+ /** Assert that the {@code placeholder} matches the expected text. */
default void assertPlaceholder(String placeholder) {
assertThat(getLocator()).hasAttribute("placeholder", placeholder);
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPrefixElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPrefixElement.java
index 5a69b1a..18b73a2 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPrefixElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasPrefixElement.java
@@ -10,14 +10,17 @@
*/
public interface HasPrefixElement extends HasLocatorElement {
+ /** Locator for the prefix slot content. */
default Locator getPrefixLocator() {
return getLocator().locator("*[slot=\"prefix\"]").first();
}
+ /** Text content of the prefix slot. */
default String getPrefixText() {
return getPrefixLocator().textContent();
}
+ /** Assert that the prefix slot has the expected text, or is hidden when null. */
default void assertPrefixHasText(String text) {
if (text != null) {
assertThat(getPrefixLocator()).hasText(text);
@@ -26,4 +29,3 @@ default void assertPrefixHasText(String text) {
}
}
}
-
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasStyleElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasStyleElement.java
index c582219..2954855 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasStyleElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasStyleElement.java
@@ -4,12 +4,19 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components exposing styling via CSS classes.
+ */
public interface HasStyleElement extends HasLocatorElement {
+ /** Get the raw {@code class} attribute value. */
default String getCssClass() {
return getLocator().getAttribute("class");
}
+ /**
+ * Assert the component has exactly the provided class names, or no classes when null.
+ */
default void assertCssClass(String... classnames) {
if (classnames != null) {
assertThat(getLocator()).hasClass(classnames);
@@ -18,4 +25,4 @@ default void assertCssClass(String... classnames) {
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasSuffixElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasSuffixElement.java
index 5e3b49f..ba377a6 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasSuffixElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasSuffixElement.java
@@ -10,14 +10,17 @@
*/
public interface HasSuffixElement extends HasLocatorElement {
+ /** Locator for the suffix slot content. */
default Locator getSuffixLocator() {
return getLocator().locator("*[slot=\"suffix\"]").first();
}
+ /** Text content of the suffix slot. */
default String getSuffixText() {
return getSuffixLocator().textContent();
}
+ /** Assert that the suffix slot has the expected text, or is hidden when null. */
default void assertSuffixHasText(String text) {
if (text != null) {
assertThat(getSuffixLocator()).hasText(text);
@@ -26,4 +29,3 @@ default void assertSuffixHasText(String text) {
}
}
}
-
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasThemeElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasThemeElement.java
index c4ebf3c..fe41d99 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasThemeElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasThemeElement.java
@@ -4,12 +4,17 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that support the {@code theme} attribute.
+ */
public interface HasThemeElement extends HasLocatorElement {
+ /** Get the current {@code theme} attribute value. */
default String getTheme() {
return getLocator().getAttribute("theme");
}
+ /** Assert that the {@code theme} attribute matches, or is absent when null. */
default void assertTheme(String theme) {
if (theme != null) {
assertThat(getLocator()).hasAttribute("theme", theme);
@@ -18,4 +23,4 @@ default void assertTheme(String theme) {
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasTooltipElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasTooltipElement.java
index dc48c01..ad34b80 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasTooltipElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasTooltipElement.java
@@ -11,10 +11,12 @@
*/
public interface HasTooltipElement extends HasLocatorElement {
+ /** Locator for the tooltip content (role=tooltip). */
default Locator getTooltipLocator() {
return getLocator().locator("*[slot=\"tooltip\"]").first();
}
+ /** Tooltip text content. */
default String getTooltipText() {
return getTooltipLocator().textContent();
}
@@ -27,4 +29,3 @@ default void assertTooltipHasText(String text) {
}
}
}
-
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValidationPropertiesElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValidationPropertiesElement.java
index d45ed2c..27ec5f6 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValidationPropertiesElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValidationPropertiesElement.java
@@ -4,20 +4,27 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components exposing validation state and error messages.
+ */
public interface HasValidationPropertiesElement extends HasLocatorElement {
+ /** Locator for the error message slot. */
default Locator getErrorMessageLocator() {
return getLocator().locator("> [slot=\"error-message\"]").first(); // slot="helper"
}
+ /** Assert that the component is valid (not {@code invalid}). */
default void assertValid() {
assertThat(getLocator()).not().hasAttribute("invalid", "");
}
+ /** Assert that the component is invalid. */
default void assertInvalid() {
assertThat(getLocator()).hasAttribute("invalid", "");
}
+ /** Assert that the error message equals the expected text. */
default void assertErrorMessage(String errorMessage) {
assertThat(getErrorMessageLocator()).hasText(errorMessage);
}
diff --git a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValueElement.java b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValueElement.java
index 457bfc3..f036393 100644
--- a/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValueElement.java
+++ b/src/main/java/org/vaadin/addons/dramafinder/element/shared/HasValueElement.java
@@ -4,31 +4,35 @@
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
+/**
+ * Mixin for components that expose a textual {@code value} through an input slot.
+ */
public interface HasValueElement extends HasLocatorElement {
+ /** Locator for the native input element inside the component. */
default Locator getInputLocator() {
return getLocator().locator("*[slot=\"input\"]").first(); // slot="helper"
}
+ /** Get the current string value. */
default String getValue() {
return getLocator().evaluate("el => el.value").toString();
}
/**
- * Set value via JavaScript (ensures the `value-changed` event is triggered)
+ * Set the field value by filling the input and dispatching a change event.
*/
default void setValue(String value) {
getInputLocator().fill(value);
getLocator().dispatchEvent("change");
}
- /**
- * Clear the input field
- */
+ /** Clear the input value. */
default void clear() {
setValue("");
}
+ /** Assert that the input value matches the expected string. */
default void assertValue(String value) {
assertThat(getInputLocator()).hasValue(value);
}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
new file mode 100644
index 0000000..e69de29