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..fb757dec9d 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 @@ -5,11 +5,12 @@ import io.github.com.pages.AngularPage; import io.github.com.pages.AutocompletePage; import io.github.com.pages.BadgePage; -import io.github.com.pages.InputPage; import io.github.com.pages.ButtonTogglePage; import io.github.com.pages.ButtonsPage; import io.github.com.pages.CheckBoxPage; +import io.github.com.pages.DialogPage; import io.github.com.pages.DividerPage; +import io.github.com.pages.InputPage; import io.github.com.pages.ProgressBarPage; import io.github.com.pages.ProgressSpinnerPage; import io.github.com.pages.RadioButtonPage; @@ -36,11 +37,14 @@ public class StaticSite { @Url("badges") public static BadgePage badgePage; + @Url("dialog") + public static DialogPage dialogPage; + @Url("buttons_toggle") - public static ButtonTogglePage buttonTogglePage; + public static ButtonTogglePage buttonTogglePage; @Url("divider") - public static DividerPage dividerPage; + public static DividerPage dividerPage; @Url("autocompletes") public static AutocompletePage autocompletePage; diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/ActionDialog.java b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/ActionDialog.java new file mode 100644 index 0000000000..7fc383bf0b --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/ActionDialog.java @@ -0,0 +1,21 @@ +package io.github.com.custom.elements.dialog; + +import com.epam.jdi.light.angular.elements.common.Button; +import com.epam.jdi.light.angular.elements.complex.Dialog; + +public class ActionDialog extends Dialog { + + public String title() { + return core().find("mat-dialog-title").getText(); + } + + + public Button installButton() { + return new Button().setCore(Button.class, core().find(".mat-mdc-dialog-actions button:last-child")); + } + + public Button cancelButton() { + return new Button().setCore(Button.class, core().find(".mat-mdc-dialog-actions button:first-child")); + } + +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/OverviewDialog.java b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/OverviewDialog.java new file mode 100644 index 0000000000..30e1325371 --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/custom/elements/dialog/OverviewDialog.java @@ -0,0 +1,24 @@ +package io.github.com.custom.elements.dialog; + +import com.epam.jdi.light.angular.elements.common.Button; +import com.epam.jdi.light.angular.elements.common.Input; +import com.epam.jdi.light.angular.elements.complex.Dialog; + +public class OverviewDialog extends Dialog { + + public String title() { + return core().find("mat-dialog-title").getText(); + } + + public Input inputField() { + return new Input().setCore(Input.class, core().find("input")); + } + + public Button okButton() { + return new Button().setCore(Button.class, core().find(".mat-mdc-dialog-actions button:last-child")); + } + + public Button noThanksButton() { + return new Button().setCore(Button.class, core().find(".mat-mdc-dialog-actions button:first-child")); + } +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/DialogPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/DialogPage.java new file mode 100644 index 0000000000..250d857377 --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/DialogPage.java @@ -0,0 +1,67 @@ +package io.github.com.pages; + +import com.epam.jdi.light.angular.elements.common.Button; +import com.epam.jdi.light.angular.elements.common.Input; +import com.epam.jdi.light.angular.elements.complex.AutoComplete; +import com.epam.jdi.light.angular.elements.complex.Dialog; +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.dialog.ActionDialog; +import io.github.com.custom.elements.dialog.OverviewDialog; + +public class DialogPage extends NewAngularPage { + + @UI(".mat-mdc-input-element") + public static Input nameFormFields; + + @UI("#dialog") + public static Button dialogOverviewButton; + + @UI("#dialog-animations-open-dialog-btn-without-animation") + public static Button dialogWithoutAnimationsButton; + + @UI("#dialog-animations-open-dialog-btn-with-animation") + public static Button dialogWithAnimationsButton; + + @UI("mat-dialog-container") + public static OverviewDialog nameDialog; + + @UI("dialog-overview-example li:last-child") + public static Text youChooseText; + + @UI("#dialog-animations-open-dialog-btn-without-animation") + public static Button withoutAnimationButton; + + @UI("#dialog-animations-open-dialog-btn-with-animation") + public static Button withAnimationButton; + + @UI("mat-dialog-container") + public static Dialog withoutAnimationDialog; + + @UI("mat-dialog-container") + public static Dialog withAnimationDialog; + + @UI("mat-form-field.ng-tns-c17-1") + public static AutoComplete alignAction; + + @UI("mat-form-field.ng-tns-c17-7") + public static AutoComplete disableCloseAction; + + @UI("mat-form-field.ng-tns-c17-15") + public static AutoComplete maxHeightAutocomplete; + + @UI("mat-form-field.ng-tns-c17-17") + public static AutoComplete minHeightAutocomplete; + + @UI("mat-form-field.ng-tns-c17-19") + public static AutoComplete maxWidthAutocomplete; + + @UI("mat-form-field.ng-tns-c17-21") + public static AutoComplete minWidthAutocomplete; + + @UI("mat-dialog-container") + public static ActionDialog customizableDialog; + + @UI("#dialog-scrollable-content-open-btn") + public static Button dialogActionButton; +} diff --git a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/DialogTests.java b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/DialogTests.java index b7bb72f22f..6d5beaf33d 100644 --- a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/DialogTests.java +++ b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/DialogTests.java @@ -2,33 +2,89 @@ import io.github.epam.TestsInit; import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; -import static io.github.com.StaticSite.angularPage; -import static io.github.com.pages.AngularPage.dialog; -import static io.github.epam.site.steps.States.shouldBeLoggedIn; +import static com.epam.jdi.light.angular.elements.enums.DialogPosition.CENTER; +import static com.jdiai.tools.Timer.waitCondition; +import static io.github.com.StaticSite.checkBoxPage; +import static io.github.com.StaticSite.dialogPage; +import static io.github.com.pages.DialogPage.alignAction; +import static io.github.com.pages.DialogPage.customizableDialog; +import static io.github.com.pages.DialogPage.dialogActionButton; +import static io.github.com.pages.DialogPage.dialogOverviewButton; +import static io.github.com.pages.DialogPage.minHeightAutocomplete; +import static io.github.com.pages.DialogPage.minWidthAutocomplete; +import static io.github.com.pages.DialogPage.nameDialog; +import static io.github.com.pages.DialogPage.nameFormFields; +import static io.github.com.pages.DialogPage.withAnimationButton; +import static io.github.com.pages.DialogPage.withAnimationDialog; +import static io.github.com.pages.DialogPage.withoutAnimationButton; +import static io.github.com.pages.DialogPage.withoutAnimationDialog; +import static io.github.com.pages.DialogPage.youChooseText; -// TODO Move to the new page -@Ignore public class DialogTests extends TestsInit { @BeforeClass(alwaysRun = true) public void before() { - shouldBeLoggedIn(); - angularPage.shouldBeOpened(); - dialog.show(); + dialogPage.open(); + waitCondition((() -> checkBoxPage.isOpened())); + dialogPage.checkOpened(); } - @Test - public void basicDialogTest() { - dialog.sendKeysToNameFormField("EPAM Systems"); - dialog.open(); - dialog.is().opened(); - dialog.is().nameText("EPAM Systems"); - dialog.sendKeysToAnswerFormField("Lion"); - dialog.submitAnswer(); - dialog.is().closed(); - dialog.is().answerText("Lion"); + @Test(description = "Test checks opening and closing a dialog") + public void baseTest() { + nameFormFields.input("EPAM Systems"); + dialogOverviewButton.click(); + nameDialog.is().opened(); + nameDialog.close(); + nameDialog.is().closed(); } + + + @Test(description = "Test checks opening and closing a dialog") + public void dialogOverviewTest() { + nameFormFields.input("EPAM Systems"); + dialogOverviewButton.click(); + nameDialog.is().opened(); + nameDialog.inputField().input("Lion"); + nameDialog.okButton().click(); + nameDialog.is().closed(); + youChooseText.is().text("You choose: Lion"); + } + + @Test(description = "Test checks the dialog animation") + public void animationTest() { + withoutAnimationButton.click(); + withoutAnimationDialog.is().opened(); + withoutAnimationDialog.has().animationDuration("0ms"); + withoutAnimationDialog.close(); + + withAnimationButton.click(); + withAnimationDialog.is().opened(); + withAnimationDialog.has().animationDuration("3000ms"); + withAnimationDialog.close(); + } + + @Test(description = "Test checks the align of action buttons") + public void actionAlignTest() { + alignAction.select("Center"); + dialogActionButton.click(); + customizableDialog.is().opened(); + customizableDialog.has().position(CENTER); + customizableDialog.close(); + } + + @Test(description = "Test checks the height and width") + public void sizeTest() { + minHeightAutocomplete.select("500px"); + minWidthAutocomplete.select("500px"); + dialogActionButton.click(); + customizableDialog.is().opened(); + customizableDialog.has().maxHeight("1000px"); + customizableDialog.has().minHeight("500px"); + customizableDialog.has().maxWidth("1000px"); + customizableDialog.has().minWidth("500px"); + customizableDialog.close(); + } + } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/DialogAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/DialogAssert.java index 20d88fb96b..78c1b9af6e 100644 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/DialogAssert.java +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/DialogAssert.java @@ -1,6 +1,7 @@ package com.epam.jdi.light.angular.asserts; import com.epam.jdi.light.angular.elements.complex.Dialog; +import com.epam.jdi.light.angular.elements.enums.DialogPosition; import com.epam.jdi.light.asserts.generic.UIAssert; import com.epam.jdi.light.common.JDIAction; import org.hamcrest.Matchers; @@ -14,21 +15,63 @@ public DialogAssert opened() { return this; } - @JDIAction(value = "Assert that '{name}' closed", isAssert = true) + @JDIAction(value = "Assert that '{name}' closed") public DialogAssert closed() { - jdiAssert(element().isClosed(), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); + jdiAssert(element().isClosed(), Matchers.is(false), "ERROR MESSAGE IS REQUIRED"); return this; } - @JDIAction(value = "Assert that '{name}' name is {0}", isAssert = true) - public DialogAssert nameText(String name) { - jdiAssert(element().nameText(name), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); +// @JDIAction(value = "Assert that '{name}' has title", isAssert = true) +// public DialogAssert title() { +// jdiAssert(element().hasTitle(), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); +// return this; +// } + + @JDIAction(value = "Assert that '{name}' ", isAssert = true) + public DialogAssert position(DialogPosition position) { + jdiAssert(element().dialogActionsAlign(), Matchers.is(position)); + return this; + } + + @JDIAction(value = "Assert that '{name}'", isAssert = true) + public DialogAssert maxHeight(String value) { + jdiAssert(element().maxHeight(), Matchers.is(value), "ERROR MESSAGE IS REQUIRED"); + return this; + } + + @JDIAction(value = "Assert that '{name}'", isAssert = true) + public DialogAssert minHeight(String value) { + jdiAssert(element().minHeight(), Matchers.is(value), "ERROR MESSAGE IS REQUIRED"); + return this; + } + + @JDIAction(value = "Assert that '{name}'", isAssert = true) + public DialogAssert maxWidth(String value) { + jdiAssert(element().maxWidth(), Matchers.is(value), "ERROR MESSAGE IS REQUIRED"); + return this; + } + + @JDIAction(value = "Assert that '{name}'", isAssert = true) + public DialogAssert minWidth(String value) { + jdiAssert(element().minHeight(), Matchers.is(value), "ERROR MESSAGE IS REQUIRED"); return this; } - @JDIAction(value = "Assert that '{name}' answer is {0}", isAssert = true) - public DialogAssert answerText(String answer) { - jdiAssert(element().answerText(answer), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); + @JDIAction(value = "Assert that '{name}'", isAssert = true) + public DialogAssert animationDuration(String value) { + jdiAssert(element().animationDuration(), Matchers.is(value)); return this; } +// +// @JDIAction(value = "Assert that '{name}' has content", isAssert = true) +// public DialogAssert content() { +// jdiAssert(element().hasContent(), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); +// return this; +// } +// +// @JDIAction(value = "Assert that '{name}' has action", isAssert = true) +// public DialogAssert action() { +// jdiAssert(element().hasAction(), Matchers.is(true), "ERROR MESSAGE IS REQUIRED"); +// return 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..66c26d0dfb 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 @@ -61,6 +61,7 @@ public void select(String value) { if (value == null) { return; } + click(); WebList options = getOptions(optionsCss); options.get(value).click(); } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Dialog.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Dialog.java index 9325b7bc7d..fb9967b58d 100644 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Dialog.java +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/Dialog.java @@ -1,10 +1,10 @@ package com.epam.jdi.light.angular.elements.complex; import com.epam.jdi.light.angular.asserts.DialogAssert; +import com.epam.jdi.light.angular.elements.common.Button; +import com.epam.jdi.light.angular.elements.enums.DialogPosition; +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.ui.html.elements.common.Button; -import org.openqa.selenium.By; import org.openqa.selenium.Keys; /** @@ -12,92 +12,69 @@ */ public class Dialog extends UIBaseElement { - protected Button dialog; - public String answerLabel = "dialog-overview-example li.ng-star-inserted"; - public String dialogContainer = ".mat-dialog-container"; - public String greetingLabel = "mat-dialog-container dialog-overview-example-dialog h1"; - public String answerFormField = "mat-dialog-container dialog-overview-example-dialog input"; - public String nameFormField = "#mat-input-74"; - public String noThanksButton = ".mat-dialog-container .mat-dialog-actions button:first-child"; - public String okButton = ".mat-dialog-container .mat-dialog-actions button:last-child"; @Override public DialogAssert is() { return new DialogAssert().set(this); } - public void clickOkButton() { - getOkButton().click(); - } - - public void clickNoThanksButton() { - getNoThanksButton().click(); - } - - public void sendKeysToNameFormField(String name) { - getNameFormField().sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); - getNameFormField().sendKeys(name); - } - - public void sendKeysToAnswerFormField(String answer) { - getAnswerFormField().sendKeys(Keys.chord(Keys.CONTROL, "a", Keys.DELETE)); - getAnswerFormField().sendKeys(answer); - } - - public void open() { - dialog.click(); - } - + @JDIAction("Close '{name}'") public void close() { - clickNoThanksButton(); - } - - public void submitAnswer() { - clickOkButton(); - } - - public boolean answerText(String answer) { - return getAnswerLabel().getText().equals("You choose: " + answer); + core().focus(); + press(Keys.ESCAPE); +// if (isOpened()) { +// throw runtimeException("Dialog cannot be closed by pressing esc key"); +// } } - public boolean nameText(String name) { - return getGreetingLabel().getText().equalsIgnoreCase("Hi " + name); + @JDIAction("Close '{name}' with '{0}' button") + public void close(String closeButtonName) { + Button button = new Button().setCore(Button.class, core().find("//span[contains(text(), '" + closeButtonName + "')]")); + button.click(); } + @JDIAction("Check that '{name}' is open") public boolean isOpened() { - return getDialogContainer().isDisplayed(); + return core().isDisplayed(); } + @JDIAction("Check that '{name}' is close") public boolean isClosed() { - getDialogContainer().waitFor().disappear(); return !isOpened(); } - protected UIElement getOkButton() { - return new UIElement(By.cssSelector(okButton)); + @JDIAction("Get '{name}' dialog actions align") + public DialogPosition dialogActionsAlign() { + return DialogPosition.from(core().find("mat-dialog-actions").css("justify-content")); } - protected UIElement getAnswerFormField() { - return new UIElement(By.cssSelector(answerFormField)); + @JDIAction("Get '{name}' max height") + public String maxHeight() { + return core().css("max-height"); } - protected UIElement getNoThanksButton() { - return new UIElement(By.cssSelector(noThanksButton)); + @JDIAction("Get '{name}' mix height") + public String minHeight() { + return core().css("min-height"); } - protected UIElement getNameFormField() { - return new UIElement(By.cssSelector(nameFormField)); + @JDIAction("Get '{name}' max width") + public String maxWidth() { + return core().css("max-width"); } - protected UIElement getDialogContainer() { - return new UIElement(By.cssSelector(dialogContainer)); + @JDIAction("Get '{name}' mix width") + public String minWidth() { + return core().css("min-width"); } - protected UIElement getAnswerLabel() { - return new UIElement(By.cssSelector(answerLabel)); + @JDIAction("Get '{name}' height") + public String height() { + return core().css("height"); } - protected UIElement getGreetingLabel() { - return new UIElement(By.cssSelector(greetingLabel)); + @JDIAction("Get '{name}' animation duration") + public String animationDuration() { + return core().attr("style").substring(34).replace(";", ""); } } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/DialogPosition.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/DialogPosition.java new file mode 100644 index 0000000000..1cba90e4a2 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/DialogPosition.java @@ -0,0 +1,30 @@ +package com.epam.jdi.light.angular.elements.enums; + +import java.util.Arrays; + +public enum DialogPosition { + START("start"), + CENTER("center"), + END("end"); + + private final String position; + + DialogPosition(String label) { + this.position = label; + } + + public String getPosition() { + return position; + } + + public static int size() { + return values().length; + } + + public static DialogPosition from(String position) { + return Arrays.stream(values()) + .filter(p -> p.position.equalsIgnoreCase(position)) + .findFirst() + .orElse(START); + } +}