diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java b/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java index 0c329d4132..a26b76f3fb 100644 --- a/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java +++ b/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java @@ -9,6 +9,7 @@ import io.github.com.pages.ButtonTogglePage; import io.github.com.pages.ButtonsPage; import io.github.com.pages.CheckBoxPage; +import io.github.com.pages.ChipsPage; import io.github.com.pages.DividerPage; import io.github.com.pages.ProgressBarPage; import io.github.com.pages.ProgressSpinnerPage; @@ -51,6 +52,9 @@ public class StaticSite { @Url("checkbox") public static CheckBoxPage checkBoxPage; + @Url("chips") + public static ChipsPage chipsPage; + @Url("slide_toggle") public static SlideTogglePage slideTogglePage; } diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/ChipGroupWithAutocomlete.java b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/ChipGroupWithAutocomlete.java new file mode 100644 index 0000000000..9f9f4a5f3f --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/ChipGroupWithAutocomlete.java @@ -0,0 +1,13 @@ +package io.github.com.custom.elements; + +import com.epam.jdi.light.angular.elements.complex.AutoComplete; +import com.epam.jdi.light.angular.elements.complex.ChipGroup; +import com.epam.jdi.light.common.JDIAction; + +public class ChipGroupWithAutocomlete extends ChipGroup { + + @JDIAction("Get '{name}' input field") + public AutoComplete inputField() { + return new AutoComplete().setCore(AutoComplete.class, core().find("input")); + } +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/ChipsPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/ChipsPage.java new file mode 100644 index 0000000000..4d402e4863 --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/ChipsPage.java @@ -0,0 +1,55 @@ +package io.github.com.pages; + +import com.epam.jdi.light.angular.elements.complex.ChipGroup; +import com.epam.jdi.light.elements.pageobjects.annotations.locators.UI; +import com.epam.jdi.light.ui.html.elements.common.Text; +import io.github.com.custom.elements.ChipGroupWithAutocomlete; + +public class ChipsPage extends NewAngularPage { + + @UI("#basic-chips-row") + public static ChipGroup basicChips; + + @UI("#stacked-chips-list") + public static ChipGroup stackedChips; + + @UI("#chips-autocomplete-field") + public static ChipGroupWithAutocomlete autocompleteChips; + + @UI("#chips-with-input-field") + public static ChipGroupWithAutocomlete inputChips; + + @UI("#chips-with-form-control") + public static ChipGroup formControlChips; + + @UI("#chips-drag-and-drop") + public static ChipGroup dragAndDropChips; + + @UI("#chips-avatar") + public static ChipGroup avatarChips; + + @UI("#chips-disabled-ripple") + public static ChipGroup disabledRippleChips; + + @UI("#chips-enabled-ripple") + public static ChipGroup enabledRippleChips; + + @UI("#chips-disabled") + public static ChipGroup disabledChips; + + @UI("#chips-highlighted") + public static ChipGroup highlightedChips; + + @UI("#multiple-chips") + public static ChipGroup multipleChips; + + @UI("#chips-with-error-state") + public static ChipGroupWithAutocomlete errorChips; + + @UI("#basic-chips-label") + public static Text basicSelectedValue; + + @UI("#stacked-chips-label") + public static Text stackedSelectedValue; + +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/ChipsSection.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/ChipsSection.java deleted file mode 100644 index f85a7ba556..0000000000 --- a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/ChipsSection.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.com.pages.sections; - -import com.epam.jdi.light.angular.elements.complex.Chips; -import com.epam.jdi.light.elements.composite.Section; -import com.epam.jdi.light.elements.pageobjects.annotations.locators.UI; -import com.epam.jdi.light.ui.html.elements.common.Text; - -public class ChipsSection extends Section { - - public static Chips chips; - - @UI("#mat-chip-list-0") - public static Chips basicChipsRow; - - @UI("#mat-chip-list-1") - public static Chips stackedChipsList; - - @UI("#basic-chips-label") - public static Text basicSelectedValue; - - @UI("#stacked-chips-label") - public static Text stackedSelectedValue; - - @UI("#chips-autocomplete-field") - public static Chips chipsAutocompleteField; - - @UI("#mat-chip-list-input-0") - public static Chips chipsAutocompleteInput; - - @UI("#mat-chip-list-2") - public static Chips autocompleteChipsList; - - @UI("#chips-with-input-field") - public static Chips chipsWithInputField; - - @UI("#mat-chip-list-input-1") - public static Chips chipsWithInputInput; - - @UI("#mat-chip-list-3") - public static Chips chipsWithInputList; - -} diff --git a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/ChipsTests.java b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/ChipsTests.java index 58d589185f..8f17f2c9c8 100644 --- a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/ChipsTests.java +++ b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/ChipsTests.java @@ -1,98 +1,187 @@ package io.github.epam.angular.tests.elements.complex; +import com.epam.jdi.light.angular.elements.enums.AngularColors; +import io.github.com.pages.ChipsPage; import io.github.epam.TestsInit; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Ignore; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.util.Arrays; import java.util.List; import static com.jdiai.tools.StringUtils.format; -import static io.github.com.StaticSite.angularPage; -import static io.github.com.pages.sections.ChipsSection.*; -import static io.github.epam.site.steps.States.shouldBeLoggedIn; +import static com.jdiai.tools.Timer.waitCondition; +import static io.github.com.StaticSite.chipsPage; +import static io.github.com.pages.ChipsPage.autocompleteChips; +import static io.github.com.pages.ChipsPage.avatarChips; +import static io.github.com.pages.ChipsPage.basicChips; +import static io.github.com.pages.ChipsPage.disabledChips; +import static io.github.com.pages.ChipsPage.errorChips; +import static io.github.com.pages.ChipsPage.highlightedChips; +import static io.github.com.pages.ChipsPage.inputChips; +import static io.github.com.pages.ChipsPage.multipleChips; +import static io.github.com.pages.ChipsPage.stackedChips; -// TODO Move to the new page -@Ignore public class ChipsTests extends TestsInit { - private static final String ONEFISH = "One fish"; private static final String TWOFISH = "Two fish"; - private static final String PRIMARYFISH = "Primary fish"; - private static final String ACCENTFISH = "Accent fish"; + private static final String WARNFISH = "Warn fish"; - private static final String NONE = "none"; - private static final String PRIMARY = "Primary"; - private static final String ACCENT = "Accent"; - private static final String WARN = "Warn"; - - private static final String PLACEHOLDER = "New fruit..."; private static final String APPLE = "Apple"; private static final String LEMON = "Lemon"; private static final String LIME = "Lime"; + private static final String KIWI = "Kiwi"; + private static final String ROCKMELON = "Rockmelon"; + private static final String MELON = "Melon"; - @BeforeMethod(alwaysRun = true) + @BeforeClass public void before() { - shouldBeLoggedIn(); - angularPage.shouldBeOpened(); + chipsPage.open(); + waitCondition(() -> chipsPage.isOpened()); + chipsPage.checkOpened(); } - @Test + @Test(description = "Test verifies that chip group is selectable") public void basicChipsTest() { - basicChipsRow.show(); - basicChipsRow.is().displayed(); - basicChipsRow.is().assertChipsIsEnabled(); - basicChipsRow.clickChipsByTextValue(ONEFISH); - basicChipsRow.clickChipsByTextValue(TWOFISH); - basicChipsRow.clickChipsByTextValue(PRIMARYFISH); - basicChipsRow.clickChipsByTextValue(ACCENTFISH); - - basicSelectedValue.has().text(format("You clicked: %s", ACCENTFISH)); + basicChips.show(); + basicChips.is().displayed().and().enabled(); + basicChips.selectByLabel(TWOFISH); + basicChips.getElement(TWOFISH).is().selected(); + basicChips.selectByLabel(WARNFISH); + basicChips.getElement(WARNFISH).is().selected(); + + ChipsPage.basicSelectedValue.has().text(format("You clicked: %s", WARNFISH)); } - @Test + @Test(description = "Test verifies that chip group is vertical") public void stackedChipsTest() { - stackedChipsList.show(); - stackedChipsList.is().displayed(); - stackedChipsList.is().assertChipsIsEnabled(); - stackedChipsList.clickChipsByTextValue(NONE); - stackedChipsList.clickChipsByTextValue(PRIMARY); - stackedChipsList.clickChipsByTextValue(ACCENT); - stackedChipsList.clickChipsByTextValue(WARN); + stackedChips.show(); + stackedChips.is().displayed().and().vertical(); + } + + @Test(description = "Test verifies that chip group is not vertical") + public void horizontalChipsTest() { + basicChips.show(); + basicChips.is().displayed().and().notVertical(); + } + + @Test(description = "Test check chips colors") + public void chipsColorTest() { + highlightedChips.show(); + highlightedChips.is().displayed(); + highlightedChips.getElement("Highlighted color Primary").is().color(AngularColors.PRIMARY) + .and().highlighted(); + highlightedChips.getElement("Highlighted color Accent").is().color(AngularColors.ACCENT) + .and().highlighted(); + highlightedChips.getElement("Highlighted color Warn").is().color(AngularColors.WARN) + .and().highlighted(); + } - stackedSelectedValue.has().text(format("You clicked: %s", WARN)); + @Test(description = "Test verifies that chips isn't highlighted") + public void chipsNotHighlightedTest() { + basicChips.show(); + basicChips.is().displayed().and().enabled(); + basicChips.getElement(TWOFISH).is().notHighlighted(); + basicChips.getElement(WARNFISH).is().notHighlighted(); } - @Test + @Test(description = "Test checks the operation of the autocomplete in chips group") public void chipsAutocompleteTest() { String[] expectedValuesArray = { - "Apple", "Lemon", "Lime", "Orange", "Strawberry"}; + APPLE, LEMON, LIME, "Orange", "Strawberry"}; List expectedValues = Arrays.asList(expectedValuesArray); - chipsAutocompleteField.show(); - chipsAutocompleteField.is().displayed(); - chipsAutocompleteInput.is().assertChipsIsEnabled(); - chipsAutocompleteInput.has().assertChipsHasPlaceholder(PLACEHOLDER); - chipsAutocompleteInput.has().assertChipsHasOptions(expectedValues); - chipsAutocompleteInput.setValue(LEMON); - chipsAutocompleteField.collapseField(); - chipsAutocompleteInput.setValue(APPLE); - chipsAutocompleteField.collapseField(); - chipsAutocompleteInput.setValue(LIME); - chipsAutocompleteField.collapseField(); + autocompleteChips.show(); + autocompleteChips.is().displayed(); + autocompleteChips.inputField().has().placeholder("New Fruit..."); + autocompleteChips.inputField().has().options(expectedValues); + + autocompleteChips.inputField().select(LEMON); + autocompleteChips.is().hasElement(LEMON); + autocompleteChips.inputField().select(APPLE); + autocompleteChips.is().hasElement(APPLE); } - @Test + @Test(description = "Test checks the input field in chips group") public void chipsWithInputTest() { - chipsWithInputField.show(); - chipsWithInputField.is().displayed(); - chipsWithInputInput.is().assertChipsIsEnabled(); - chipsWithInputInput.has().assertChipsHasPlaceholder(PLACEHOLDER); - chipsWithInputInput.input("Kiwi" + "\n"); - chipsWithInputInput.input("Melon"); - chipsWithInputInput.clearInputField(); - chipsWithInputInput.input("Rockmelon" + "\n"); - } -} \ No newline at end of file + inputChips.show(); + inputChips.is().displayed(); + inputChips.inputField().has().placeholder("New fruit..."); + inputChips.inputField().input(KIWI + "\n"); + inputChips.inputField().input(MELON); + inputChips.inputField().clear(); + inputChips.inputField().input(ROCKMELON + "\n"); + inputChips.is().hasElement(KIWI); + inputChips.is().hasElement(ROCKMELON); + } + + @Test(description = "Test checks that chips can be removed") + public void chipsRemovableTest() { + inputChips.show(); + inputChips.is().displayed(); + inputChips.getElement(LEMON).is().removable(); + inputChips.getElement(LEMON).remove(); + } + + @Test(description = "Test checks that chips can't be removed") + public void chipsNotRemovableTest() { + basicChips.show(); + basicChips.is().displayed(); + basicChips.getElement(WARNFISH).is().notRemovable(); + } + + @Test(description = "Test checks that chips can be focused") + public void chipFocusedTest() { + inputChips.show(); + inputChips.is().displayed(); + inputChips.getElement(APPLE).click(); + inputChips.getElement(APPLE).is().focused(); + inputChips.getElement(LIME).click(); + inputChips.getElement(LIME).is().focused(); + inputChips.getElement(APPLE).is().notFocused(); + } + + @Test(description = "Test checks that chips has avatar image") + public void chipAvatarTest() { + avatarChips.show(); + avatarChips.getElement("Dog one").has().image(); + } + + @Test(description = "Test checks that chips can be disabled") + public void chipDisabledTest() { + disabledChips.show(); + disabledChips.is().displayed().and().disabled(); + } + + @Test(description = "Test checks chips multiply selection") + public void chipsMultipleSelectionTest() { + multipleChips.show(); + multipleChips.is().displayed(); + multipleChips.is().multiselectable(); + multipleChips.selectByLabel("multiple color none"); + multipleChips.selectByLabel("multiple color Primary"); + multipleChips.getElement("multiple color none").is().selected(); + multipleChips.getElement("multiple color Primary").is().selected(); + } + + @Test(description = "Test checks chips isn't multiply selection") + public void chipsNotMultipleSelectionTest() { + basicChips.show(); + basicChips.is().displayed(); + basicChips.is().notMultiselectable(); + basicChips.selectByLabel(TWOFISH); + basicChips.selectByLabel(WARNFISH); + basicChips.getElement(TWOFISH).is().deselected(); + basicChips.getElement(WARNFISH).is().selected(); + + } + + @Test(description = "Test checks that chips has error state") + public void chipsErrorState() { + errorChips.show(); + errorChips.is().displayed(); + errorChips.inputField().input(KIWI + "\n"); + errorChips.has().errorState(); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipAssert.java new file mode 100644 index 0000000000..aae8d7b4af --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipAssert.java @@ -0,0 +1,71 @@ +package com.epam.jdi.light.angular.asserts; + +import com.epam.jdi.light.angular.elements.common.Chip; +import com.epam.jdi.light.angular.elements.enums.AngularColors; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matchers; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; + +public class ChipAssert extends UIAssert { + + @JDIAction("Assert that '{name}' is enabled") + public ChipAssert selected() { + jdiAssert(element().selected(), Matchers.is(true), "Element is not selected"); + return this; + } + + @JDIAction("Assert that '{name}' is enabled") + public ChipAssert deselected() { + jdiAssert(element().selected(), Matchers.is(false), "Element is selected"); + return this; + } + + @JDIAction("Assert that '{name}' is removable ") + public ChipAssert removable() { + jdiAssert(element().removable(), Matchers.is(true), "Element is not removable"); + return this; + } + + @JDIAction("Assert that '{name}' is removable ") + public ChipAssert notRemovable() { + jdiAssert(element().removable(), Matchers.is(false), "Element is removable"); + return this; + } + + @JDIAction("Assert that '{name}' has '{0}' color") + public ChipAssert color(AngularColors color) { + return cssClass(color.getStyle()); + } + + @JDIAction("Assert that '{name}' is focused ") + public ChipAssert focused() { + jdiAssert(element().focused(), Matchers.is(true), "Element is not focused"); + return this; + } + + @JDIAction("Assert that '{name}' is highlighted ") + public ChipAssert highlighted() { + jdiAssert(element().highlighted(), Matchers.is(true), "Element is not highlighted"); + return this; + } + + @JDIAction("Assert that '{name}' isn't highlighted ") + public ChipAssert notHighlighted() { + jdiAssert(element().highlighted(), Matchers.is(false), "Element is highlighted"); + return this; + } + + @JDIAction("Assert that '{name}' isn't focused ") + public ChipAssert notFocused() { + jdiAssert(element().focused(), Matchers.is(false), "Element is focused"); + return this; + } + + @JDIAction("Assert that '{name}' has avatar image") + public ChipAssert image() { + jdiAssert(element().hasImage(), Matchers.is(true), "Element is not avatar image"); + return this; + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipGroupAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipGroupAssert.java new file mode 100644 index 0000000000..037b93d375 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipGroupAssert.java @@ -0,0 +1,61 @@ +package com.epam.jdi.light.angular.asserts; + +import com.epam.jdi.light.angular.elements.complex.ChipGroup; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matchers; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; + +public class ChipGroupAssert extends UIAssert { + + @Override + @JDIAction("Assert that '{name}' is displayed") + public ChipGroupAssert displayed() { + jdiAssert(element().isDisplayed() ? "displayed" : "hidden", Matchers.is("displayed")); + return this; + } + + @Override + @JDIAction("Assert that '{name}' is enabled") + public ChipGroupAssert enabled() { + jdiAssert(element().isEnabled() ? "enabled" : "disabled", Matchers.is("enabled")); + return this; + } + + @JDIAction("Assert that '{name}' aria-orientation is vertical") + public ChipGroupAssert vertical() { + jdiAssert(element().isVertical(), Matchers.is(true), "Element is not vertical"); + return this; + } + + @JDIAction("Assert that '{name}' aria-orientation is not vertical") + public ChipGroupAssert notVertical() { + jdiAssert(element().isVertical(), Matchers.is(false), "Element is not vertical"); + return this; + } + + @JDIAction("Assert that '{name}' has multiple select options") + public ChipGroupAssert multiselectable() { + jdiAssert(element().multiselectable(), Matchers.is("true")); + return this; + } + + @JDIAction("Assert that '{name}' has multiple select options") + public ChipGroupAssert notMultiselectable() { + jdiAssert(element().multiselectable(), Matchers.is("false")); + return this; + } + + @JDIAction("Assert that '{name}' has '{0}' element") + public ChipGroupAssert hasElement(String expected) { + jdiAssert(element().hasElement(expected), Matchers.is(true), "Element is has not " + expected + " element"); + return this; + } + + @JDIAction("Assert that '{name}' has error state") + public ChipGroupAssert errorState() { + jdiAssert(element().errorState(), Matchers.is(true), "Element is has not error state"); + return this; + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipsAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipsAssert.java deleted file mode 100644 index 9d2dab6467..0000000000 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/ChipsAssert.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.epam.jdi.light.angular.asserts; - -import com.epam.jdi.light.angular.elements.complex.Chips; -import com.epam.jdi.light.asserts.generic.UIAssert; -import com.epam.jdi.light.common.JDIAction; -import org.hamcrest.Matchers; - -import java.util.List; - -import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; - -public class ChipsAssert extends UIAssert { - - - @JDIAction(value = "Assert that '{name}' enabled", isAssert = true) - public ChipsAssert assertChipsIsEnabled() { - jdiAssert(element().enabled(), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); - return this; - } - - @JDIAction(value = "Assert that '{name}' has options", isAssert = true) - public ChipsAssert assertChipsHasOptions(List options) { - jdiAssert(element().options(), Matchers.is(options)); - return this; - } - - @JDIAction(value = "Assert that '{name}' has placeholder '{0}'", isAssert = true) - public ChipsAssert assertChipsHasPlaceholder(String expected) { - jdiAssert(element().getPlaceholderForChips(), Matchers.is(expected)); - return this; - } -} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Chip.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Chip.java new file mode 100644 index 0000000000..b5a084c658 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Chip.java @@ -0,0 +1,78 @@ +package com.epam.jdi.light.angular.elements.common; + +import com.epam.jdi.light.angular.asserts.ChipAssert; + +import com.epam.jdi.light.angular.elements.interfaces.HasIcon; +import com.epam.jdi.light.angular.elements.interfaces.HasImage; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.common.Label; +import com.epam.jdi.light.elements.interfaces.base.HasClick; +import com.epam.jdi.light.elements.interfaces.base.HasColor; +import com.epam.jdi.light.elements.interfaces.base.HasLabel; + +public class Chip extends UIBaseElement implements HasClick, HasColor, HasIcon, HasImage, HasLabel { + + public static final String MAT_CHIP_REMOVE = "[matChipRemove]"; + + @JDIAction("Get if '{name} is selected'") + public boolean selected() { + return core().hasClass("mat-mdc-chip-selected"); + } + + @JDIAction("Close '{name}'") + public void remove() { + core().find(MAT_CHIP_REMOVE).click(); + } + + @JDIAction("Get if '{name}' is removable") + public boolean removable() { + return core().find(MAT_CHIP_REMOVE).isDisplayed(); + } + + @JDIAction("Get if '{name}' is focused") + public boolean focused() { + return core().hasClass("cdk-focused"); + } + + @JDIAction("Get if '{name}' checkmark is visible") + public boolean hasCheckMark() { + return core().find("mdc-evolution-chip__checkmark").isVisible(); + } + + @JDIAction("Get if '{name}' is highlighted") + public boolean highlighted() { + return core().hasClass("mat-mdc-chip-highlighted"); + } + + @JDIAction("Select '{name}'") + public void select() { + if (!selected()) { + label().click(); + } + } + + @JDIAction("Unselect '{name}'") + public void unselect() { + if (selected()) { + label().click(); + } + } + + @Override + public Label label() { + return new Label().setCore(Label.class, core().find(".mdc-evolution-chip__text-label")); + } + + @Override + @JDIAction("Get '{name}' label text") + public String labelText() { + return label().getText(); + } + + @Override + public ChipAssert is() { + return new ChipAssert().set(this); + } + +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/AutoComplete.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/AutoComplete.java index 5442ee166d..e8bbfcb33e 100644 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/AutoComplete.java +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/AutoComplete.java @@ -15,7 +15,11 @@ import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static com.epam.jdi.light.common.TextTypes.VALUE; @@ -61,6 +65,7 @@ public void select(String value) { if (value == null) { return; } + core().click(); WebList options = getOptions(optionsCss); options.get(value).click(); } @@ -238,8 +243,8 @@ public Boolean expanded() { return false; } else { return getOptions().get(1). - getAllAttributes().keys(). - contains(getAutocompleteUniqueAttribute()); + getAllAttributes().keys(). + contains(getAutocompleteUniqueAttribute()); } } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/ChipGroup.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/ChipGroup.java new file mode 100644 index 0000000000..9afd75bb3b --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/ChipGroup.java @@ -0,0 +1,95 @@ +package com.epam.jdi.light.angular.elements.complex; + +import com.epam.jdi.light.angular.asserts.ChipGroupAssert; +import com.epam.jdi.light.angular.elements.common.Chip; +import com.epam.jdi.light.angular.elements.interfaces.FormField; +import com.epam.jdi.light.angular.elements.interfaces.HasOrientation; +import com.epam.jdi.light.angular.elements.interfaces.IsGroupElement; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; + +import java.util.List; +import java.util.stream.Collectors; + +public class ChipGroup extends UIBaseElement implements IsGroupElement, HasOrientation, FormField { + + public static final String CHIP_LOCATOR = ".mat-mdc-chip"; + + @Override + @JDIAction("Get list of '{name}' items") + public List groupElements() { + core().timer().wait(() -> core().finds(CHIP_LOCATOR).isDisplayed()); + return core().finds(CHIP_LOCATOR).stream() + .map(listItem -> new Chip().setCore(Chip.class, listItem)) + .collect(Collectors.toList()); + } + + @Override + @JDIAction("Get {0} element from '{name}'") + public Chip getElement(String value) { + return groupElements().stream() + .filter(element -> element.labelText().equals(value)) + .findFirst() + .get(); + } + + @JDIAction("Get if {0} element exist in '{name}'") + public boolean hasElement(String value) { + return groupElements().stream() + .anyMatch(chip -> chip.labelText().equals(value)); + } + + @Override + @JDIAction("Get if all chips elements in '{name}' is enabled") + public boolean isEnabled() { + return groupElements().stream() + .allMatch(ICoreElement::isEnabled); + } + + @JDIAction("Select chip element in '{name}' by '{0}'") + public void selectByLabel(String text) { + Chip chip = getElement(text); + chip.select(); + } + + @JDIAction("Select chip element in '{name}' by '{0}'") + public void selectByLabel(List values) { + values.forEach(value -> { + Chip chip = getElement(value); + chip.select(); + }); + + } + + @JDIAction("Deselect chip element in '{name}' by '{0}'") + public void unselectByLabel(String text) { + Chip chip = getElement(text); + chip.unselect(); + } + + @JDIAction("Deselect chip element in '{name}' by '{0}'") + public void unselectByLabel(List values) { + values.forEach(value -> { + Chip chip = getElement(value); + chip.unselect(); + }); + + } + + @Override + @JDIAction("Get if '{name}' is vertical") + public boolean isVertical() { + return core().attr("class").contains("mat-chip-list-stacked"); + } + + @JDIAction("Get if '{name}' has multiple selection") + public String multiselectable() { + return core().attr("aria-multiselectable"); + } + + @Override + public ChipGroupAssert is() { + return new ChipGroupAssert().set(this); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Chips.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Chips.java deleted file mode 100644 index 6cd368d173..0000000000 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Chips.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.epam.jdi.light.angular.elements.complex; - -import com.epam.jdi.light.angular.asserts.ChipsAssert; -import com.epam.jdi.light.common.JDIAction; -import com.epam.jdi.light.elements.base.UIBaseElement; -import com.epam.jdi.light.elements.common.UIElement; -import com.epam.jdi.light.elements.complex.WebList; -import com.epam.jdi.light.elements.interfaces.base.HasPlaceholder; -import com.epam.jdi.light.elements.interfaces.base.SetValue; -import com.epam.jdi.light.elements.interfaces.common.IsInput; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.Point; - -import java.util.ArrayList; -import java.util.List; - -/** - * To see an example of Chips web element please visit https://material.angular.io/components/chips/overview. - */ - -public class Chips extends UIBaseElement implements HasPlaceholder, SetValue, IsInput { - - public String backdropField = "#chips-autocomplete-field"; - private final String matOptions = "mat-option"; - - @JDIAction("Click '{name}' chips by text '{0}'") - public void clickChipsByTextValue(String value) { - getChipsByText(value).click(); - } - - @JDIAction("Click '{name}'") - public void click() { - core().click(); - } - - @JDIAction("Get options for '{name}'") - public List options() { - getItems(); - return getValues(); - } - - @JDIAction("Get '{name}' chips by text '{0}'") - public UIElement getChipsByText(String value) { - UIElement element = null; - for (UIElement e : getChips()) { - if (e.getText().equalsIgnoreCase(value)) { - element = e; - } - } - return element; - } - - @JDIAction("'{name}' has text '{0}'") - public boolean chipsHasText(String value) { - return getChipsByText(value).getText().equalsIgnoreCase(value); - } - - public boolean enabled() { - return !isDisabled(); - } - - @JDIAction("Get placeholder for '{name}'") - public String getPlaceholderForChips() { - String placeholder = "placeholder"; - return core().hasAttribute(placeholder) ? core().getAttribute(placeholder) : ""; - } - - @JDIAction("'{name}' input '{0}' value") - public void input(String value) { - core().input(value); - } - - @JDIAction("Select value '{0}' for '{name}'") - public void select(String value) { - if (value == null) { - return; - } - WebList options = getOptions(this.matOptions); - options.get(value).click(); - } - - @Override - public String getValue() { - return text(); - } - - public void setValue(String inputValue, String selectValue) { - input(inputValue); - select(selectValue); - } - - @Override - public void setValue(String selectValue) { - click(); - select(selectValue); - } - - @JDIAction("Clear value from '{name}'") - public void clearInputField() { - sendKeys(Keys.CONTROL + "a"); - sendKeys(Keys.DELETE); - } - - @JDIAction("Collapse '{name}' chips autocomplete field") - public void collapseField() { - getBackdropField().core() - .click(getPointOutsideField().getX(), getPointOutsideField().getY()); - } - - - @Override - public ChipsAssert is() { - return new ChipsAssert().set(this); - } - - protected UIElement getBackdropField() { - return new UIElement(By.cssSelector(backdropField)); - } - - protected Point getPointOutsideField() { - UIElement uiElement = getBackdropField(); - return new Point(uiElement.core().getRect(). - getWidth() + 3, uiElement.core().getRect().getHeight() + 3); - } - - private WebList getChips() { - return this.finds("mat-chip"); - } - - private WebList getOptions(String css) { - return new WebList(By.cssSelector(css)); - } - - private WebList getItems() { - click(); - WebList options = getOptions(matOptions); - click(); - return options; - } - - private List getValues() { - List values = new ArrayList<>(); - WebList options = getOptions(this.matOptions); - options.forEach(option -> values.add(option.getValue())); - return values; - } - -} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/FormField.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/FormField.java new file mode 100644 index 0000000000..7b2a1054fa --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/FormField.java @@ -0,0 +1,17 @@ +package com.epam.jdi.light.angular.elements.interfaces; + +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; + +public interface FormField extends ICoreElement { + + /** + * Checks if element has Error State or not. + * + * @return {@code true} if element has Error State, otherwise {@code false} + */ + @JDIAction("Get if '{name}' is vertical") + default boolean errorState() { + return core().hasClass("mat-form-field-invalid"); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasIcon.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasIcon.java new file mode 100644 index 0000000000..ff6085d682 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasIcon.java @@ -0,0 +1,33 @@ +package com.epam.jdi.light.angular.elements.interfaces; + +import com.epam.jdi.light.angular.elements.common.Icon; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; + +/** + * Represents an element that has an {@link Icon}. + */ +public interface HasIcon extends ICoreElement { + + String ICON_LOCATOR = ".//mat-icon"; + + /** + * Gets the icon of the element. + * + * @return icon of the element as {@link Icon} + */ + @JDIAction("Get '{name}' icon") + default Icon icon() { + return new Icon().setCore(Icon.class, core().find(ICON_LOCATOR)); + } + + /** + * Checks if element has icon or not. + * + * @return {@code true} if element has icon, otherwise {@code false} + */ + @JDIAction("Get if '{name}' has icon") + default boolean hasIcon() { + return icon().isExist() & icon().isVisible(); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasImage.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasImage.java new file mode 100644 index 0000000000..428d660951 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasImage.java @@ -0,0 +1,31 @@ +package com.epam.jdi.light.angular.elements.interfaces; + +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; +import com.epam.jdi.light.ui.html.elements.common.Image; + +/** + * Represents an element that has an {@link Image}. + */ +public interface HasImage extends ICoreElement { + + /** + * Gets the image of the element. + * + * @return image of the element as {@link Image} + */ + @JDIAction("Get '{name}' image") + default Image image() { + return new Image().setCore(Image.class, core().find("img")); + } + + /** + * Checks that image or background image is displayed. + * + * @return {@code true} if the image is displayed, otherwise {@code false} + */ + @JDIAction("Check that '{name}' image is displayed") + default boolean hasImage() { + return image().isExist() & image().isVisible(); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasOrientation.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasOrientation.java new file mode 100644 index 0000000000..0652cfbac5 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/HasOrientation.java @@ -0,0 +1,20 @@ +package com.epam.jdi.light.angular.elements.interfaces; + +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; + +/** + * Interface HasOrientation includes methods to check element orientation. + */ +public interface HasOrientation extends ICoreElement { + + /** + * Checks if element is vertical or not. + * + * @return {@code true} if element is vertical, otherwise {@code false} + */ + @JDIAction("Get if '{name}' is vertical") + default boolean isVertical() { + return core().attr("class").contains("-vertical"); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/IsGroupElement.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/IsGroupElement.java new file mode 100644 index 0000000000..87b4b01335 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/interfaces/IsGroupElement.java @@ -0,0 +1,19 @@ +package com.epam.jdi.light.angular.elements.interfaces; + +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.interfaces.base.ICoreElement; + +import java.util.List; + +public interface IsGroupElement> extends ICoreElement { + + List groupElements(); + + A getElement(String value); + + @JDIAction("Get size of '{name}'") + default int size() { + return groupElements().size(); + } +}