From 7125a1ad8d3cae4aa3eedc0a44f798f75270b9cc Mon Sep 17 00:00:00 2001 From: "d.bogatko" Date: Thu, 8 Aug 2019 22:43:29 +0300 Subject: [PATCH 1/5] refactored state of elements --- .../aquality/selenium/elements/Element.java | 33 +---- .../elements/ElementStateProvider.java | 39 ++++- .../elements/interfaces/IElement.java | 26 ---- .../interfaces/IElementStateProvider.java | 42 ++++-- .../interfaces/IElementWithState.java | 37 +++-- src/test/java/tests/BaseTest.java | 4 + .../tests/integration/ElementStateTests.java | 138 ++++++++++++++++++ .../java/tests/integration/ElementTests.java | 19 --- .../java/tests/integration/WaitTests.java | 67 --------- src/test/resources/TestSuite.xml | 2 +- 10 files changed, 237 insertions(+), 170 deletions(-) create mode 100644 src/test/java/tests/integration/ElementStateTests.java delete mode 100644 src/test/java/tests/integration/WaitTests.java diff --git a/src/main/java/aquality/selenium/elements/Element.java b/src/main/java/aquality/selenium/elements/Element.java index 4b81661..0fa42af 100644 --- a/src/main/java/aquality/selenium/elements/Element.java +++ b/src/main/java/aquality/selenium/elements/Element.java @@ -12,10 +12,12 @@ import aquality.selenium.localization.LocalizationManager; import aquality.selenium.logger.Logger; import aquality.selenium.waitings.ConditionalWait; -import org.openqa.selenium.*; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.remote.RemoteWebElement; -import org.openqa.selenium.support.ui.ExpectedConditions; /** * Abstract class, describing wrapper of WebElement. @@ -79,17 +81,6 @@ public RemoteWebElement getElement(Long timeout) { } } - @Override - public boolean isEnabled(long timeout) { - return ConditionalWait.waitForTrue(y -> getElement().isEnabled() - && !hasState(PopularClassNames.DISABLED), timeout); - } - - @Override - public boolean isEnabled() { - return isEnabled(timeoutCondition); - } - @Override public By getLocator() { return locator; @@ -122,20 +113,11 @@ public void sendKeys(Keys key) { @Override public void waitAndClick() { - waitForElementClickable(); + waitForEnabled(getDefaultTimeout()); info(getLocManager().getValue(LOG_CLICKING)); click(); } - @Override - public void waitForElementClickable() { - waitForElementClickable(timeoutCondition); - } - - @Override - public void waitForElementClickable(Long timeout) { - ConditionalWait.waitFor(ExpectedConditions.elementToBeClickable(getLocator()), timeout); - } @Override public void click() { @@ -278,11 +260,6 @@ public MouseActions getMouseActions() { return new MouseActions(this, getElementType(), getName()); } - @Override - public boolean hasState(String className) { - return getAttribute(Attributes.CLASS.toString()).toLowerCase().contains(className.toLowerCase()); - } - @Override public T findChildElement(By childLoc, ElementType type, ElementState state) { return new ElementFactory().findChildElement(this, childLoc, type, state); diff --git a/src/main/java/aquality/selenium/elements/ElementStateProvider.java b/src/main/java/aquality/selenium/elements/ElementStateProvider.java index b3bc288..8fa735a 100644 --- a/src/main/java/aquality/selenium/elements/ElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/ElementStateProvider.java @@ -22,23 +22,23 @@ public boolean isDisplayed() { } @Override - public boolean isExist() { - return waitForExist(ZERO_TIMEOUT); + public boolean waitForDisplayed(long timeout) { + return !findElements(timeout, ElementState.DISPLAYED).isEmpty(); } @Override - public boolean waitForDisplayed(long timeout) { - return !findElements(timeout, ElementState.DISPLAYED).isEmpty(); + public boolean waitForNotDisplayed(long timeout) { + return ConditionalWait.waitForTrue(driver -> !isDisplayed(), timeout); } @Override - public boolean waitForExist(long timeout) { - return !findElements(timeout, ElementState.EXISTS_IN_ANY_STATE).isEmpty(); + public boolean isExist() { + return waitForExist(ZERO_TIMEOUT); } @Override - public boolean waitForNotDisplayed(long timeout) { - return ConditionalWait.waitForTrue(driver -> !isDisplayed(), timeout); + public boolean waitForExist(long timeout) { + return !findElements(timeout, ElementState.EXISTS_IN_ANY_STATE).isEmpty(); } @Override @@ -46,6 +46,29 @@ public boolean waitForNotExist(long timeout) { return ConditionalWait.waitForTrue(driver -> !isExist(), timeout); } + + @Override + public boolean isEnabled() { + return waitForEnabled(ZERO_TIMEOUT); + } + + @Override + public boolean waitForEnabled(long timeout) { + return ConditionalWait.waitForTrue(y -> { + List webElements = findElements(timeout, ElementState.EXISTS_IN_ANY_STATE); + if(!webElements.isEmpty()){ + WebElement webElement = webElements.get(0); + return webElement.isEnabled() && !webElement.getAttribute(Attributes.CLASS.toString()).contains(PopularClassNames.DISABLED); + } + return false; + }, timeout); + } + + @Override + public boolean waitForNotEnabled(long timeout) { + return ConditionalWait.waitForTrue(driver -> !isEnabled(), timeout); + } + private List findElements(long timeout, ElementState state) { return ElementFinder.getInstance().findElements(getLocator(), timeout, state); } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElement.java b/src/main/java/aquality/selenium/elements/interfaces/IElement.java index 94b3cae..1a73fb0 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElement.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElement.java @@ -25,21 +25,6 @@ public interface IElement extends IParent, IElementWithState { */ RemoteWebElement getElement(Long timeout); - /** - * Check that the element is enabled (performed by a class member) - * - * @param timeout Timeout for waiting - * @return true if enabled - */ - boolean isEnabled(long timeout); - - /** - * Check that the element is enabled (performed by a class member) - * - * @return true if enabled - */ - boolean isEnabled(); - /** * Get element locator * @@ -69,17 +54,6 @@ public interface IElement extends IParent, IElementWithState { */ void waitAndClick(); - /** - * Wait until element is clickable. - */ - void waitForElementClickable(); - - /** - * Wait until element is clickable. - * @param timeout Timeout for waiting - */ - void waitForElementClickable(Long timeout); - /** * Click on the item. */ diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java index 47a007d..448bf63 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java @@ -13,17 +13,24 @@ public interface IElementStateProvider { boolean isDisplayed(); /** - * Is an element exist in DOM (without visibility check) - * @return true if element exist, false otherwise + * Waits for is element displayed on the page. + * @param timeout Timeout for waiting + * @return true if element displayed after waiting, false otherwise */ - boolean isExist(); + boolean waitForDisplayed(long timeout); /** * Waits for is element displayed on the page. * @param timeout Timeout for waiting * @return true if element displayed after waiting, false otherwise */ - boolean waitForDisplayed(long timeout); + boolean waitForNotDisplayed(long timeout); + + /** + * Is an element exist in DOM (without visibility check) + * @return true if element exist, false otherwise + */ + boolean isExist(); /** * Waits until element is exist in DOM (without visibility check). @@ -33,16 +40,31 @@ public interface IElementStateProvider { boolean waitForExist(long timeout); /** - * Waits for is element displayed on the page. + * Waits until element does not exist in DOM (without visibility check). + * + * @return true if element does not exist after waiting, false otherwise + */ + boolean waitForNotExist(long timeout); + + /** + * Check that the element is enabled (performed by a class member) + * + * @return true if enabled + */ + boolean isEnabled(); + + /** + * Check that the element is enabled (performed by a class member) + * * @param timeout Timeout for waiting - * @return true if element displayed after waiting, false otherwise + * @return true if enabled */ - boolean waitForNotDisplayed(long timeout); + boolean waitForEnabled(long timeout); /** - * Waits until element does not exist in DOM (without visibility check). + * Waits until element does not enabled in DOM * - * @return true if element does not exist after waiting, false otherwise + * @return true if element does not enabled after waiting, false otherwise */ - boolean waitForNotExist(long timeout); + boolean waitForNotEnabled(long timeout); } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java b/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java index 5d866ea..1f15ede 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java @@ -4,7 +4,7 @@ public interface IElementWithState extends IElementStateProvider { /** - * Provides ability to define of element's state (whether it is displayed, exist or not) and respective waiting functions + * Provides ability to define of element's state (whether it is displayed, exists or not) and respective waiting functions * @return provider to define element's state */ IElementStateProvider state(); @@ -20,10 +20,6 @@ default boolean isDisplayed() { return state().isDisplayed(); } - default boolean isExist() { - return state().isExist(); - } - default boolean waitForDisplayed(long timeout) { return state().waitForDisplayed(timeout); } @@ -40,6 +36,11 @@ default boolean waitForNotDisplayed() { return waitForNotDisplayed(getDefaultTimeout()); } + + default boolean isExist() { + return state().isExist(); + } + default boolean waitForExist(long timeout) { return state().waitForExist(timeout); } @@ -56,10 +57,24 @@ default boolean waitForNotExist() { return waitForNotExist(getDefaultTimeout()); } - /** - * Checks element's class attribute to contain specified className - * @param className ClassName parameter - * @return true if required className contained in class attribute, false otherwise - */ - boolean hasState(String className); + + default boolean isEnabled() { + return state().isEnabled(); + } + + default boolean waitForEnabled(long timeout) { + return state().waitForEnabled(timeout); + } + + default boolean waitForEnabled() { + return waitForEnabled(getDefaultTimeout()); + } + + default boolean waitForNotEnabled(long timeout) { + return state().waitForNotEnabled(timeout); + } + + default boolean waitForNotEnabled() { + return waitForNotEnabled(getDefaultTimeout()); + } } diff --git a/src/test/java/tests/BaseTest.java b/src/test/java/tests/BaseTest.java index 6c2277c..c7c4ec7 100644 --- a/src/test/java/tests/BaseTest.java +++ b/src/test/java/tests/BaseTest.java @@ -28,4 +28,8 @@ protected void beforeMethod() { public void afterTest(){ BrowserManager.getBrowser().quit(); } + + protected void navigate(TheInternetPage page) { + BrowserManager.getBrowser().navigate().to(page.getAddress()); + } } diff --git a/src/test/java/tests/integration/ElementStateTests.java b/src/test/java/tests/integration/ElementStateTests.java new file mode 100644 index 0000000..2bb7eb2 --- /dev/null +++ b/src/test/java/tests/integration/ElementStateTests.java @@ -0,0 +1,138 @@ +package tests.integration; + +import aquality.selenium.configuration.Configuration; +import aquality.selenium.elements.HighlightState; +import aquality.selenium.elements.interfaces.ILabel; +import org.testng.Assert; +import org.testng.annotations.Test; +import tests.BaseTest; +import theinternet.TheInternetPage; +import theinternet.forms.DynamicControlsForm; +import theinternet.forms.DynamicLoadingForm; + +public class ElementStateTests extends BaseTest { + + private final double operationTime = 2; + private final long customWaitTime = 2L; + + @Test + public void testElementShouldWaitForEnabledWithCustomTimeout() { + navigate(TheInternetPage.DYNAMIC_CONTROLS); + long waitTime = customWaitTime; + + long startTime = System.nanoTime(); + boolean isEnabled = new DynamicControlsForm().getTxbInput().waitForEnabled(waitTime); + double duration = calculateDuration(startTime); + + Assert.assertFalse(isEnabled); + Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + } + + @Test + public void testElementShouldWaitForEnabledWithDefaultTimeout() { + navigate(TheInternetPage.DYNAMIC_CONTROLS); + long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); + + long startTime = System.nanoTime(); + boolean isEnabled = new DynamicControlsForm().getTxbInput().waitForEnabled(); + double duration = calculateDuration(startTime); + + Assert.assertFalse(isEnabled); + Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + } + + @Test + public void testElementShouldWaitForNotEnabledWithCustomTimeout() { + navigate(TheInternetPage.DYNAMIC_CONTROLS); + long waitTime = customWaitTime; + + DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); + dynamicControlsForm.getBtnEnable().click(); + dynamicControlsForm.getTxbInput().waitForEnabled(); + + long startTime = System.nanoTime(); + boolean isDisabled = dynamicControlsForm.getTxbInput().waitForNotEnabled(waitTime); + double duration = calculateDuration(startTime); + + Assert.assertFalse(isDisabled); + Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + } + + @Test + public void testElementShouldWaitForNotEnabledWithDefaultTimeout() { + navigate(TheInternetPage.DYNAMIC_CONTROLS); + long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); + + DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); + dynamicControlsForm.getBtnEnable().click(); + dynamicControlsForm.getTxbInput().waitForEnabled(); + + long startTime = System.nanoTime(); + boolean isDisabled = dynamicControlsForm.getTxbInput().waitForNotEnabled(); + double duration = calculateDuration(startTime); + + Assert.assertFalse(isDisabled); + Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + } + + private double calculateDuration(long startTimeNanoSec){ + return (System.nanoTime() - startTimeNanoSec)/Math.pow(10,9); + } + + @Test + public void testTextBoxEnabled() { + navigate(TheInternetPage.DYNAMIC_CONTROLS); + DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); + dynamicControlsForm.getBtnEnable().click(); + dynamicControlsForm.getTxbInput().waitForEnabled(); + Assert.assertTrue(dynamicControlsForm.getTxbInput().isEnabled()); + } + + @Test + public void testWaitInvisibility() { + navigate(TheInternetPage.DYNAMIC_LOADING); + DynamicLoadingForm loadingForm = new DynamicLoadingForm(); + + loadingForm.getBtnStart().waitAndClick(); + + ILabel lblLoading = loadingForm.getLblLoading(); + String id = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT); + String id2 = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT, loadingForm.getTimeout()); + String id3 = lblLoading.getAttribute("id", loadingForm.getTimeout()); + String loadingText = "loading"; + Assert.assertEquals(id,loadingText); + Assert.assertEquals(id2,loadingText); + Assert.assertEquals(id3,loadingText); + + lblLoading.waitForDisplayed(2L); + + boolean status = lblLoading.waitForNotDisplayed(2L); + Assert.assertFalse(status); + + status = lblLoading.waitForNotDisplayed(); + Assert.assertTrue(status); + + String finishText = loadingForm.getLblFinish().getText(HighlightState.HIGHLIGHT); + + Assert.assertTrue(finishText.contains("Hello World!")); + } + + @Test + public void testWaitForExist(){ + navigate(TheInternetPage.DYNAMIC_LOADING); + DynamicLoadingForm loadingForm = new DynamicLoadingForm(); + boolean status = loadingForm.getLblLoading().waitForExist(loadingForm.getTimeout()); + + Assert.assertFalse(status); + Assert.assertTrue(loadingForm.getBtnStart().waitForExist()); + } + + @Test + public void testWaitDoesNotExists(){ + navigate(TheInternetPage.DYNAMIC_LOADING); + DynamicLoadingForm loadingForm = new DynamicLoadingForm(); + + Assert.assertFalse(loadingForm.getBtnStart().waitForNotExist(loadingForm.getTimeout())); + Assert.assertTrue(loadingForm.getLblLoading().waitForNotExist()); + } +} diff --git a/src/test/java/tests/integration/ElementTests.java b/src/test/java/tests/integration/ElementTests.java index cab003f..98473bf 100644 --- a/src/test/java/tests/integration/ElementTests.java +++ b/src/test/java/tests/integration/ElementTests.java @@ -15,7 +15,6 @@ import org.testng.asserts.SoftAssert; import tests.BaseTest; import theinternet.TheInternetPage; -import theinternet.forms.DynamicControlsForm; import theinternet.forms.LoginForm; import java.util.List; @@ -144,20 +143,6 @@ public void testTextBox() { softAssert.assertAll(); } - @Test - public void testTextBoxNotEnabled() { - navigate(TheInternetPage.DYNAMIC_CONTROLS); - Assert.assertFalse(new DynamicControlsForm().getTxbInput().isEnabled(1L)); - } - - @Test - public void testTextBoxEnabled() { - navigate(TheInternetPage.DYNAMIC_CONTROLS); - DynamicControlsForm controlsForm = new DynamicControlsForm(); - controlsForm.getBtnEnable().click(); - Assert.assertTrue(controlsForm.getTxbInput().isEnabled()); - } - @Test public void testSetInnerHtml() { navigate(TheInternetPage.LOGIN); @@ -181,8 +166,4 @@ public void testRightClick() { boolean present = elementFactory.getLabel(By.xpath("//ul[contains(@class, 'context-menu-list')]"), "List", ElementState.DISPLAYED).waitForDisplayed(); Assert.assertTrue(present, ""); } - - private void navigate(TheInternetPage page) { - BrowserManager.getBrowser().navigate().to(page.getAddress()); - } } \ No newline at end of file diff --git a/src/test/java/tests/integration/WaitTests.java b/src/test/java/tests/integration/WaitTests.java deleted file mode 100644 index c4bee2f..0000000 --- a/src/test/java/tests/integration/WaitTests.java +++ /dev/null @@ -1,67 +0,0 @@ -package tests.integration; - -import aquality.selenium.browser.BrowserManager; -import aquality.selenium.elements.HighlightState; -import aquality.selenium.elements.interfaces.ILabel; -import org.testng.Assert; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import tests.BaseTest; -import theinternet.TheInternetPage; -import theinternet.forms.DynamicLoadingForm; - -public class WaitTests extends BaseTest { - - @BeforeMethod - @Override - protected void beforeMethod() { - BrowserManager.getBrowser().goTo(TheInternetPage.DYNAMIC_LOADING.getAddress()); - } - - @Test - public void testWaitInvisibility() { - DynamicLoadingForm loadingForm = new DynamicLoadingForm(); - - loadingForm.getBtnStart().waitAndClick(); - - ILabel lblLoading = loadingForm.getLblLoading(); - String id = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT); - String id2 = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT, loadingForm.getTimeout()); - String id3 = lblLoading.getAttribute("id", loadingForm.getTimeout()); - String loadingText = "loading"; - Assert.assertEquals(id,loadingText); - Assert.assertEquals(id2,loadingText); - Assert.assertEquals(id3,loadingText); - - lblLoading.waitForDisplayed(2L); - - boolean status = lblLoading.waitForNotDisplayed(2L); - Assert.assertFalse(status); - - status = lblLoading.waitForNotDisplayed(); - Assert.assertTrue(status); - - String finishText = loadingForm.getLblFinish().getText(HighlightState.HIGHLIGHT); - - Assert.assertTrue(finishText.contains("Hello World!")); - } - - @Test - public void testWaitForExist(){ - DynamicLoadingForm loadingForm = new DynamicLoadingForm(); - - boolean status = loadingForm.getLblLoading().waitForExist(loadingForm.getTimeout()); - Assert.assertFalse(status); - - Assert.assertTrue(loadingForm.getBtnStart().waitForExist()); - } - - @Test - public void testWaitDoesNotExists(){ - DynamicLoadingForm loadingForm = new DynamicLoadingForm(); - - Assert.assertFalse(loadingForm.getBtnStart().waitForNotExist(loadingForm.getTimeout())); - - Assert.assertTrue(loadingForm.getLblLoading().waitForNotExist()); - } -} diff --git a/src/test/resources/TestSuite.xml b/src/test/resources/TestSuite.xml index 545d396..17c99b3 100644 --- a/src/test/resources/TestSuite.xml +++ b/src/test/resources/TestSuite.xml @@ -7,8 +7,8 @@ + - From 0c16676539f3841b2f42a7c596c9ef16aa1eb749 Mon Sep 17 00:00:00 2001 From: "d.bogatko" Date: Fri, 9 Aug 2019 10:24:21 +0300 Subject: [PATCH 2/5] re-check waitForNotExists methods for correct work. split 1 test to 2, added verification of wait time --- .../tests/integration/ElementStateTests.java | 30 +++++++++++++++---- .../forms/DynamicControlsForm.java | 12 ++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/test/java/tests/integration/ElementStateTests.java b/src/test/java/tests/integration/ElementStateTests.java index 2bb7eb2..edf81c8 100644 --- a/src/test/java/tests/integration/ElementStateTests.java +++ b/src/test/java/tests/integration/ElementStateTests.java @@ -128,11 +128,31 @@ public void testWaitForExist(){ } @Test - public void testWaitDoesNotExists(){ - navigate(TheInternetPage.DYNAMIC_LOADING); - DynamicLoadingForm loadingForm = new DynamicLoadingForm(); + public void testShouldBePossibleToWaitElementNotExistsCustom(){ + navigate(TheInternetPage.DYNAMIC_CONTROLS); + DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); + long waitTime = customWaitTime; + dynamicControlsForm.getBtnRemove().click(); + long startTime = System.nanoTime(); + boolean isMissed = dynamicControlsForm.getChbACheckbox().waitForNotExist(waitTime); + double duration = calculateDuration(startTime); + + Assert.assertFalse(isMissed); + Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + } + + @Test + public void testShouldBePossibleToWaitElementNotExists(){ + navigate(TheInternetPage.DYNAMIC_CONTROLS); + DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); + long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); + dynamicControlsForm.getBtnRemove().click(); + + long startTime = System.nanoTime(); + boolean isMissed = dynamicControlsForm.getChbACheckbox().waitForNotExist(); + double duration = calculateDuration(startTime); - Assert.assertFalse(loadingForm.getBtnStart().waitForNotExist(loadingForm.getTimeout())); - Assert.assertTrue(loadingForm.getLblLoading().waitForNotExist()); + Assert.assertTrue(isMissed); + Assert.assertTrue(duration < waitTime); } } diff --git a/src/test/java/theinternet/forms/DynamicControlsForm.java b/src/test/java/theinternet/forms/DynamicControlsForm.java index 371e6f9..dda20c9 100644 --- a/src/test/java/theinternet/forms/DynamicControlsForm.java +++ b/src/test/java/theinternet/forms/DynamicControlsForm.java @@ -1,5 +1,6 @@ package theinternet.forms; +import aquality.selenium.elements.interfaces.ICheckBox; import aquality.selenium.forms.PageInfo; import aquality.selenium.elements.interfaces.IButton; import aquality.selenium.elements.interfaces.ITextBox; @@ -11,6 +12,9 @@ public class DynamicControlsForm extends Form { private final ITextBox txbInput = getElementFactory().getTextBox(By.xpath("//input[@type='text']"), "Input"); private final IButton btnEnable = getElementFactory().getButton(By.xpath("//button[contains(@onclick, 'swapInput()')]"), "Enable"); + private final IButton btnRemove = getElementFactory().getButton(By.xpath("//button[contains(@onclick, 'swapCheckbox()')]"), "Remove"); + private final ICheckBox chbACheckbox = getElementFactory().getCheckBox(By.xpath("//div[@id='checkbox']"), "A Checkbox"); + public ITextBox getTxbInput() { return txbInput; @@ -19,4 +23,12 @@ public ITextBox getTxbInput() { public IButton getBtnEnable() { return btnEnable; } + + public IButton getBtnRemove() { + return btnRemove; + } + + public ICheckBox getChbACheckbox() { + return chbACheckbox; + } } From b0567a6a813fe0923717d8a47ded251ad1e328ad Mon Sep 17 00:00:00 2001 From: "d.bogatko" Date: Fri, 9 Aug 2019 15:01:54 +0300 Subject: [PATCH 3/5] removed IElementWithState interface changed IElementStateProvider interface: added methods for waitings with default condition timeouts excluded ability to call state methods directly from elements, now users have to use state() method --- .../aquality/selenium/elements/Element.java | 43 +++------- .../elements/ElementStateProvider.java | 48 +++++++++++ .../elements/interfaces/IElement.java | 8 +- .../interfaces/IElementStateProvider.java | 45 +++++++++++ .../interfaces/IElementWithState.java | 80 ------------------- .../java/aquality/selenium/forms/Form.java | 4 +- .../tests/integration/ElementStateTests.java | 30 +++---- .../java/tests/integration/ElementTests.java | 10 +-- .../integration/HiddenElementsTests.java | 6 +- .../ElementExistNotDisplayedTest.java | 2 +- src/test/java/utils/FileUtil.java | 2 +- 11 files changed, 137 insertions(+), 141 deletions(-) delete mode 100644 src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java diff --git a/src/main/java/aquality/selenium/elements/Element.java b/src/main/java/aquality/selenium/elements/Element.java index 0fa42af..9b3a1bd 100644 --- a/src/main/java/aquality/selenium/elements/Element.java +++ b/src/main/java/aquality/selenium/elements/Element.java @@ -26,9 +26,6 @@ public abstract class Element implements IElement { private static final String LOG_DELIMITER = "::"; private static final String LOG_CLICKING = "loc.clicking"; - private final Configuration configuration = Configuration.getInstance(); - private final long timeoutCondition = configuration.getTimeoutConfiguration().getCondition(); - /** * Name of element */ @@ -65,7 +62,7 @@ protected Element(final By loc, final String nameOf, final ElementState stateOf) @Override public RemoteWebElement getElement() { - return getElement(timeoutCondition); + return getElement(getDefaultTimeout()); } @Override @@ -113,7 +110,7 @@ public void sendKeys(Keys key) { @Override public void waitAndClick() { - waitForEnabled(getDefaultTimeout()); + state().waitForEnabled(getDefaultTimeout()); info(getLocManager().getValue(LOG_CLICKING)); click(); } @@ -147,36 +144,12 @@ public String getText(HighlightState highlightState) { if(highlightState.equals(HighlightState.HIGHLIGHT)){ getJsActions().highlightElement(); } - if(ElementFinder.getInstance().findElements(locator, timeoutCondition, state).isEmpty()){ - throw new IllegalStateException(String.format(getLocManager().getValue("loc.element.wasnotfoundinstate"), getName(), state, timeoutCondition)); + if(ElementFinder.getInstance().findElements(locator, getDefaultTimeout(), state).isEmpty()){ + throw new IllegalStateException(String.format(getLocManager().getValue("loc.element.wasnotfoundinstate"), getName(), state, getDefaultTimeout())); } return ConditionalWait.waitFor(y -> getElement().getText()); } - @Override - public boolean waitForDisplayed(long timeout) { - getLogger().info(getLocManager().getValue("loc.waitinstate"), ElementState.DISPLAYED, getLocator()); - return IElement.super.waitForDisplayed(timeout); - } - - @Override - public boolean waitForExist(long timeout) { - getLogger().info(getLocManager().getValue("loc.waitexists")); - return IElement.super.waitForExist(timeout); - } - - @Override - public boolean waitForNotDisplayed(long timeout) { - getLogger().info(getLocManager().getValue("loc.waitinvisible")); - return IElement.super.waitForNotDisplayed(timeout); - } - - @Override - public boolean waitForNotExist(long timeout) { - getLogger().info(getLocManager().getValue("loc.waitnotexists"), timeout); - return IElement.super.waitForNotExist(timeout); - } - @Override public IElementStateProvider state() { return elementStateProvider; @@ -198,12 +171,12 @@ public String getAttribute(final String attr, long timeout) { @Override public String getAttribute(final String attr) { - return getAttribute(attr, HighlightState.NOT_HIGHLIGHT, timeoutCondition); + return getAttribute(attr, HighlightState.NOT_HIGHLIGHT, getDefaultTimeout()); } @Override public String getAttribute(final String attr, HighlightState highlightState) { - return getAttribute(attr, highlightState, timeoutCondition); + return getAttribute(attr, highlightState, getDefaultTimeout()); } @Override @@ -282,4 +255,8 @@ protected Logger getLogger(){ protected LocalizationManager getLocManager(){ return LocalizationManager.getInstance(); } + + long getDefaultTimeout(){ + return Configuration.getInstance().getTimeoutConfiguration().getCondition(); + } } \ No newline at end of file diff --git a/src/main/java/aquality/selenium/elements/ElementStateProvider.java b/src/main/java/aquality/selenium/elements/ElementStateProvider.java index 8fa735a..49c4c67 100644 --- a/src/main/java/aquality/selenium/elements/ElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/ElementStateProvider.java @@ -1,6 +1,9 @@ package aquality.selenium.elements; +import aquality.selenium.configuration.Configuration; import aquality.selenium.elements.interfaces.IElementStateProvider; +import aquality.selenium.localization.LocalizationManager; +import aquality.selenium.logger.Logger; import aquality.selenium.waitings.ConditionalWait; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -23,14 +26,26 @@ public boolean isDisplayed() { @Override public boolean waitForDisplayed(long timeout) { + getLogger().info(getLocManager().getValue("loc.waitinstate"), ElementState.DISPLAYED, getLocator()); return !findElements(timeout, ElementState.DISPLAYED).isEmpty(); } + @Override + public boolean waitForDisplayed() { + return waitForDisplayed(getDefaultTimeout()); + } + @Override public boolean waitForNotDisplayed(long timeout) { + getLogger().info(getLocManager().getValue("loc.waitinvisible")); return ConditionalWait.waitForTrue(driver -> !isDisplayed(), timeout); } + @Override + public boolean waitForNotDisplayed() { + return waitForNotDisplayed(getDefaultTimeout()); + } + @Override public boolean isExist() { return waitForExist(ZERO_TIMEOUT); @@ -38,14 +53,25 @@ public boolean isExist() { @Override public boolean waitForExist(long timeout) { + getLogger().info(getLocManager().getValue("loc.waitexists")); return !findElements(timeout, ElementState.EXISTS_IN_ANY_STATE).isEmpty(); } + @Override + public boolean waitForExist() { + return waitForExist(getDefaultTimeout()); + } + @Override public boolean waitForNotExist(long timeout) { + getLogger().info(getLocManager().getValue("loc.waitnotexists"), timeout); return ConditionalWait.waitForTrue(driver -> !isExist(), timeout); } + @Override + public boolean waitForNotExist() { + return waitForNotExist(getDefaultTimeout()); + } @Override public boolean isEnabled() { @@ -64,11 +90,21 @@ public boolean waitForEnabled(long timeout) { }, timeout); } + @Override + public boolean waitForEnabled() { + return waitForEnabled(getDefaultTimeout()); + } + @Override public boolean waitForNotEnabled(long timeout) { return ConditionalWait.waitForTrue(driver -> !isEnabled(), timeout); } + @Override + public boolean waitForNotEnabled() { + return waitForNotEnabled(getDefaultTimeout()); + } + private List findElements(long timeout, ElementState state) { return ElementFinder.getInstance().findElements(getLocator(), timeout, state); } @@ -76,4 +112,16 @@ private List findElements(long timeout, ElementState state) { private By getLocator() { return locator; } + + private Logger getLogger(){ + return Logger.getInstance(); + } + + private LocalizationManager getLocManager(){ + return LocalizationManager.getInstance(); + } + + private long getDefaultTimeout(){ + return Configuration.getInstance().getTimeoutConfiguration().getCondition(); + } } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElement.java b/src/main/java/aquality/selenium/elements/interfaces/IElement.java index 1a73fb0..e7d5389 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElement.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElement.java @@ -8,7 +8,7 @@ import org.openqa.selenium.Keys; import org.openqa.selenium.remote.RemoteWebElement; -public interface IElement extends IParent, IElementWithState { +public interface IElement extends IParent { /** * Get clear WebElement @@ -140,4 +140,10 @@ public interface IElement extends IParent, IElementWithState { * @return MouseActions class */ MouseActions getMouseActions(); + + /** + * Provides ability to define of element's state (whether it is displayed, exists or not) and respective waiting functions + * @return provider to define element's state + */ + IElementStateProvider state(); } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java index 448bf63..7155d75 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java @@ -19,6 +19,13 @@ public interface IElementStateProvider { */ boolean waitForDisplayed(long timeout); + /** + * Waits for is element displayed on the page. + * Uses condition timeout from settings file for waiting + * @return true if element displayed after waiting, false otherwise + */ + boolean waitForDisplayed(); + /** * Waits for is element displayed on the page. * @param timeout Timeout for waiting @@ -26,6 +33,14 @@ public interface IElementStateProvider { */ boolean waitForNotDisplayed(long timeout); + + /** + * Waits for is element displayed on the page. + * Uses condition timeout from settings file for waiting + * @return true if element displayed after waiting, false otherwise + */ + boolean waitForNotDisplayed(); + /** * Is an element exist in DOM (without visibility check) * @return true if element exist, false otherwise @@ -39,6 +54,14 @@ public interface IElementStateProvider { */ boolean waitForExist(long timeout); + + /** + * Waits until element is exist in DOM (without visibility check). + * Uses condition timeout from settings file for waiting + * @return true if element exist after waiting, false otherwise + */ + boolean waitForExist(); + /** * Waits until element does not exist in DOM (without visibility check). * @@ -46,6 +69,13 @@ public interface IElementStateProvider { */ boolean waitForNotExist(long timeout); + /** + * Waits until element does not exist in DOM (without visibility check). + * Uses condition timeout from settings file for waiting + * @return true if element does not exist after waiting, false otherwise + */ + boolean waitForNotExist(); + /** * Check that the element is enabled (performed by a class member) * @@ -61,10 +91,25 @@ public interface IElementStateProvider { */ boolean waitForEnabled(long timeout); + + /** + * Check that the element is enabled (performed by a class member) + * Uses condition timeout from settings file for waiting + * @return true if enabled + */ + boolean waitForEnabled(); + /** * Waits until element does not enabled in DOM * * @return true if element does not enabled after waiting, false otherwise */ boolean waitForNotEnabled(long timeout); + + /** + * Waits until element does not enabled in DOM + * Uses condition timeout from settings file for waiting + * @return true if element does not enabled after waiting, false otherwise + */ + boolean waitForNotEnabled(); } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java b/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java deleted file mode 100644 index 1f15ede..0000000 --- a/src/main/java/aquality/selenium/elements/interfaces/IElementWithState.java +++ /dev/null @@ -1,80 +0,0 @@ -package aquality.selenium.elements.interfaces; - -import aquality.selenium.configuration.Configuration; - -public interface IElementWithState extends IElementStateProvider { - /** - * Provides ability to define of element's state (whether it is displayed, exists or not) and respective waiting functions - * @return provider to define element's state - */ - IElementStateProvider state(); - - /** - * @return default timeout of wait for state - */ - default long getDefaultTimeout() { - return Configuration.getInstance().getTimeoutConfiguration().getCondition(); - } - - default boolean isDisplayed() { - return state().isDisplayed(); - } - - default boolean waitForDisplayed(long timeout) { - return state().waitForDisplayed(timeout); - } - - default boolean waitForDisplayed() { - return waitForDisplayed(getDefaultTimeout()); - } - - default boolean waitForNotDisplayed(long timeout) { - return state().waitForNotDisplayed(timeout); - } - - default boolean waitForNotDisplayed() { - return waitForNotDisplayed(getDefaultTimeout()); - } - - - default boolean isExist() { - return state().isExist(); - } - - default boolean waitForExist(long timeout) { - return state().waitForExist(timeout); - } - - default boolean waitForExist() { - return waitForExist(getDefaultTimeout()); - } - - default boolean waitForNotExist(long timeout) { - return state().waitForNotExist(timeout); - } - - default boolean waitForNotExist() { - return waitForNotExist(getDefaultTimeout()); - } - - - default boolean isEnabled() { - return state().isEnabled(); - } - - default boolean waitForEnabled(long timeout) { - return state().waitForEnabled(timeout); - } - - default boolean waitForEnabled() { - return waitForEnabled(getDefaultTimeout()); - } - - default boolean waitForNotEnabled(long timeout) { - return state().waitForNotEnabled(timeout); - } - - default boolean waitForNotEnabled() { - return waitForNotEnabled(getDefaultTimeout()); - } -} diff --git a/src/main/java/aquality/selenium/forms/Form.java b/src/main/java/aquality/selenium/forms/Form.java index fc751f4..54821fc 100644 --- a/src/main/java/aquality/selenium/forms/Form.java +++ b/src/main/java/aquality/selenium/forms/Form.java @@ -68,7 +68,7 @@ protected By getLocatorFromPageInfo(PageInfo pageInfo) { * False - form is not opened */ public boolean isFormDisplayed() { - return getElementFactory().getLabel(locator, name).waitForDisplayed(); + return getElementFactory().getLabel(locator, name).state().waitForDisplayed(); } /** @@ -79,7 +79,7 @@ public boolean isFormDisplayed() { * False - form is not opened */ public boolean isFormDisplayed(Long timeout) { - return getElementFactory().getLabel(locator, name).waitForDisplayed(timeout); + return getElementFactory().getLabel(locator, name).state().waitForDisplayed(timeout); } /** diff --git a/src/test/java/tests/integration/ElementStateTests.java b/src/test/java/tests/integration/ElementStateTests.java index edf81c8..eae0a47 100644 --- a/src/test/java/tests/integration/ElementStateTests.java +++ b/src/test/java/tests/integration/ElementStateTests.java @@ -21,7 +21,7 @@ public void testElementShouldWaitForEnabledWithCustomTimeout() { long waitTime = customWaitTime; long startTime = System.nanoTime(); - boolean isEnabled = new DynamicControlsForm().getTxbInput().waitForEnabled(waitTime); + boolean isEnabled = new DynamicControlsForm().getTxbInput().state().waitForEnabled(waitTime); double duration = calculateDuration(startTime); Assert.assertFalse(isEnabled); @@ -34,7 +34,7 @@ public void testElementShouldWaitForEnabledWithDefaultTimeout() { long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); long startTime = System.nanoTime(); - boolean isEnabled = new DynamicControlsForm().getTxbInput().waitForEnabled(); + boolean isEnabled = new DynamicControlsForm().getTxbInput().state().waitForEnabled(); double duration = calculateDuration(startTime); Assert.assertFalse(isEnabled); @@ -48,10 +48,10 @@ public void testElementShouldWaitForNotEnabledWithCustomTimeout() { DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); dynamicControlsForm.getBtnEnable().click(); - dynamicControlsForm.getTxbInput().waitForEnabled(); + dynamicControlsForm.getTxbInput().state().waitForEnabled(); long startTime = System.nanoTime(); - boolean isDisabled = dynamicControlsForm.getTxbInput().waitForNotEnabled(waitTime); + boolean isDisabled = dynamicControlsForm.getTxbInput().state().waitForNotEnabled(waitTime); double duration = calculateDuration(startTime); Assert.assertFalse(isDisabled); @@ -65,10 +65,10 @@ public void testElementShouldWaitForNotEnabledWithDefaultTimeout() { DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); dynamicControlsForm.getBtnEnable().click(); - dynamicControlsForm.getTxbInput().waitForEnabled(); + dynamicControlsForm.getTxbInput().state().waitForEnabled(); long startTime = System.nanoTime(); - boolean isDisabled = dynamicControlsForm.getTxbInput().waitForNotEnabled(); + boolean isDisabled = dynamicControlsForm.getTxbInput().state().waitForNotEnabled(); double duration = calculateDuration(startTime); Assert.assertFalse(isDisabled); @@ -84,8 +84,8 @@ public void testTextBoxEnabled() { navigate(TheInternetPage.DYNAMIC_CONTROLS); DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); dynamicControlsForm.getBtnEnable().click(); - dynamicControlsForm.getTxbInput().waitForEnabled(); - Assert.assertTrue(dynamicControlsForm.getTxbInput().isEnabled()); + dynamicControlsForm.getTxbInput().state().waitForEnabled(); + Assert.assertTrue(dynamicControlsForm.getTxbInput().state().isEnabled()); } @Test @@ -104,12 +104,12 @@ public void testWaitInvisibility() { Assert.assertEquals(id2,loadingText); Assert.assertEquals(id3,loadingText); - lblLoading.waitForDisplayed(2L); + lblLoading.state().waitForDisplayed(2L); - boolean status = lblLoading.waitForNotDisplayed(2L); + boolean status = lblLoading.state().waitForNotDisplayed(2L); Assert.assertFalse(status); - status = lblLoading.waitForNotDisplayed(); + status = lblLoading.state().waitForNotDisplayed(); Assert.assertTrue(status); String finishText = loadingForm.getLblFinish().getText(HighlightState.HIGHLIGHT); @@ -121,10 +121,10 @@ public void testWaitInvisibility() { public void testWaitForExist(){ navigate(TheInternetPage.DYNAMIC_LOADING); DynamicLoadingForm loadingForm = new DynamicLoadingForm(); - boolean status = loadingForm.getLblLoading().waitForExist(loadingForm.getTimeout()); + boolean status = loadingForm.getLblLoading().state().waitForExist(loadingForm.getTimeout()); Assert.assertFalse(status); - Assert.assertTrue(loadingForm.getBtnStart().waitForExist()); + Assert.assertTrue(loadingForm.getBtnStart().state().waitForExist()); } @Test @@ -134,7 +134,7 @@ public void testShouldBePossibleToWaitElementNotExistsCustom(){ long waitTime = customWaitTime; dynamicControlsForm.getBtnRemove().click(); long startTime = System.nanoTime(); - boolean isMissed = dynamicControlsForm.getChbACheckbox().waitForNotExist(waitTime); + boolean isMissed = dynamicControlsForm.getChbACheckbox().state().waitForNotExist(waitTime); double duration = calculateDuration(startTime); Assert.assertFalse(isMissed); @@ -149,7 +149,7 @@ public void testShouldBePossibleToWaitElementNotExists(){ dynamicControlsForm.getBtnRemove().click(); long startTime = System.nanoTime(); - boolean isMissed = dynamicControlsForm.getChbACheckbox().waitForNotExist(); + boolean isMissed = dynamicControlsForm.getChbACheckbox().state().waitForNotExist(); double duration = calculateDuration(startTime); Assert.assertTrue(isMissed); diff --git a/src/test/java/tests/integration/ElementTests.java b/src/test/java/tests/integration/ElementTests.java index 98473bf..de15cfb 100644 --- a/src/test/java/tests/integration/ElementTests.java +++ b/src/test/java/tests/integration/ElementTests.java @@ -42,7 +42,7 @@ public void testComboBox() { public void testSelectOptionThatContainsValue() { navigate(TheInternetPage.DROPDOWN); IComboBox comboBox = elementFactory.getComboBox(By.id("dropdown"), "Dropdown"); - comboBox.waitForDisplayed(); + comboBox.state().waitForDisplayed(); List values = comboBox.getValuesList(); comboBox.selectOptionThatContainsValue("2"); @@ -148,14 +148,14 @@ public void testSetInnerHtml() { navigate(TheInternetPage.LOGIN); LoginForm loginForm = new LoginForm(); ITextBox txbUsername = loginForm.getTxbUsername(); - Assert.assertTrue(txbUsername.waitForDisplayed()); + Assert.assertTrue(txbUsername.state().waitForDisplayed()); ILabel lblLogin = loginForm.getLblLogin(); lblLogin.setInnerHtml("

123123

"); - Assert.assertTrue(txbUsername.waitForNotExist(loginForm.getTimeout())); + Assert.assertTrue(txbUsername.state().waitForNotExist(loginForm.getTimeout())); - Assert.assertTrue(elementFactory.getLabel(By.xpath(loginForm.getXPathFormLogin().concat("/p[.='123123']")), "login with innerHTML").waitForDisplayed()); + Assert.assertTrue(elementFactory.getLabel(By.xpath(loginForm.getXPathFormLogin().concat("/p[.='123123']")), "login with innerHTML").state().waitForDisplayed()); } @Test @@ -163,7 +163,7 @@ public void testRightClick() { BrowserManager.getBrowser().getDriver().navigate().to("https://swisnl.github.io/jQuery-contextMenu/demo.html"); ILabel label = elementFactory.getLabel(By.xpath("//span[contains(@class, 'context')]"), "Right click"); label.clickRight(); - boolean present = elementFactory.getLabel(By.xpath("//ul[contains(@class, 'context-menu-list')]"), "List", ElementState.DISPLAYED).waitForDisplayed(); + boolean present = elementFactory.getLabel(By.xpath("//ul[contains(@class, 'context-menu-list')]"), "List", ElementState.DISPLAYED).state().waitForDisplayed(); Assert.assertTrue(present, ""); } } \ No newline at end of file diff --git a/src/test/java/tests/integration/HiddenElementsTests.java b/src/test/java/tests/integration/HiddenElementsTests.java index 5e52a3b..127c187 100644 --- a/src/test/java/tests/integration/HiddenElementsTests.java +++ b/src/test/java/tests/integration/HiddenElementsTests.java @@ -25,20 +25,20 @@ protected void beforeMethod() { @Test public void testHiddenElementExist() { - Assert.assertTrue(new SliderForm().getBtnAddToCart(ElementState.EXISTS_IN_ANY_STATE).isExist()); + Assert.assertTrue(new SliderForm().getBtnAddToCart(ElementState.EXISTS_IN_ANY_STATE).state().isExist()); } @Test public void testHiddenElementsExist() { List listElements = new SliderForm().getListElements(ElementState.EXISTS_IN_ANY_STATE, ExpectedCount.MORE_THEN_ZERO); Assert.assertFalse(listElements.isEmpty()); - Assert.assertTrue(listElements.stream().allMatch(IElement::waitForExist)); + Assert.assertTrue(listElements.stream().allMatch(el -> el.state().waitForExist())); } @Test public void testNotHiddenElementsNotDisplayed() { List listElements = new SliderForm().getListElements(ElementState.DISPLAYED, ExpectedCount.MORE_THEN_ZERO); Assert.assertFalse(listElements.isEmpty()); - Assert.assertFalse(listElements.stream().anyMatch(label -> label.waitForDisplayed(1L))); + Assert.assertFalse(listElements.stream().anyMatch(label -> label.state().waitForDisplayed(1L))); } } diff --git a/src/test/java/tests/usecases/ElementExistNotDisplayedTest.java b/src/test/java/tests/usecases/ElementExistNotDisplayedTest.java index 44505b6..a06a0fb 100644 --- a/src/test/java/tests/usecases/ElementExistNotDisplayedTest.java +++ b/src/test/java/tests/usecases/ElementExistNotDisplayedTest.java @@ -23,6 +23,6 @@ public void beforeMethod() { @Test public void testElementExistNotDisplayed() { IButton button = new SliderForm().getBtnAddToCart(ElementState.EXISTS_IN_ANY_STATE); - Assert.assertTrue(ConditionalWait.waitForTrue(driver -> button.isExist() && !button.isDisplayed())); + Assert.assertTrue(ConditionalWait.waitForTrue(driver -> button.state().isExist() && !button.state().isDisplayed())); } } diff --git a/src/test/java/utils/FileUtil.java b/src/test/java/utils/FileUtil.java index 08505c5..80ec647 100644 --- a/src/test/java/utils/FileUtil.java +++ b/src/test/java/utils/FileUtil.java @@ -26,7 +26,7 @@ public static void deleteFile(File file){ public static boolean isFileDownloaded(String fileAddress, ILabel lblFileContent) { try { BrowserManager.getBrowser().goTo(fileAddress); - return lblFileContent.isDisplayed(); + return lblFileContent.state().isDisplayed(); } catch (WebDriverException e) { Logger.getInstance().warn(e.getMessage()); return false; From 9fc21fd714781de551a69b2f75b46404fb206a01 Mon Sep 17 00:00:00 2001 From: "d.bogatko" Date: Sat, 10 Aug 2019 01:00:36 +0300 Subject: [PATCH 4/5] refactored conditional wait refactored elements' states added isClickable --- .../selenium/elements/DesiredState.java | 43 +++++++ .../aquality/selenium/elements/Element.java | 39 +++---- .../selenium/elements/ElementFinder.java | 96 ++++++++++++---- .../elements/ElementStateProvider.java | 72 +++++++++--- .../elements/interfaces/IElement.java | 32 +++--- .../interfaces/IElementStateProvider.java | 20 ++++ .../selenium/waitings/ConditionalWait.java | 106 +++++++----------- src/main/resources/localization/en.json | 6 +- src/main/resources/localization/ru.json | 6 +- .../tests/integration/ElementStateTests.java | 20 +++- .../java/tests/integration/ElementTests.java | 21 ++++ .../integration/HiddenElementsTests.java | 1 - .../usecases/BrowserConcurrencyTests.java | 28 +++++ .../java/theinternet/TheInternetPage.java | 3 +- 14 files changed, 342 insertions(+), 151 deletions(-) create mode 100644 src/main/java/aquality/selenium/elements/DesiredState.java diff --git a/src/main/java/aquality/selenium/elements/DesiredState.java b/src/main/java/aquality/selenium/elements/DesiredState.java new file mode 100644 index 0000000..bd05cde --- /dev/null +++ b/src/main/java/aquality/selenium/elements/DesiredState.java @@ -0,0 +1,43 @@ +package aquality.selenium.elements; + +import org.openqa.selenium.WebElement; + +import java.util.function.Predicate; + +class DesiredState { + + private final Predicate desiredStatePredicate; + private final String message; + private final boolean isCatchableInTimeoutException; + private final boolean isThrowableNoSuchException; + + DesiredState(Predicate desiredStatePredicate, String message, boolean isCatchableInTimeoutException, boolean isThrowableNoSuchException){ + this.desiredStatePredicate = desiredStatePredicate; + this.message = message; + this.isCatchableInTimeoutException = isCatchableInTimeoutException; + this.isThrowableNoSuchException = isThrowableNoSuchException; + } + + DesiredState(Predicate desiredStatePredicate, String message){ + this.desiredStatePredicate = desiredStatePredicate; + this.message = message; + this.isCatchableInTimeoutException = true; + this.isThrowableNoSuchException = true; + } + + public Predicate getDesiredStatePredicate() { + return desiredStatePredicate; + } + + public String getMessage() { + return message; + } + + public boolean isCatchableInTimeoutException() { + return isCatchableInTimeoutException; + } + + public boolean isThrowableNoSuchException() { + return isThrowableNoSuchException; + } +} diff --git a/src/main/java/aquality/selenium/elements/Element.java b/src/main/java/aquality/selenium/elements/Element.java index 9b3a1bd..9b6374d 100644 --- a/src/main/java/aquality/selenium/elements/Element.java +++ b/src/main/java/aquality/selenium/elements/Element.java @@ -15,7 +15,6 @@ import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.NoSuchElementException; -import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.remote.RemoteWebElement; @@ -110,19 +109,16 @@ public void sendKeys(Keys key) { @Override public void waitAndClick() { - state().waitForEnabled(getDefaultTimeout()); + state().waitForClickable(); info(getLocManager().getValue(LOG_CLICKING)); click(); } - @Override public void click() { getJsActions().highlightElement(); ConditionalWait.waitFor(y -> { - WebElement el = getElement(); - info(getLocManager().getValue(LOG_CLICKING)); - el.click(); + getElement().click(); return true; }); } @@ -140,13 +136,10 @@ public String getText() { @Override public String getText(HighlightState highlightState) { - Logger.getInstance().debug(getLocManager().getValue("loc.get.text")); + info(getLocManager().getValue("loc.get.text")); if(highlightState.equals(HighlightState.HIGHLIGHT)){ getJsActions().highlightElement(); } - if(ElementFinder.getInstance().findElements(locator, getDefaultTimeout(), state).isEmpty()){ - throw new IllegalStateException(String.format(getLocManager().getValue("loc.element.wasnotfoundinstate"), getName(), state, getDefaultTimeout())); - } return ConditionalWait.waitFor(y -> getElement().getText()); } @@ -156,39 +149,43 @@ public IElementStateProvider state() { } @Override - public String getAttribute(final String attr, HighlightState highlightState, long timeout) { - getLogger().debug(getLocManager().getValue("loc.el.getattr"), attr); + public String getAttribute(final String attr, HighlightState highlightState) { + info(String.format(getLocManager().getValue("loc.el.getattr"), attr)); if (highlightState.equals(HighlightState.HIGHLIGHT)) { getJsActions().highlightElement(); } - return String.valueOf(ConditionalWait.waitFor(y -> getElement(timeout).getAttribute(attr), timeout + 5L)); + return String.valueOf(ConditionalWait.waitFor(y -> getElement().getAttribute(attr))); } @Override - public String getAttribute(final String attr, long timeout) { - return getAttribute(attr, HighlightState.NOT_HIGHLIGHT, timeout); + public String getAttribute(final String attr) { + return getAttribute(attr, HighlightState.NOT_HIGHLIGHT); } @Override - public String getAttribute(final String attr) { - return getAttribute(attr, HighlightState.NOT_HIGHLIGHT, getDefaultTimeout()); + public String getCssValue(final String propertyName, HighlightState highlightState) { + info(String.format(getLocManager().getValue("loc.el.cssvalue"), propertyName)); + if (highlightState.equals(HighlightState.HIGHLIGHT)) { + getJsActions().highlightElement(); + } + return String.valueOf(ConditionalWait.waitFor(y -> getElement().getCssValue(propertyName))); } @Override - public String getAttribute(final String attr, HighlightState highlightState) { - return getAttribute(attr, highlightState, getDefaultTimeout()); + public String getCssValue(final String propertyName) { + return getCssValue(propertyName, HighlightState.NOT_HIGHLIGHT); } @Override public void setInnerHtml(final String value) { click(); - getLogger().info(getLocManager().getValue("loc.send.text"), value); + info(String.format(getLocManager().getValue("loc.send.text"), value)); getBrowser().executeScript(JavaScript.SET_INNER_HTML.getScript(), getElement(), value); } @Override public void clickRight() { - getLogger().info(getLocManager().getValue("loc.clicking.right")); + info(String.format(getLocManager().getValue("loc.clicking.right"))); ConditionalWait.waitFor(y -> { Actions actions = new Actions(getBrowser().getDriver()); actions.moveToElement(getElement()); diff --git a/src/main/java/aquality/selenium/elements/ElementFinder.java b/src/main/java/aquality/selenium/elements/ElementFinder.java index 71f78db..a9d643b 100644 --- a/src/main/java/aquality/selenium/elements/ElementFinder.java +++ b/src/main/java/aquality/selenium/elements/ElementFinder.java @@ -5,13 +5,19 @@ import aquality.selenium.configuration.Configuration; import aquality.selenium.configuration.ITimeoutConfiguration; import aquality.selenium.elements.interfaces.IElementFinder; +import aquality.selenium.localization.LocalizationManager; +import aquality.selenium.logger.Logger; import aquality.selenium.waitings.ConditionalWait; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.Collectors; class ElementFinder implements IElementFinder { private static final ThreadLocal instanceHolder = new ThreadLocal<>(); @@ -45,37 +51,75 @@ public WebElement findElement(By locator, long timeout, ElementState state) { @Override public List findElements(By locator, long timeout, ElementState state) { + switch (state) { + case DISPLAYED: + return findElements(locator, timeout, new DesiredState(WebElement::isDisplayed, String.format(getLocManager().getValue("loc.no.elements.found.in.state"), locator, "DISPLAYED", timeout))); + case EXISTS_IN_ANY_STATE: + return findElements(locator, timeout, new DesiredState(Objects::nonNull, String.format(getLocManager().getValue("loc.no.elements.found.in.state"), locator, "EXIST", timeout))); + default: + String errorMessage = String.format("'%s' state is not recognized", state.toString()); + throw new IllegalArgumentException(errorMessage); + } + } + + List findElements(By locator, long timeout, DesiredState desiredState) + { + List foundElements = new ArrayList<>(); List resultElements = new ArrayList<>(); long zeroTimeout = 0L; getBrowser().setImplicitWaitTimeOut(zeroTimeout); - ConditionalWait.waitForTrue(y -> { - List foundElements = getBrowser().getDriver().findElements(locator); - List filteredElements = filterByState(foundElements, state); - resultElements.addAll(filteredElements); - return !filteredElements.isEmpty(); - }, timeout); + try{ + ConditionalWait.waitForTrue(driver -> + { + List allFoundElements = getBrowser().getDriver().findElements(locator); + foundElements.addAll(allFoundElements); + List filteredElements = filterByState(allFoundElements, desiredState.getDesiredStatePredicate()); + resultElements.addAll(filteredElements); + return !filteredElements.isEmpty(); + }, timeout); + }catch (TimeoutException e){ + applyResult(locator, desiredState, foundElements); + } getBrowser().setImplicitWaitTimeOut(getTimeoutConfiguration().getImplicit()); return resultElements; } - private List filterByState(List foundElements, ElementState state){ - List filteredElements = new ArrayList<>(); - if(!foundElements.isEmpty()){ - for (WebElement foundElement : foundElements) { - switch (state) { - case DISPLAYED: - if (foundElement.isDisplayed()) { - filteredElements.add(foundElement); - } - break; - case EXISTS_IN_ANY_STATE: - filteredElements.add(foundElement); - break; - default: - String errorMessage = String.format("'%s' state is not recognized", state.toString()); - throw new IllegalArgumentException(errorMessage); + /** + * depends on configuration of DesiredState object it can be required to throw or not NoSuchElementException + * @param locator locator that is using to find elements + * @param desiredState DesiredState object + * @param foundElements list of all found elements by locator. + */ + private void applyResult(By locator, DesiredState desiredState, List foundElements){ + if (desiredState.isCatchableInTimeoutException()){ + if(foundElements.isEmpty()){ + String message = String.format(getLocManager().getValue("loc.no.elements.found.by.locator"), locator); + if(desiredState.isThrowableNoSuchException()){ + throw new NoSuchElementException(message); } + getLogger().debug(message); + }else { + getLogger().debug(String.format(getLocManager().getValue("loc.elements.were.found.but.not.in.state"), locator, desiredState.getMessage())); } + }else { + throw new TimeoutException(desiredState.getMessage()); + } + } + + /** + * tries to find list of elements in the DOM during defined timeout + * @param locator locator to find elements + * @param timeout timeout + * @return list of elements ot empty list if no elements found + */ + public List findElements(By locator, long timeout) { + return findElements(locator, timeout, ElementState.EXISTS_IN_ANY_STATE); + } + + private List filterByState(List foundElements, Predicate desiredElementState){ + List filteredElements = new ArrayList<>(); + if(!foundElements.isEmpty()){ + filteredElements.addAll(foundElements.stream().filter(desiredElementState).collect(Collectors.toList())); } return filteredElements; } @@ -87,4 +131,12 @@ private Browser getBrowser() { private ITimeoutConfiguration getTimeoutConfiguration() { return Configuration.getInstance().getTimeoutConfiguration(); } + + private Logger getLogger(){ + return Logger.getInstance(); + } + + private LocalizationManager getLocManager(){ + return LocalizationManager.getInstance(); + } } diff --git a/src/main/java/aquality/selenium/elements/ElementStateProvider.java b/src/main/java/aquality/selenium/elements/ElementStateProvider.java index 49c4c67..6e2681c 100644 --- a/src/main/java/aquality/selenium/elements/ElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/ElementStateProvider.java @@ -6,9 +6,12 @@ import aquality.selenium.logger.Logger; import aquality.selenium.waitings.ConditionalWait; import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import java.util.List; +import java.util.Objects; class ElementStateProvider implements IElementStateProvider { @@ -19,6 +22,24 @@ class ElementStateProvider implements IElementStateProvider { this.locator = locator; } + @Override + public boolean isClickable() { + return waitForClickable(ZERO_TIMEOUT); + } + + @Override + public boolean waitForClickable(long timeout) { + String stateName = "CLICKABLE"; + getLogger().info(String.format(getLocManager().getValue("loc.waitinstate"), stateName, getLocator())); + DesiredState desiredState = new DesiredState(element -> element.isDisplayed() && element.isEnabled(), getDesiredStateMessage(stateName, timeout), false, true); + return isElementInDesiredCondition(timeout, desiredState); + } + + @Override + public boolean waitForClickable() { + return waitForClickable(getDefaultTimeout()); + } + @Override public boolean isDisplayed() { return waitForDisplayed(ZERO_TIMEOUT); @@ -26,8 +47,9 @@ public boolean isDisplayed() { @Override public boolean waitForDisplayed(long timeout) { - getLogger().info(getLocManager().getValue("loc.waitinstate"), ElementState.DISPLAYED, getLocator()); - return !findElements(timeout, ElementState.DISPLAYED).isEmpty(); + getLogger().info(String.format(getLocManager().getValue("loc.waitinstate"), ElementState.DISPLAYED, getLocator())); + DesiredState desiredState = new DesiredState(WebElement::isDisplayed, getDesiredStateMessage("DISPLAYED", timeout), true, false); + return isElementInDesiredCondition(timeout, desiredState); } @Override @@ -38,7 +60,8 @@ public boolean waitForDisplayed() { @Override public boolean waitForNotDisplayed(long timeout) { getLogger().info(getLocManager().getValue("loc.waitinvisible")); - return ConditionalWait.waitForTrue(driver -> !isDisplayed(), timeout); + DesiredState desiredState = new DesiredState(element -> !element.isDisplayed(), getDesiredStateMessage("NOT DISPLAYED", timeout), true, false); + return isElementInDesiredCondition(timeout, desiredState); } @Override @@ -54,7 +77,8 @@ public boolean isExist() { @Override public boolean waitForExist(long timeout) { getLogger().info(getLocManager().getValue("loc.waitexists")); - return !findElements(timeout, ElementState.EXISTS_IN_ANY_STATE).isEmpty(); + DesiredState desiredState = new DesiredState(Objects::nonNull, getDesiredStateMessage("EXIST", timeout), true, false); + return isElementInDesiredCondition(timeout, desiredState); } @Override @@ -65,7 +89,15 @@ public boolean waitForExist() { @Override public boolean waitForNotExist(long timeout) { getLogger().info(getLocManager().getValue("loc.waitnotexists"), timeout); - return ConditionalWait.waitForTrue(driver -> !isExist(), timeout); + try{ + long zeroTimeout = 0L; + return ConditionalWait.waitForTrue(y -> findElements(zeroTimeout).isEmpty(), timeout); + }catch (TimeoutException e){ + getLogger().debug(getDesiredStateMessage("NOT EXIST", timeout)); + return false; + }catch (NoSuchElementException e){ + return true; + } } @Override @@ -80,14 +112,13 @@ public boolean isEnabled() { @Override public boolean waitForEnabled(long timeout) { - return ConditionalWait.waitForTrue(y -> { - List webElements = findElements(timeout, ElementState.EXISTS_IN_ANY_STATE); - if(!webElements.isEmpty()){ - WebElement webElement = webElements.get(0); - return webElement.isEnabled() && !webElement.getAttribute(Attributes.CLASS.toString()).contains(PopularClassNames.DISABLED); - } - return false; - }, timeout); + DesiredState desiredState = new DesiredState(y -> + findElements(timeout). + stream().anyMatch(element -> + element.isEnabled() && + !element.getAttribute(Attributes.CLASS.toString()).contains(PopularClassNames.DISABLED) + ), getDesiredStateMessage("ENABLED", timeout)); + return isElementInDesiredCondition(timeout, desiredState); } @Override @@ -97,7 +128,8 @@ public boolean waitForEnabled() { @Override public boolean waitForNotEnabled(long timeout) { - return ConditionalWait.waitForTrue(driver -> !isEnabled(), timeout); + DesiredState desiredState = new DesiredState(driver -> !isEnabled(), getDesiredStateMessage("NOT ENABLED", timeout)); + return isElementInDesiredCondition(timeout, desiredState); } @Override @@ -105,14 +137,18 @@ public boolean waitForNotEnabled() { return waitForNotEnabled(getDefaultTimeout()); } - private List findElements(long timeout, ElementState state) { - return ElementFinder.getInstance().findElements(getLocator(), timeout, state); + private List findElements(long timeout) { + return ElementFinder.getInstance().findElements(getLocator(), timeout, ElementState.EXISTS_IN_ANY_STATE); } private By getLocator() { return locator; } + private boolean isElementInDesiredCondition(long timeout, DesiredState desiredState){ + return !ElementFinder.getInstance().findElements(locator, timeout, desiredState).isEmpty(); + } + private Logger getLogger(){ return Logger.getInstance(); } @@ -124,4 +160,8 @@ private LocalizationManager getLocManager(){ private long getDefaultTimeout(){ return Configuration.getInstance().getTimeoutConfiguration().getCondition(); } + + private String getDesiredStateMessage(String desiredStateName, long timeout){ + return String.format(getLocManager().getValue("loc.no.elements.found.in.state"), locator, desiredStateName, timeout); + } } diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElement.java b/src/main/java/aquality/selenium/elements/interfaces/IElement.java index e7d5389..ca83b91 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElement.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElement.java @@ -81,36 +81,34 @@ public interface IElement extends IParent { * Gets attribute value of the element. * * @param attr Attribute name - * @param highlightState if HIGHLIGHT: create red border around element that we interact while getting text - * @param timeout wait element timeout * @return Attribute value */ - String getAttribute(String attr, HighlightState highlightState, long timeout); + String getAttribute(String attr); /** - * Gets attribute value of the element. - * - * @param attr Attribute name - * @param timeout wait element timeout + * returns attribute value of element with highlighting or not before getting text + * @param highlightState if HIGHLIGHT: create red border around element that we interact while getting text + * @param attr html attribute name * @return Attribute value */ - String getAttribute(String attr, long timeout); + String getAttribute(String attr, HighlightState highlightState); /** - * Gets attribute value of the element. + * Gets css value of the element. * - * @param attr Attribute name - * @return Attribute value + * @param propertyName css value name + * @return css value */ - String getAttribute(String attr); + String getCssValue(String propertyName); /** - * returns attribute value of element with highlighting or not before getting text - * @param highlightState if HIGHLIGHT: create red border around element that we interact while getting text - * @param attr html attribute name - * @return Attribute value + * Gets css value of the element. + * + * @param propertyName css value name + * @param highlightState if HIGHLIGHT: create red border around element that we interact while getting css value + * @return css value */ - String getAttribute(String attr, HighlightState highlightState); + String getCssValue(String propertyName, HighlightState highlightState); /** * set innerHtml via javascript arguments[0].innerHTML='%1$s' . diff --git a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java index 7155d75..7db507f 100644 --- a/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java +++ b/src/main/java/aquality/selenium/elements/interfaces/IElementStateProvider.java @@ -6,6 +6,26 @@ */ public interface IElementStateProvider { + /** + * Is an element clickable on the page. + * @return true if element clickable, false otherwise + */ + boolean isClickable(); + + /** + * Waits for is element clickable on the page. + * @param timeout Timeout for waiting + * @return true if element clickable after waiting, false otherwise + */ + boolean waitForClickable(long timeout); + + /** + * Waits for is element clickable on the page. + * Uses condition timeout from settings file for waiting + * @return true if element clickable after waiting, false otherwise + */ + boolean waitForClickable(); + /** * Is an element displayed on the page. * @return true if element displayed, false otherwise diff --git a/src/main/java/aquality/selenium/waitings/ConditionalWait.java b/src/main/java/aquality/selenium/waitings/ConditionalWait.java index 1bf20a7..ed0e514 100644 --- a/src/main/java/aquality/selenium/waitings/ConditionalWait.java +++ b/src/main/java/aquality/selenium/waitings/ConditionalWait.java @@ -3,20 +3,15 @@ import aquality.selenium.browser.Browser; import aquality.selenium.browser.BrowserManager; import aquality.selenium.configuration.Configuration; -import aquality.selenium.logger.Logger; -import com.google.common.base.Function; -import org.openqa.selenium.NoSuchElementException; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.FluentWait; import org.openqa.selenium.support.ui.Wait; import java.time.Duration; +import java.util.function.Function; public final class ConditionalWait { - private static final Logger logger = Logger.getInstance(); private static final Configuration configuration = Configuration.getInstance(); private ConditionalWait() { @@ -24,8 +19,21 @@ private ConditionalWait() { } /** - * Wait for some object from condition with default timeout (property "defaultConditionTimeout" from - * selenium.properties). Wait until it's not false or null. + * Waits for function will be true or return some except false. + * Default timeout condition from settings is using. + * + * @param condition Function for waiting {@link Function} + * @param waitWith Object who will helping to wait (which will be passed to {@link Function#apply(Object)}) + * @param Type of waitWith param + * @param Type of object which is waiting + * @return Object which waiting for or null - is exceptions occured + */ + public static T waitFor(Function condition, F waitWith) { + return waitFor(condition, waitWith, configuration.getTimeoutConfiguration().getCondition()); + } + + /** + * Waits for some object from condition with default timeout from settings. Wait until it's not false or null. * * @param condition Condition for waiting {@link ExpectedCondition} * @param Object for waiting @@ -36,7 +44,7 @@ public static T waitFor(ExpectedCondition condition) { } /** - * Wait for some object from condition with timeout. Wait until it's not false or null. + * Waits for some object from condition with timeout. Wait until it's not false or null. * * @param condition Condition for waiting {@link ExpectedCondition} * @param timeOutInSeconds Timeout in seconds @@ -44,37 +52,41 @@ public static T waitFor(ExpectedCondition condition) { * @return Object from condition */ public static T waitFor(ExpectedCondition condition, long timeOutInSeconds) { + return waitFor(condition, BrowserManager.getBrowser().getDriver(), timeOutInSeconds); + } + + /** + * Waits for function will be true or return some except false. + * + * @param condition Function for waiting {@link Function}., + * + * @param waitWith Object who will helping to wait (which will be passed to {@link Function#apply(Object)}) + * @param timeOutInSeconds Time-out in seconds + * @param Type of waitWith param + * @param Type of object which is waiting + * @return Object which waiting for or null - is exceptions occured + */ + public static T waitFor(Function condition, F waitWith, long timeOutInSeconds) { getBrowser().setImplicitWaitTimeOut(0L); - Wait wait = new FluentWait<>((WebDriver) getBrowser().getDriver()) + Wait wait = new FluentWait<>(waitWith) .withTimeout(Duration.ofSeconds(timeOutInSeconds)) - .pollingEvery(Duration.ofMillis(configuration.getTimeoutConfiguration().getPollingInterval())) - .ignoring(StaleElementReferenceException.class) - .ignoring(NoSuchElementException.class); - + .pollingEvery(Duration.ofMillis(configuration.getTimeoutConfiguration().getPollingInterval())); try { return wait.until(condition); - } catch (Exception | AssertionError e) { - logger.debug("java.ConditionalWait.waitFor", e); } finally { getBrowser().setImplicitWaitTimeOut(configuration.getTimeoutConfiguration().getImplicit()); } - return null; } /** - * Wait for condition and return true if waiting successful or false - otherwise. - * Default timeout (property "defaultConditionTimeout" from selenium.properties) is using. + * Waits for condition and return true if waiting successful or false - otherwise. + * Default timeout condition from settings is using. * * @param condition Condition for waiting {@link ExpectedCondition} * @return True if waiting successful or false - otherwise. */ public static boolean waitForTrue(ExpectedCondition condition) { - try { - return waitFor(condition); - } catch (Exception e) { - logger.debug("java.ConditionalWait.waitForTrue", e); - return false; - } + return waitFor(condition); } @@ -86,49 +98,7 @@ public static boolean waitForTrue(ExpectedCondition condition) { * @return True if waiting successful or false - otherwise. */ public static boolean waitForTrue(ExpectedCondition condition, long timeOutInSeconds) { - try { - return waitFor(condition, timeOutInSeconds); - } catch (Exception e) { - logger.debug("java.ConditionalWait.waitForTrue", e); - return false; - } - } - - /** - * For waiting without WebDriver: Wait for function will be true or return some except false. - * - * @param condition Function for waiting {@link Function}., - * - * @param waitWith Object who will helping to wait (which will be passed to {@link Function#apply(Object)}) - * @param timeOutInSeconds Time-out in seconds - * @param Type of waitWith param - * @param Type of object which is waiting - * @return Object which waiting for or null - is exceptions occured - */ - public static T waitFor(Function condition, F waitWith, long timeOutInSeconds) { - Wait wait = new FluentWait<>(waitWith) - .withTimeout(Duration.ofSeconds(timeOutInSeconds)) - .pollingEvery(Duration.ofMillis(configuration.getTimeoutConfiguration().getPollingInterval())); - try { - return wait.until(condition); - } catch (Exception | AssertionError e) { - logger.debug("java.ConditionalWait.waitFor", e); - } - return null; - } - - /** - * For waiting without WebDriver: Wait for function will be true or return some except false. - * Default timeout (property "defaultConditionTimeout" from selenium.properties) is using. - * - * @param condition Function for waiting {@link Function} - * @param waitWith Object who will helping to wait (which will be passed to {@link Function#apply(Object)}) - * @param Type of waitWith param - * @param Type of object which is waiting - * @return Object which waiting for or null - is exceptions occured - */ - public static T waitFor(Function condition, F waitWith) { - return waitFor(condition, waitWith, configuration.getTimeoutConfiguration().getCondition()); + return waitFor(condition, timeOutInSeconds); } private static Browser getBrowser(){ diff --git a/src/main/resources/localization/en.json b/src/main/resources/localization/en.json index e7fb5a9..3df5ece 100644 --- a/src/main/resources/localization/en.json +++ b/src/main/resources/localization/en.json @@ -29,6 +29,7 @@ "loc.combobox.select.by.text" : "Selecting value by text '%s'", "loc.combobox.get.values" : "Getting values array", "loc.el.getattr" : "Getting attribute '%1$s'", + "loc.el.cssvalue" : "Getting css value '%1$s'", "loc.file.reading_exception" : "Exception while reading file: '%s'", "loc.focusing" : "Focusing", "loc.get.text" : "Getting text from element", @@ -52,5 +53,8 @@ "loc.waitexists" : "Wait until element exists in DOM", "loc.waitinstate" : "Wait until is present in state %1$s using \"locator\": %2$s", "loc.waitinvisible" : "Wait until element is not visible", - "loc.waitnotexists" : "Wait until element does not exist in DOM during %1$s seconds" + "loc.waitnotexists" : "Wait until element does not exist in DOM during %1$s seconds", + "loc.no.elements.found.in.state" : "no elements with locator '%1$s' found in state '%2$s' during %3$s seconds", + "loc.no.elements.found.by.locator" : "No elements were found by locator '%1$s'", + "loc.elements.were.found.but.not.in.state" : "Elements were found by locator '%1$s'. But %2$s" } \ No newline at end of file diff --git a/src/main/resources/localization/ru.json b/src/main/resources/localization/ru.json index 66072f2..3e8edac 100644 --- a/src/main/resources/localization/ru.json +++ b/src/main/resources/localization/ru.json @@ -29,6 +29,7 @@ "loc.combobox.select.by.text" : "Выбор значения с текстом '%s'", "loc.combobox.get.values" : "Получение списка значений", "loc.el.getattr" : "Получение аттрибута '%1$s'", + "loc.el.cssvalue" : "Получение значения css '%1$s'", "loc.file.reading_exception" : "Исключение при чтении файла: '%s'%n", "loc.focusing" : "Взятие элемента в фокус", "loc.get.text" : "Получение текста элемента", @@ -52,5 +53,8 @@ "loc.waitexists" : "Ожидаем появления элемента в DOM", "loc.waitinstate" : "Ожидание присутствия элемента в состоянии %1$s используя локатор: %2$s", "loc.waitinvisible" : "Ожидаем пока элемент исчезнет", - "loc.waitnotexists" : "Ожидаем исчезновения элемента из DOM в течении %1$s" + "loc.waitnotexists" : "Ожидаем исчезновения элемента из DOM в течении %1$s", + "loc.no.elements.found.in.state" : "не удалось найти элементов по локатору '%1$s' в состоянии '%2$s' на протяжении %3$s секунд", + "loc.no.elements.found.by.locator" : "Не удалось найти элементов по локатору '%1$s'", + "loc.elements.were.found.but.not.in.state" : "Удалось найти элементы по локатору '%1$s'. Но %2$s" } \ No newline at end of file diff --git a/src/test/java/tests/integration/ElementStateTests.java b/src/test/java/tests/integration/ElementStateTests.java index eae0a47..fe15aed 100644 --- a/src/test/java/tests/integration/ElementStateTests.java +++ b/src/test/java/tests/integration/ElementStateTests.java @@ -1,8 +1,11 @@ package tests.integration; import aquality.selenium.configuration.Configuration; +import aquality.selenium.elements.ElementFactory; import aquality.selenium.elements.HighlightState; import aquality.selenium.elements.interfaces.ILabel; +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; import org.testng.Assert; import org.testng.annotations.Test; import tests.BaseTest; @@ -14,6 +17,8 @@ public class ElementStateTests extends BaseTest { private final double operationTime = 2; private final long customWaitTime = 2L; + private final ElementFactory elementFactory = new ElementFactory(); + private final ILabel lblNotExists = elementFactory.getLabel(By.xpath("//div[@class='not exist element']"), "not exist element"); @Test public void testElementShouldWaitForEnabledWithCustomTimeout() { @@ -58,6 +63,16 @@ public void testElementShouldWaitForNotEnabledWithCustomTimeout() { Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); } + @Test(expectedExceptions = NoSuchElementException.class) + public void testNoSuchShouldBeThrownForWaitEnabledIfElementNotFound(){ + lblNotExists.state().waitForEnabled(customWaitTime); + } + + @Test(expectedExceptions = NoSuchElementException.class) + public void testNoSuchShouldBeThrownForWaitNotEnabledIfElementNotFound(){ + lblNotExists.state().waitForNotEnabled(customWaitTime); + } + @Test public void testElementShouldWaitForNotEnabledWithDefaultTimeout() { navigate(TheInternetPage.DYNAMIC_CONTROLS); @@ -97,12 +112,11 @@ public void testWaitInvisibility() { ILabel lblLoading = loadingForm.getLblLoading(); String id = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT); - String id2 = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT, loadingForm.getTimeout()); - String id3 = lblLoading.getAttribute("id", loadingForm.getTimeout()); + String id2 = lblLoading.getAttribute("id"); String loadingText = "loading"; + Assert.assertEquals(id,loadingText); Assert.assertEquals(id2,loadingText); - Assert.assertEquals(id3,loadingText); lblLoading.state().waitForDisplayed(2L); diff --git a/src/test/java/tests/integration/ElementTests.java b/src/test/java/tests/integration/ElementTests.java index de15cfb..f684caa 100644 --- a/src/test/java/tests/integration/ElementTests.java +++ b/src/test/java/tests/integration/ElementTests.java @@ -4,11 +4,13 @@ import aquality.selenium.elements.ElementState; import aquality.selenium.elements.ElementType; import aquality.selenium.elements.ExpectedCount; +import aquality.selenium.elements.HighlightState; import aquality.selenium.elements.interfaces.*; import aquality.selenium.waitings.ConditionalWait; import automationpractice.forms.DropDownForm; import org.openqa.selenium.By; import org.openqa.selenium.Keys; +import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.support.ui.ExpectedCondition; import org.testng.Assert; import org.testng.annotations.Test; @@ -166,4 +168,23 @@ public void testRightClick() { boolean present = elementFactory.getLabel(By.xpath("//ul[contains(@class, 'context-menu-list')]"), "List", ElementState.DISPLAYED).state().waitForDisplayed(); Assert.assertTrue(present, ""); } + + @Test + public void testShouldBePossibleToGetCssValue(){ + navigate(TheInternetPage.LOGIN); + ITextBox txbUsername = elementFactory.getTextBox(By.id("username"), "username"); + + String propertyName = "font-family"; + String expectedCssValue = "\"Helvetica Neue\", Helvetica, Helvetica, Arial, sans-serif"; + + Assert.assertEquals(txbUsername.getCssValue(propertyName), expectedCssValue); + + Assert.assertEquals(txbUsername.getCssValue(propertyName, HighlightState.HIGHLIGHT), expectedCssValue); + } + + @Test(expectedExceptions = NoSuchElementException.class) + public void testNoSuchShouldBeThrownIfNoELementsExistForSendKeys(){ + ITextBox textBox = elementFactory.getTextBox(By.xpath("//div[@class='not exist element']"), "not exist element"); + textBox.sendKeys(Keys.BACK_SPACE); + } } \ No newline at end of file diff --git a/src/test/java/tests/integration/HiddenElementsTests.java b/src/test/java/tests/integration/HiddenElementsTests.java index 127c187..eb1d11d 100644 --- a/src/test/java/tests/integration/HiddenElementsTests.java +++ b/src/test/java/tests/integration/HiddenElementsTests.java @@ -3,7 +3,6 @@ import aquality.selenium.browser.BrowserManager; import aquality.selenium.elements.ElementState; import aquality.selenium.elements.ExpectedCount; -import aquality.selenium.elements.interfaces.IElement; import aquality.selenium.elements.interfaces.ILabel; import automationpractice.forms.SliderForm; import org.testng.Assert; diff --git a/src/test/java/tests/usecases/BrowserConcurrencyTests.java b/src/test/java/tests/usecases/BrowserConcurrencyTests.java index 18976e3..0052809 100644 --- a/src/test/java/tests/usecases/BrowserConcurrencyTests.java +++ b/src/test/java/tests/usecases/BrowserConcurrencyTests.java @@ -1,10 +1,19 @@ package tests.usecases; +import aquality.selenium.browser.Browser; import aquality.selenium.browser.BrowserManager; +import aquality.selenium.elements.ElementFactory; +import aquality.selenium.elements.ElementType; +import aquality.selenium.elements.HighlightState; +import aquality.selenium.elements.interfaces.ILabel; +import org.openqa.selenium.By; import org.testng.Assert; import org.testng.annotations.Test; import theinternet.TheInternetPage; +import java.util.ArrayList; +import java.util.List; + public class BrowserConcurrencyTests { @Test @@ -23,6 +32,25 @@ public void testBrowserShouldBePossibleToHaveTwoBrowsersForTwoThreads() throws I thread02.interrupt(); } + @Test + public void testShouldBePossibleToUseParallelStreams(){ + Browser browser = BrowserManager.getBrowser(); + browser.navigate().to(TheInternetPage.TABLES.getAddress()); + List textBoxes = new ElementFactory().findElements(By.xpath("//td"), ElementType.LABEL); + List texts = new ArrayList<>(); + textBoxes.parallelStream().forEach(lbl -> { + // set the same instance of browser for all threads + BrowserManager.setBrowser(browser); + String text = lbl.getText(HighlightState.HIGHLIGHT); + // processing results of work trough web driver (getting text) + String updatedText = text + "_updated"; + texts.add(text); + texts.add(updatedText); + }); + browser.quit(); + Assert.assertEquals(texts.size(), textBoxes.size()*2); + } + class BrowserThread implements Runnable { private final String url; diff --git a/src/test/java/theinternet/TheInternetPage.java b/src/test/java/theinternet/TheInternetPage.java index c64deb3..1e48ae8 100644 --- a/src/test/java/theinternet/TheInternetPage.java +++ b/src/test/java/theinternet/TheInternetPage.java @@ -9,7 +9,8 @@ public enum TheInternetPage { JAVASCRIPT_ALERTS, LOGIN, REDIRECTOR, - STATUS_CODES; + STATUS_CODES, + TABLES; private static final String BASE_URL = "http://the-internet.herokuapp.com/"; From 6a9836300a8465765e5b5dbf5a548fd03fa2f39d Mon Sep 17 00:00:00 2001 From: "d.bogatko" Date: Thu, 22 Aug 2019 00:27:27 +0300 Subject: [PATCH 5/5] removed duplicate logging from Navigation #31 --- src/main/java/aquality/selenium/browser/Browser.java | 4 ---- src/main/resources/localization/en.json | 1 - src/main/resources/localization/ru.json | 1 - 3 files changed, 6 deletions(-) diff --git a/src/main/java/aquality/selenium/browser/Browser.java b/src/main/java/aquality/selenium/browser/Browser.java index 2c27d5c..445deaf 100644 --- a/src/main/java/aquality/selenium/browser/Browser.java +++ b/src/main/java/aquality/selenium/browser/Browser.java @@ -60,7 +60,6 @@ public RemoteWebDriver getDriver() { * @param url URL where you wish to navigate */ public void goTo(String url) { - logger.info(String.format(getLocManager().getValue("loc.browser.goTo"), url)); navigate().to(url); } @@ -68,7 +67,6 @@ public void goTo(String url) { * Executes navigating back */ public void goBack() { - logger.info(getLocManager().getValue("loc.browser.back")); navigate().back(); } @@ -76,7 +74,6 @@ public void goBack() { * Executes navigating forward */ public void goForward() { - logger.info(getLocManager().getValue("loc.browser.forward")); navigate().forward(); } @@ -101,7 +98,6 @@ public String getCurrentUrl() { * Executes refreshing of current page */ public void refresh() { - logger.info(getLocManager().getValue("loc.browser.refresh")); navigate().refresh(); } diff --git a/src/main/resources/localization/en.json b/src/main/resources/localization/en.json index 54a96dd..7cc8f78 100644 --- a/src/main/resources/localization/en.json +++ b/src/main/resources/localization/en.json @@ -1,6 +1,5 @@ { "loc.browser.arguments.setting" : "Setting browser start arguments from JSON file: %s", - "loc.browser.goTo" : "Go to URL '%1$s'", "loc.browser.back" : "Return to previous page", "loc.browser.forward" : "Proceed to the next page", "loc.browser.caps.setting" : "Setting browser capabilities from JSON file: %s", diff --git a/src/main/resources/localization/ru.json b/src/main/resources/localization/ru.json index 6fe8637..7acfd46 100644 --- a/src/main/resources/localization/ru.json +++ b/src/main/resources/localization/ru.json @@ -1,6 +1,5 @@ { "loc.browser.arguments.setting" : "Установка стартовых аргументов браузера из JSON файла: %s", - "loc.browser.goTo" : "Переход по URL '%1$s'", "loc.browser.back" : "Возврат на предыдущую страницу", "loc.browser.forward" : "Перейти на следующую страницу", "loc.browser.caps.setting" : "Установка capabilities браузера из JSON файла: %s",