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 4e455af70a..f44870b17b 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,6 +5,7 @@ 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; @@ -25,6 +26,9 @@ public class StaticSite { @Url("progress_spinner") public static ProgressSpinnerPage progressSpinnerPage; + @Url("input") + public static InputPage inputPage; + @Url("buttons") public static ButtonsPage buttonsPage; diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputsForm.java b/jdi-light-angular-tests/src/main/java/io/github/com/entities/InputsForm.java similarity index 50% rename from jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputsForm.java rename to jdi-light-angular-tests/src/main/java/io/github/com/entities/InputsForm.java index bf4c40b736..e377e49b81 100644 --- a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputsForm.java +++ b/jdi-light-angular-tests/src/main/java/io/github/com/entities/InputsForm.java @@ -1,30 +1,33 @@ -package io.github.com.pages.sections; +package io.github.com.entities; +import com.epam.jdi.light.angular.elements.common.Input; +import com.epam.jdi.light.angular.elements.common.TextArea; import com.epam.jdi.light.elements.composite.Form; import com.epam.jdi.light.elements.pageobjects.annotations.locators.UI; -import com.epam.jdi.light.ui.html.elements.common.TextField; -import io.github.com.entities.User; public class InputsForm extends Form { + @UI("[id^='mat-input-']") + public Input company; + @UI("#inputs_form_firstName") - public TextField firstName; + public Input firstName; @UI("#inputs_form_lastName") - public TextField lastName; + public Input lastName; @UI("#inputs_form_address") - public TextField address; + public TextArea address; @UI("#inputs_form_address2") - public TextField address2; + public TextArea address2; @UI("#inputs_form_city") - public TextField city; + public Input city; @UI("#inputs_form_state") - public TextField state; + public Input state; @UI("#inputs_form_postalCode") - public TextField postalCode; + public Input postalCode; } diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/AngularPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/AngularPage.java index 8efc4e4101..84c2f815cd 100644 --- a/jdi-light-angular-tests/src/main/java/io/github/com/pages/AngularPage.java +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/AngularPage.java @@ -37,7 +37,6 @@ public class AngularPage extends WebPage { public static Dialog dialog; public static ToolbarSection toolbarSection; public static SlideToggleSection slideToggleSection; - public static InputSection inputSection; public static SelectSection selectSection; public static ListSection listSection; public static GridListSection gridListSection; diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/CheckBoxPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/CheckBoxPage.java index 112bc276fa..7712ca80d9 100644 --- a/jdi-light-angular-tests/src/main/java/io/github/com/pages/CheckBoxPage.java +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/CheckBoxPage.java @@ -33,7 +33,7 @@ public class CheckBoxPage extends NewAngularPage { @UI("#checkbox-required-option") public static Checkbox requiredCheckbox; - @UI("//*[@class='error']") + @UI("//*[contains(@class, 'error')]") public static Text requiredCheckboxText; } diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/InputPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/InputPage.java new file mode 100644 index 0000000000..03019ae82f --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/InputPage.java @@ -0,0 +1,66 @@ +package io.github.com.pages; + +import com.epam.jdi.light.angular.elements.common.Input; +import com.epam.jdi.light.angular.elements.common.TextArea; +import com.epam.jdi.light.elements.pageobjects.annotations.locators.UI; +import com.epam.jdi.light.ui.html.elements.common.Button; +import com.epam.jdi.light.ui.html.elements.common.Icon; +import com.epam.jdi.light.ui.html.elements.common.Text; +import io.github.com.entities.InputsForm; + +public class InputPage extends NewAngularPage { + + @UI("#inputs_basic_food") + public static Input inputBasicFood; + + @UI("#inputs_basic_comment") + public static TextArea textAreaBasicLeaveAComment; + + @UI("#inputs_errorStateMatcher_email") + public static Input inputEmailErrorStateMatcher; + + @UI("#inputs_errorStateMatcher_message") + public static Text messageErrorStateMatcher; + + @UI("#inputs_autosize_textarea") + public static TextArea textAreaAutoSize; + + @UI("#inputs_clearable_textbox") + public static Input inputWithClearButton; + + @UI("#inputs_clearable_button") + public static Button buttonClear; + + @UI("#inputs_error_email") + public static Input inputErrorMail; + + @UI("#inputs_error_message") + public static Text messageError; + + @UI("input-form-example form") + public static InputsForm inputsForm; + + @UI("#inputs_hints_message") + public static Input inputWithMessageHint; + + @UI("#inputs_hints_text") + public static Text messageHint; + + @UI("#inputs_hints_counter") + public static Text messageHintCounter; + + @UI("#inputs_prefixes") + public static Text prefixForInput; + + @UI("#inputs_suffixes") + public static Icon suffixForInput; + + @UI("#inputs_prefixes_suffixes_phone") + public static Input inputTelephone; + + @UI("#input-readonly-option") + public static Input inputWithReadonly; + + @UI("[id^='mat-input-'][type='text']") + public static Input inputAriaLabel; +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputSection.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputSection.java deleted file mode 100644 index e7b8dc8e23..0000000000 --- a/jdi-light-angular-tests/src/main/java/io/github/com/pages/sections/InputSection.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.com.pages.sections; - -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.*; - -public class InputSection extends Section { - - @UI("#inputs_basic_food") - public static TextField foodBasicInput; - - @UI("#inputs_basic_comment") - public static TextField leaveACommentBasicInput; - - @UI("#inputs_errorStateMatcher_email") - public static TextField emailErrorStateMatcherInput; - - @UI("#inputs_errorStateMatcher_message") - public static Text errorStateMatcherMessageInput; - - @UI("#inputs_autosize_textarea") - public static TextArea autoSizeTextArea; - - @UI("#inputs_clearable_textbox") - public static TextArea clearableInput; - - @UI("#inputs_clearable_button") - public static Button clearableInputButton; - - @UI("#inputs_error_email") - public static TextField emailInput; - - @UI("#inputs_error_message") - public static Text errorMessageInput; - - @UI("input-form-example form") - public static InputsForm inputsForm; - - @UI("#inputs_hints_message") - public static TextField messageHintInput; - - @UI("#inputs_hints_text") - public static Text messageHint; - - @UI("#inputs_hints_counter") - public static Text messageCounterHint; - - @UI("#inputs_prefixes") - public static Text prefixInput; - - @UI("#inputs_suffixes") - public static Icon suffixInput; - - @UI("#inputs_prefixes_suffixes_phone") - public static TextField telephoneInput; -} diff --git a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/common/InputTests.java b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/common/InputTests.java index 2ec59e84a4..e9155dab5e 100644 --- a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/common/InputTests.java +++ b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/common/InputTests.java @@ -3,107 +3,210 @@ import io.github.epam.TestsInit; import org.openqa.selenium.Keys; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Ignore; import org.testng.annotations.Test; -import static io.github.com.StaticSite.angularPage; +import static com.epam.jdi.light.angular.elements.enums.InputsTypes.TEXT; +import static com.jdiai.tools.Timer.waitCondition; +import static io.github.com.StaticSite.inputPage; import static io.github.com.entities.Users.DEFAULT_USER; -import static io.github.com.pages.sections.InputSection.*; -import static org.hamcrest.Matchers.containsString; +import static io.github.com.pages.InputPage.inputAriaLabel; +import static io.github.com.pages.InputPage.textAreaAutoSize; +import static io.github.com.pages.InputPage.buttonClear; +import static io.github.com.pages.InputPage.messageHintCounter; +import static io.github.com.pages.InputPage.inputEmailErrorStateMatcher; +import static io.github.com.pages.InputPage.messageError; +import static io.github.com.pages.InputPage.messageErrorStateMatcher; +import static io.github.com.pages.InputPage.inputBasicFood; +import static io.github.com.pages.InputPage.messageHint; +import static io.github.com.pages.InputPage.inputErrorMail; +import static io.github.com.pages.InputPage.prefixForInput; +import static io.github.com.pages.InputPage.suffixForInput; +import static io.github.com.pages.InputPage.inputWithClearButton; +import static io.github.com.pages.InputPage.inputsForm; +import static io.github.com.pages.InputPage.textAreaBasicLeaveAComment; +import static io.github.com.pages.InputPage.inputWithMessageHint; +import static io.github.com.pages.InputPage.inputWithReadonly; +import static io.github.com.pages.InputPage.inputTelephone; -// TODO Move to the new page -@Ignore public class InputTests extends TestsInit { @BeforeMethod public void before() { - angularPage.shouldBeOpened(); + inputPage.open(); + waitCondition(() -> inputPage.isOpened()); + inputPage.checkOpened(); } - @Test - public void basicInputTest() { - foodBasicInput.isDisplayed(); - foodBasicInput.clear(); - foodBasicInput.setText("Lasagna"); - foodBasicInput.is().text("Lasagna"); - foodBasicInput.clear(); - foodBasicInput.sendKeys("Ice Cream"); - foodBasicInput.is().text(containsString("Ice")); - - leaveACommentBasicInput.isDisplayed(); - leaveACommentBasicInput.sendKeys("Delicious"); - leaveACommentBasicInput.is().text("Delicious"); + @Test(description = "Test checks basic inputs attributes") + public void inputBasicTest() { + inputBasicFood.shouldBe().displayed(); + inputBasicFood.show(); + inputBasicFood.shouldBe().visible(); + inputBasicFood.has().placeholder("Ex. Pizza") + .and().value("Sushi"); + inputBasicFood.is().notFocused(); + inputBasicFood.focus(); + inputBasicFood.is().focused(); + inputBasicFood.input("Ice Cream"); + inputBasicFood.has().value("Ice"); + + textAreaBasicLeaveAComment.has().placeholder("Ex. It makes me feel..."); + textAreaBasicLeaveAComment.input("Delicious"); + textAreaBasicLeaveAComment.has().value("Delicious"); } - @Test - public void inputWithACustomErrorStateMatcherTest() { - emailErrorStateMatcherInput.isDisplayed(); - emailErrorStateMatcherInput.sendKeys("test"); - errorStateMatcherMessageInput.is().text("Please enter a valid email address"); + @Test(description = "Test checks input with a clear button attributes") + public void inputCleanableTest() { + inputWithClearButton.shouldBe().displayed(); + inputWithClearButton.show(); + inputWithClearButton.shouldBe().visible(); + inputWithClearButton.has().inputType(TEXT); + inputWithClearButton.input("test"); + inputWithClearButton.has().value("test"); + + buttonClear.shouldBe().displayed(); + buttonClear.click(); + inputWithClearButton.is().value(""); } - @Test - public void autoResizingTextAreaTest() { - autoSizeTextArea.isDisplayed(); - // TODO FIX TEST - // autoSizeTextArea.has().cssClass("cdktextareaautosize"); - autoSizeTextArea.setLines("line1", "line2"); - autoSizeTextArea.addNewLine("line3"); - autoSizeTextArea.is().text("line1\nline2\nline3"); - autoSizeTextArea.clear(); - autoSizeTextArea.is().text(""); - autoSizeTextArea.setText("TextArea"); - autoSizeTextArea.is().text(containsString("Text")); + @Test(description = "Test checks input if input is readonly or not") + public void inputReadonlyTest() { + inputWithReadonly.shouldBe().displayed(); + inputWithReadonly.show(); + inputWithReadonly.shouldBe().visible(); + inputWithReadonly.has().inputType(TEXT); + inputWithReadonly.is().readonly(); + inputAriaLabel.is().notReadonly(); } - @Test - public void clearableInputTest() { - clearableInput.isDisplayed(); - clearableInput.clear(); - clearableInput.sendKeys("test"); - clearableInputButton.isDisplayed(); - clearableInputButton.click(); - clearableInput.is().text(""); + @Test(description = "Test checks inputs with a custom ErrorStateMatcher attributes") + public void inputWithCustomErrorStateMatcherTest() { + inputEmailErrorStateMatcher.shouldBe().displayed(); + inputEmailErrorStateMatcher.show(); + inputEmailErrorStateMatcher.shouldBe().visible(); + inputEmailErrorStateMatcher.has().placeholder("Ex. pat@example.com"); + inputEmailErrorStateMatcher.input("test"); + + messageErrorStateMatcher.shouldBe().displayed(); + messageErrorStateMatcher.is().text("Please enter a valid email address"); } - @Test + @Test(description = "Test checks input with error messages attributes") public void inputWithErrorMessagesTest() { - emailInput.isDisplayed(); - emailInput.sendKeys("test"); - emailInput.sendKeys(Keys.ENTER); - errorMessageInput.isDisplayed(); - errorMessageInput.is().text("Please enter a valid email address"); - } + inputErrorMail.shouldBe().displayed(); + inputErrorMail.show(); + inputErrorMail.shouldBe().visible(); + inputErrorMail.has().placeholder("Ex. pat@example.com"); + inputErrorMail.input("test"); + inputErrorMail.pressButton(Keys.ENTER); - @Test - public void inputsInAFormTest() { - inputsForm.fill(DEFAULT_USER); - inputsForm.firstName.is().text(DEFAULT_USER.firstName); - inputsForm.lastName.is().text(DEFAULT_USER.lastName); - inputsForm.address.is().text(DEFAULT_USER.address); - inputsForm.address2.is().text(DEFAULT_USER.address2); - inputsForm.city.is().text(DEFAULT_USER.city); - inputsForm.state.is().text(DEFAULT_USER.state); - inputsForm.postalCode.is().text(DEFAULT_USER.postalCode); + messageError.shouldBe().displayed(); + messageError.is().text("Please enter a valid email address"); } - @Test + @Test(description = "Test checks inputs with hints attributes") public void inputWithHintsTest() { - messageHintInput.isDisplayed(); - messageHintInput.sendKeys("test"); - messageHint.isDisplayed(); + inputWithMessageHint.shouldBe().displayed(); + inputWithMessageHint.show(); + inputWithMessageHint.shouldBe().visible(); + inputWithMessageHint.has().placeholder("Ex. I need help with..."); + inputWithMessageHint.input("test"); + + messageHint.shouldBe().displayed(); messageHint.is().text("Don't disclose personal info"); - messageCounterHint.isDisplayed(); - messageCounterHint.is().text("4 / 256"); + + messageHintCounter.shouldBe().displayed(); + messageHintCounter.is().text("4 / 256"); } - @Test + @Test(description = "Test checks inputs with prefixes and suffixes attributes") public void inputWithPrefixesAndSuffixesTest() { - prefixInput.isDisplayed(); - suffixInput.isDisplayed(); - telephoneInput.isDisplayed(); - telephoneInput.sendKeys("0123456789"); - telephoneInput.clear(); - telephoneInput.is().text(""); + prefixForInput.shouldBe().displayed(); + prefixForInput.has().text("+1 "); + suffixForInput.shouldBe().displayed(); + + inputTelephone.shouldBe().displayed(); + inputTelephone.has().placeholder("555-555-1234"); + inputTelephone.input("0123456789"); + inputTelephone.is().value("0123456789"); + inputTelephone.clear(); + inputTelephone.is().value(""); + } + + @Test(description = "Test checks input with auto-resizing textarea attributes") + public void inputWithTextAutoResizingTest() { + textAreaAutoSize.shouldBe().displayed(); + textAreaAutoSize.show(); + textAreaAutoSize.shouldBe().visible(); + textAreaAutoSize.has().autoSize(); + textAreaAutoSize.input("line1"); + textAreaAutoSize.pressButton(Keys.ENTER) + .sendKeys("line2"); + textAreaAutoSize.is().value("line1\nline2"); + textAreaAutoSize.clear(); + textAreaAutoSize.is().value(""); + } + + @Test(description = "Test checks inputs in a form attributes") + public void inputsInAFormTest() { + inputsForm.shouldBe().displayed(); + inputsForm.show(); + inputsForm.shouldBe().visible(); + inputsForm.company.shouldBe().disabled(); + inputsForm.postalCode.is().value("94043"); + + inputsForm.fill(DEFAULT_USER); + inputsForm.firstName.is().value(DEFAULT_USER.firstName); + inputsForm.lastName.is().value(DEFAULT_USER.lastName); + inputsForm.address.is().value(DEFAULT_USER.address) + .and().placeholder("Ex. 100 Main St"); + inputsForm.address2.is().value(DEFAULT_USER.address2); + inputsForm.city.is().value(DEFAULT_USER.city) + .and().placeholder("Ex. San Francisco"); + inputsForm.state.is().value(DEFAULT_USER.state) + .and().placeholder("Ex. California"); + inputsForm.postalCode.is().value(DEFAULT_USER.postalCode) + .and().placeholder("Ex. 94105"); + } + + @Test(description = "Test checks input aria-label value") + public void inputAriaLabelTest() { + inputAriaLabel.shouldBe().displayed(); + inputAriaLabel.show(); + inputAriaLabel.shouldBe().visible(); + inputAriaLabel.has().ariaLabel("Clear"); + } + + @Test(description = "Test checks changing textarea height") + public void changeTextAreaHeightTest() { + inputsForm.shouldBe().displayed(); + inputsForm.show(); + inputsForm.shouldBe().visible(); + inputsForm.address2.changeHeight(90); + inputsForm.address2.has().height(90); + } + + @Test(description = "Test checks textarea scroll up and down") + public void textAreaScrollTest() { + String[] text = {"line1", "line2", "line3", "line4", "line5"}; + textAreaBasicLeaveAComment.shouldBe().displayed(); + textAreaBasicLeaveAComment.show(); + textAreaBasicLeaveAComment.shouldBe().visible(); + for (String line : text) { + textAreaBasicLeaveAComment.sendKeys(line); + textAreaBasicLeaveAComment.pressButton(Keys.ENTER); + } + + textAreaBasicLeaveAComment.scrollToTop(); + textAreaBasicLeaveAComment.has().noScrollUp(); + textAreaBasicLeaveAComment.has().scrollDown(); + + textAreaBasicLeaveAComment.scrollToBottom(); + textAreaBasicLeaveAComment.has().scrollUp(); + textAreaBasicLeaveAComment.has().noScrollDown(); + + textAreaBasicLeaveAComment.scrollToText("line3"); + textAreaBasicLeaveAComment.has().scrollUp(); + textAreaBasicLeaveAComment.has().scrollDown(); } } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/InputAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/InputAssert.java new file mode 100644 index 0000000000..ad674fbbb4 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/InputAssert.java @@ -0,0 +1,60 @@ +package com.epam.jdi.light.angular.asserts; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; + +import com.epam.jdi.light.angular.elements.common.Input; +import com.epam.jdi.light.angular.elements.enums.InputsTypes; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matchers; + +public class InputAssert extends UIAssert { + + @JDIAction("Assert that '{name}' has typed text '{0}' in input field") + public InputAssert value(String text) { + jdiAssert(element().getValue(), Matchers.containsString(text)); + return this; + } + + @JDIAction("Assert that '{name}' is readonly") + public InputAssert readonly() { + jdiAssert(element().isReadonly(), Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' is not readonly") + public InputAssert notReadonly() { + jdiAssert(element().isReadonly(), Matchers.is(false)); + return this; + } + + @JDIAction("Assert that '{name}' has type '{0}'") + public InputAssert inputType(InputsTypes inputType) { + jdiAssert(element().inputType(), Matchers.is(inputType)); + return this; + } + + @JDIAction("Assert that '{name}' has placeholder '{0}'") + public InputAssert placeholder(String placeholder) { + jdiAssert(element().placeholder(), Matchers.containsString(placeholder)); + return this; + } + + @JDIAction("Assert that '{name}' is focused") + public InputAssert focused() { + jdiAssert(element().isFocused(), Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' is not focused") + public InputAssert notFocused() { + jdiAssert(element().isFocused(), Matchers.is(false)); + return this; + } + + @JDIAction("Assert that '{name}' has aria-label '{0}'") + public InputAssert ariaLabel(String ariaLabel) { + jdiAssert(element().hasAriaLabel(ariaLabel), Matchers.is(true)); + return this; + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/TextAreaAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/TextAreaAssert.java new file mode 100644 index 0000000000..f7d6638a8d --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/TextAreaAssert.java @@ -0,0 +1,60 @@ +package com.epam.jdi.light.angular.asserts; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; + +import com.epam.jdi.light.angular.elements.common.TextArea; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matchers; + +public class TextAreaAssert extends UIAssert { + + @JDIAction("Assert that '{name}' has attribute auto-size") + public TextAreaAssert autoSize() { + jdiAssert(element().hasAutoSize(), Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' has typed text '{0}' in input field") + public TextAreaAssert value(String text) { + jdiAssert(element().getValue(), Matchers.containsString(text)); + return this; + } + + @JDIAction("Assert that '{name}' has placeholder '{0}'") + public TextAreaAssert placeholder(String placeholder) { + jdiAssert(element().placeholder(), Matchers.containsString(placeholder)); + return this; + } + + @JDIAction("Assert that '{name}' has height '{0}'") + public TextAreaAssert height(int px) { + jdiAssert(element().attr("style").contains(String.format("height: %spx", px)), + Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' has scroll up") + public TextAreaAssert scrollUp() { + jdiAssert(element().hasScrollUp(), Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' has no scroll up") + public TextAreaAssert noScrollUp() { + jdiAssert(element().hasScrollUp(), Matchers.is(false)); + return this; + } + + @JDIAction("Assert that '{name}' has scroll down") + public TextAreaAssert scrollDown() { + jdiAssert(element().hasScrollDown(), Matchers.is(true)); + return this; + } + + @JDIAction("Assert that '{name}' has no scroll down") + public TextAreaAssert noScrollDown() { + jdiAssert(element().hasScrollDown(), Matchers.is(false)); + return this; + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Input.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Input.java new file mode 100644 index 0000000000..55e10d9a86 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/Input.java @@ -0,0 +1,61 @@ +package com.epam.jdi.light.angular.elements.common; + +import com.epam.jdi.light.angular.asserts.InputAssert; +import com.epam.jdi.light.angular.elements.enums.InputsTypes; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.interfaces.base.HasLabel; +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; + +public class Input extends UIBaseElement implements IsInput, SetValue, HasLabel { + + private static final String FORM_FIELD_LOCATOR = "//ancestor::mat-form-field"; + private static final String FOCUS_CLASS = "mat-focused"; + + @JDIAction("Press button '{0}' in '{name}'") + public Input pressButton(Keys key) { + core().sendKeys(key); + return this; + } + + @JDIAction("Check that '{name}' is readonly") + public Boolean isReadonly() { + return Boolean.valueOf(core().getAttribute("readonly")); + } + + @JDIAction("Get input type '{name}'") + public InputsTypes inputType() { + return InputsTypes.fromType(core().getAttribute("type")); + } + + @JDIAction("Set text '{name}' as ‘{0}’") + public void setValue(String value) { + input(value); + } + + @JDIAction("Get '{name}' text") + public String getValue() { + return core().getAttribute("value"); + } + + @JDIAction("Focus on '{name}'") + public void focus() { + core().click(); + } + + @JDIAction("Check that '{name}' is focused") + public boolean isFocused() { return find(By.xpath(FORM_FIELD_LOCATOR)).hasClass(FOCUS_CLASS); } + + @JDIAction("Check that '{name}' has aria-label '{0}'") + public boolean hasAriaLabel(String ariaLabel) { + return core().attr("aria-label").contains(ariaLabel); + } + + @Override + public InputAssert is() { + return new InputAssert().set(this); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/TextArea.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/TextArea.java new file mode 100644 index 0000000000..d8ef7caa2f --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/common/TextArea.java @@ -0,0 +1,95 @@ +package com.epam.jdi.light.angular.elements.common; + +import static com.epam.jdi.light.ui.html.HtmlUtils.getInt; + +import com.epam.jdi.light.angular.asserts.TextAreaAssert; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.interfaces.base.SetValue; +import com.epam.jdi.light.elements.interfaces.common.IsInput; +import org.openqa.selenium.Keys; + +public class TextArea extends UIBaseElement implements SetValue, IsInput { + + @JDIAction + public int rows() { + return getInt(core().attr("rows")); + } + + @JDIAction + public int minRows() { + return getInt(core().attr("cdkautosizeminrows")); + } + + @JDIAction + public int maxRows() { + return getInt(core().attr("cdkautosizemaxrows")); + } + + @JDIAction("Check that '{name}' has auto-size attribute") + public boolean hasAutoSize() { + return attrs().has("cdktextareaautosize"); + } + + @JDIAction("Press button '{0}' in '{name}'") + public TextArea pressButton(Keys key) { + core().sendKeys(key); + return this; + } + + @Override + public String getValue() { + return core().getAttribute("value"); + } + + @Override + public void setValue(String value) { + input(value); + } + + @JDIAction("Set '{name}' height to '{0}'") + public void changeHeight(int px) { + setAttribute("style", "height: " + px + "px"); + } + + @JDIAction("Check that '{name}' has scroll down") + public boolean hasScrollDown() { + return (boolean) core().js() + .executeScript("return arguments[0].scrollHeight - arguments[0].scrollTop > arguments[0].clientHeight;", + core().getWebElement()); + } + + @JDIAction("Check that '{name}' has scroll up") + public boolean hasScrollUp() { + return (boolean) core().js() + .executeScript("return arguments[0].scrollTop > 0;", + core().getWebElement()); + } + + @JDIAction("Scroll '{name}' to the top") + public void scrollToTop() { + core().js().executeScript("arguments[0].scrollTop = 0;", core().getWebElement()); + } + + @JDIAction("Scroll '{name}' to the bottom") + public void scrollToBottom() { + core().js().executeScript("arguments[0].scrollTop = arguments[0].scrollHeight;", core().getWebElement()); + } + + @JDIAction("Scroll '{name}' to '{0}' text") + public void scrollToText(String text) { + core().js().executeScript("var textarea = arguments[0]; " + + "var searchText = arguments[1]; " + + "var textPosition = textarea.value.indexOf(searchText); " + + "if (textPosition !== -1) { " + + "var lineHeight = parseFloat(window.getComputedStyle(textarea).lineHeight); " + + "var linesBefore = textarea.value.substr(0, textPosition).split('\\n').length - 1; " + + "var scrollToHeight = linesBefore * lineHeight; textarea.scrollTop = scrollToHeight; }", + core().getWebElement(), text); + } + + @Override + public TextAreaAssert is() { + return new TextAreaAssert().set(this); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/InputsTypes.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/InputsTypes.java new file mode 100644 index 0000000000..5327f9909b --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/enums/InputsTypes.java @@ -0,0 +1,40 @@ +package com.epam.jdi.light.angular.elements.enums; + +import java.util.Arrays; + +public enum InputsTypes { + COLOR("color"), + DATE("date"), + DATETIME_LOCAL("datetime-local"), + EMAIL("email"), + MONTH("month"), + NUMBER("number"), + PASSWORD("password"), + SEARCH("search"), + TEL("tel"), + TEXT("text"), + TIME("time"), + URL("url"), + WEEK("week"); + + private final String type; + + InputsTypes(String label) { + this.type = label; + } + + public String getType() { + return type; + } + + public static int size() { + return values().length; + } + + public static InputsTypes fromType(String type) { + return Arrays.stream(values()) + .filter(t -> t.type.equalsIgnoreCase(type)) + .findFirst() + .orElse(TEXT); + } +}