All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.redhat.darcy.ui.AbstractViewElement Maven / Gradle / Ivy

Go to download

Framework for writing page objects to automate interaction with graphical user interfaces.

The newest version!
/*
 Copyright 2014 Red Hat, Inc. and/or its affiliates.

 This file is part of darcy-ui.

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see .
 */

package com.redhat.darcy.ui;

import com.redhat.darcy.ui.api.Locator;
import com.redhat.darcy.ui.api.ViewElement;
import com.redhat.darcy.ui.api.elements.Element;
import com.redhat.synq.Condition;

import java.util.Objects;
import java.util.function.UnaryOperator;

/**
 * Like {@link com.redhat.darcy.ui.AbstractView AbstractView}, but instead of just partially
 * implementing a {@link com.redhat.darcy.ui.api.View View}, implements
 * {@link com.redhat.darcy.ui.api.ViewElement ViewElement}, which implements both
 * {@link com.redhat.darcy.ui.api.View View} and
 * {@link com.redhat.darcy.ui.api.elements.Element Element}. It does this using the familiar
 * {@link com.redhat.darcy.ui.annotations.Require @Require},
 * {@link com.redhat.darcy.ui.annotations.RequireAll @RequireAll}, and
 * {@link com.redhat.darcy.ui.annotations.NotRequired @NotRequired} annotations.
 * {@link #isDisplayed()} checks that all required elements are displayed.
 * {@link #isPresent()} checks that all required findables are present.
 * {@link #isLoaded()} works just like {@link com.redhat.darcy.ui.AbstractView}.
 *
 * 

Additionally, AbstractViewElement provides * {@link #byInner(com.redhat.darcy.ui.api.Locator, com.redhat.darcy.ui.api.Locator...)} for * conveniently nesting elements underneath some other locator or element. For example: * *


 *     public class MyCustomElement extends AbstractViewElement {
 *         private TextInput input = textInput(byInner(By.id("input")));
 *                 // Equivalent to: textInput(By.nested(parent, By.id("input")));
 *
 *         // snip
 *     }
 * 
* * @see #byInner(com.redhat.darcy.ui.api.Locator, com.redhat.darcy.ui.api.Locator...) * @see com.redhat.darcy.ui.AbstractView * @see com.redhat.darcy.ui.api.ViewElement */ public abstract class AbstractViewElement extends AbstractView implements ViewElement { /** * The parent element of this ViewElement. */ protected final T parent; /** * Creates a nested View underneath some parent Locator. */ @Deprecated public AbstractViewElement(Locator parent) { this(Elements.element((Class) Element.class, parent)); } public AbstractViewElement(Class type, Locator parent) { this(Elements.element(type, parent)); } /** * Creates a nested View underneath some parent element, which is necessary for creating a list * of this ViewElement from some {@link com.redhat.darcy.ui.api.Locator}, as the locator itself * may correspond to a number of elements, so each unique element found by the same locator is * used to construct this ViewElement to ensure each represents a unique element. */ public AbstractViewElement(T parent) { this.parent = parent; } /** * Determines whether or not this ViewElement is displayed by querying * {@link com.redhat.darcy.ui.api.elements.Element#isDisplayed()} on all of the required * element fields (as annotated by {@link com.redhat.darcy.ui.annotations.Require}, * {@link com.redhat.darcy.ui.annotations.RequireAll}, and * {@link com.redhat.darcy.ui.annotations.NotRequired}. * *

By default, the {@link #parent} element is not required. If you wish to require it, you * can either override this method or add your own parent element field that is annotated as * required. */ @Override public boolean isDisplayed() { return analyzer.getDisplayConditions().stream().allMatch(Condition::isMet); } /** * Determines whether or not this ViewElement is present by querying * {@link com.redhat.darcy.ui.api.elements.Findable#isPresent()} on all of the required * findable fields (as annotated by {@link com.redhat.darcy.ui.annotations.Require}, * {@link com.redhat.darcy.ui.annotations.RequireAll}, and * {@link com.redhat.darcy.ui.annotations.NotRequired}. * *

By default, the {@link #parent} element is not required. If you wish to require it, you * can either override this method or add your own parent element field that is annotated as * required. */ @Override public boolean isPresent() { return analyzer.getIsPresentConditions().stream().allMatch(Condition::isMet); } /** * @return a {@link com.redhat.darcy.ui.api.Locator} that is nested underneath the * {@link #parent} element. This is simply syntactic sugar for * {@code By.nested(parent, locator, additional)}. */ protected Locator byInner(Locator locator, Locator... additional) { return By.nested(parent, locator, additional); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy