diff --git a/pom.xml b/pom.xml index b7ae786..f749dff 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.aquality-automation aquality-selenium - 1.1.1 + 1.1.2 jar Aquality Selenium diff --git a/src/main/java/aquality/selenium/utils/JsonFile.java b/src/main/java/aquality/selenium/utils/JsonFile.java index c9a967e..bff4bf3 100644 --- a/src/main/java/aquality/selenium/utils/JsonFile.java +++ b/src/main/java/aquality/selenium/utils/JsonFile.java @@ -35,20 +35,18 @@ public Object getValue(String jsonPath){ private Object getEnvValueOrDefault(String jsonPath){ String key = jsonPath.replace("/",".").substring(1, jsonPath.length()); String envVar = System.getProperty(key); - if(envVar == null){ - JsonNode node = getJsonNode(jsonPath); - if(node.isBoolean()){ - return node.asBoolean(); - }else if(node.isLong()){ - return node.asLong(); - }else if(node.isInt()){ - return node.asInt(); - }else{ - return node.asText(); - } - }else { + if(envVar != null){ Logger.getInstance().debug(String.format("***** Using variable passed from environment %1$s=%2$s", key, envVar)); - return envVar; + } + JsonNode node = getJsonNode(jsonPath); + if(node.isBoolean()){ + return envVar == null ? node.asBoolean() : Boolean.parseBoolean(envVar); + }else if(node.isLong()){ + return envVar == null ? node.asLong() : Long.parseLong(envVar); + }else if(node.isInt()){ + return envVar == null ? node.asInt() : Integer.parseInt(envVar); + }else{ + return envVar == null ? node.asText() : envVar; } } diff --git a/src/test/java/aquality/selenium/utils/ElementActionRetrierTests.java b/src/test/java/aquality/selenium/utils/ElementActionRetrierTests.java index 1a79e3d..6c15b91 100644 --- a/src/test/java/aquality/selenium/utils/ElementActionRetrierTests.java +++ b/src/test/java/aquality/selenium/utils/ElementActionRetrierTests.java @@ -2,18 +2,17 @@ import aquality.selenium.configuration.Configuration; import aquality.selenium.logger.Logger; -import org.apache.commons.lang3.time.StopWatch; import org.openqa.selenium.InvalidArgumentException; import org.openqa.selenium.InvalidElementStateException; import org.openqa.selenium.StaleElementReferenceException; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import utils.DurationSample; import utils.Timer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Date; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -43,8 +42,8 @@ public void testRetrierShouldWorkOnceIfMethodSucceeded() { @Test(dataProvider = "handledExceptions") public void testRetrierShouldWaitPollingTimeBetweenMethodsCall(RuntimeException handledException) { - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); + Timer timer = new Timer(Timer.TimeUnit.MILLISECONDS); + timer.start(); AtomicBoolean isThrowException = new AtomicBoolean(true); ElementActionRetrier.doWithRetry(() -> { if (isThrowException.get()) { @@ -52,11 +51,9 @@ public void testRetrierShouldWaitPollingTimeBetweenMethodsCall(RuntimeException throw handledException; } }); - stopWatch.stop(); + DurationSample durationSample = new DurationSample( timer.duration(), pollingInterval, 200); - long duration = stopWatch.getTime(TimeUnit.MILLISECONDS); - assertTrue(duration >= pollingInterval, "duration should be more than polling interval. actual is " + duration + " milliseconds"); - assertTrue(duration <= 2 * pollingInterval, "duration should be less than doubled polling interval. actual is " + duration + " milliseconds"); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test(expectedExceptions = InvalidArgumentException.class) diff --git a/src/test/java/aquality/selenium/waitings/ConditionalWaitTests.java b/src/test/java/aquality/selenium/waitings/ConditionalWaitTests.java index d3f720d..60b43cb 100644 --- a/src/test/java/aquality/selenium/waitings/ConditionalWaitTests.java +++ b/src/test/java/aquality/selenium/waitings/ConditionalWaitTests.java @@ -1,10 +1,11 @@ package aquality.selenium.waitings; +import aquality.selenium.browser.BrowserManager; import aquality.selenium.configuration.Configuration; import aquality.selenium.configuration.ITimeoutConfiguration; import org.openqa.selenium.StaleElementReferenceException; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import utils.DurationSample; import utils.Timer; import java.util.Collections; @@ -17,30 +18,27 @@ public class ConditionalWaitTests { private static final long waitForTimeoutCondition = 10; private static final long waitForTimeoutPolling = 150; - private Timer timer; - - @BeforeMethod - public void initTimer(){ - timer = new Timer(); - } + private static final double defaultDeviation = 7; @Test public void testFalseShouldBeReturnedIfConditionIsNotMetAndDefaultTimeoutIsOver(){ long timeoutCondition = getTimeoutConfig().getCondition(); + Timer timer = new Timer(); boolean result = ConditionalWait.waitForTrue(() -> { timer.start(); return false; }, "Condition should be true"); - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), timeoutCondition, defaultDeviation); assertFalse(result); - assertTrue(duration > timeoutCondition && duration < 2 * timeoutCondition); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test public void testTimeoutExceptionShouldBeThrownIfConditionIsMetAndTimeoutIsOver(){ + Timer timer = new Timer(); try { ConditionalWait.waitForTrue(() -> { @@ -48,36 +46,38 @@ public void testTimeoutExceptionShouldBeThrownIfConditionIsMetAndTimeoutIsOver() return false; }, waitForTimeoutCondition, waitForTimeoutPolling,"Condition should be true"); } catch (TimeoutException e) { - double duration = timer.stop(); - assertTrue(duration > waitForTimeoutCondition && duration < 2 * waitForTimeoutCondition); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition, defaultDeviation); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } } @Test public void testTimeoutExceptionShouldNotBeThrownIfConditionIsMetAndDefaultTimeoutIsNotOver(){ long timeoutCondition = getTimeoutConfig().getCondition(); + Timer timer = new Timer(); boolean result = ConditionalWait.waitForTrue(() -> { timer.start(); return true; }, "Timeout exception should not be thrown"); - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), timeoutCondition); assertTrue(result); - assertTrue(duration < timeoutCondition); + assertTrue(durationSample.getDuration() < timeoutCondition); } @Test public void testTimeoutExceptionShouldNotBeThrownIfConditionMetAndTimeoutIsNotOver() throws TimeoutException { + Timer timer = new Timer(); + ConditionalWait.waitForTrue(() -> { timer.start(); return true; }, waitForTimeoutCondition, waitForTimeoutPolling, "Timeout exception should not be thrown"); - double duration = timer.stop(); - - assertTrue(duration < waitForTimeoutCondition); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition); + assertTrue(durationSample.getDuration() < waitForTimeoutCondition); } @Test(expectedExceptions = IllegalArgumentException.class) @@ -88,6 +88,8 @@ public void testNullCannotBePassedAsCondition(){ @Test public void testTimeoutExceptionShouldBeThrownIfDriverConditionIsNotMetAndDefaultTimeoutIsOver(){ long timeoutCondition = getTimeoutConfig().getCondition(); + Timer timer = new Timer(); + try{ ConditionalWait.waitFor((driver) -> { @@ -97,14 +99,17 @@ public void testTimeoutExceptionShouldBeThrownIfDriverConditionIsNotMetAndDefaul "Condition should be true"); }catch (org.openqa.selenium.TimeoutException e){ - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), timeoutCondition, defaultDeviation); + BrowserManager.getBrowser().quit(); - assertTrue(duration > timeoutCondition && duration < 2 * timeoutCondition); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } } @Test public void testTimeoutExceptionShouldBeThrownIfDriverConditionIsNotMetAndTimeoutIsOver(){ + Timer timer = new Timer(); + try{ ConditionalWait.waitFor((driver) -> { @@ -114,28 +119,33 @@ public void testTimeoutExceptionShouldBeThrownIfDriverConditionIsNotMetAndTimeou "Conditional should be true", Collections.singleton(StaleElementReferenceException.class)); }catch (org.openqa.selenium.TimeoutException e){ - double duration = timer.stop(); - - assertTrue(duration > waitForTimeoutCondition && duration < 2 * waitForTimeoutCondition); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition, defaultDeviation); + BrowserManager.getBrowser().quit(); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } } @Test public void testTimeoutExceptionShouldNotBeThrownIfDriverConditionIsMetAndDefaultTimeoutIsNotOver(){ + Timer timer = new Timer(); + ConditionalWait.waitFor((driver) -> { timer.start(); return true; }, "Conditional should be true"); - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition); + BrowserManager.getBrowser().quit(); - assertTrue(duration < getTimeoutConfig().getCondition()); + assertTrue(durationSample.getDuration() < getTimeoutConfig().getCondition()); } @Test public void testExceptionShouldBeCatchedConditionIsMetAndDefaultTimeoutIsNotOver(){ + Timer timer = new Timer(); + try{ ConditionalWait.waitFor((driver) -> { @@ -144,23 +154,27 @@ public void testExceptionShouldBeCatchedConditionIsMetAndDefaultTimeoutIsNotOver }, waitForTimeoutCondition, waitForTimeoutPolling, "Conditional should be true", Collections.singleton(IllegalArgumentException.class)); } catch (org.openqa.selenium.TimeoutException e){ - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition, defaultDeviation); + BrowserManager.getBrowser().quit(); - assertTrue(duration > waitForTimeoutCondition && duration < 2 * waitForTimeoutCondition); + assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } } @Test public void testTimeoutExceptionShouldNotBeThrownIfDriverConditionIsMetAndTimeoutIsNotOver(){ + Timer timer = new Timer(); + ConditionalWait.waitFor((driver) -> { timer.start(); return true; }, waitForTimeoutCondition, waitForTimeoutPolling, "Conditional should be true", Collections.singleton(IllegalArgumentException.class)); - double duration = timer.stop(); + DurationSample durationSample = new DurationSample(timer.duration(), waitForTimeoutCondition); + BrowserManager.getBrowser().quit(); - assertTrue(duration < waitForTimeoutCondition); + assertTrue(durationSample.getDuration() < waitForTimeoutCondition); } private ITimeoutConfiguration getTimeoutConfig(){ diff --git a/src/test/java/tests/integration/ActionTests.java b/src/test/java/tests/integration/ActionTests.java index 28a9ece..3e5cb2a 100644 --- a/src/test/java/tests/integration/ActionTests.java +++ b/src/test/java/tests/integration/ActionTests.java @@ -5,6 +5,7 @@ import aquality.selenium.elements.actions.JsActions; import aquality.selenium.elements.interfaces.IButton; import aquality.selenium.elements.interfaces.ITextBox; +import aquality.selenium.waitings.ConditionalWait; import automationpractice.forms.ProductForm; import automationpractice.forms.ProductListForm; import org.openqa.selenium.Keys; @@ -50,8 +51,13 @@ public void testMoveMouseToElement() { @Test public void testMoveMouseFromElement() { ProductListForm productListForm = new ProductListForm(); + + Assert.assertTrue(ConditionalWait.waitForTrue(() -> { + IButton button = productListForm.getBtnLastProductMoreFocused(); + return button.getText().contains("More"); + }, "element is not focused after moveMouseToElement()")); + IButton button = productListForm.getBtnLastProductMoreFocused(); - Assert.assertTrue(button.getText().contains("More"), "element is not focused after moveMouseToElement()"); productListForm.getLblLastProduct().getMouseActions().moveMouseFromElement(); Assert.assertFalse(button.state().isDisplayed(), "element is still focused after moveMouseFromElement()"); } diff --git a/src/test/java/tests/integration/BrowserTests.java b/src/test/java/tests/integration/BrowserTests.java index fe385a0..956c93d 100644 --- a/src/test/java/tests/integration/BrowserTests.java +++ b/src/test/java/tests/integration/BrowserTests.java @@ -12,18 +12,20 @@ import theinternet.TheInternetPage; import theinternet.forms.DynamicContentForm; import theinternet.forms.FormAuthenticationForm; -import utils.TimeUtil; +import utils.DurationSample; +import utils.Timer; import java.io.IOException; import java.io.UncheckedIOException; import static automationpractice.Constants.URL_AUTOMATIONPRACTICE; import static utils.FileUtil.getResourceFileByName; -import static utils.TimeUtil.getCurrentTimeInSeconds; public class BrowserTests extends BaseTest { + private static final double defaultDeviation = 3; + @Test public void testShouldBePossibleToStartBrowserAndNavigate(){ getBrowser().goTo(TheInternetPage.LOGIN.getAddress()); @@ -108,13 +110,14 @@ public void testShouldBePossibleToExecuteJavaScriptAsync(){ getBrowser().waitForPageToLoad(); long expectedDurationInSeconds = 1; - long operationDurationInSeconds = 1; - double startTimeSeconds = TimeUtil.getCurrentTimeInSeconds(); + + Timer timer = new Timer(); + timer.start(); getBrowser().executeAsyncScript(getAsyncTimeoutJavaScript(expectedDurationInSeconds)); - double durationSeconds = TimeUtil.getCurrentTimeInSeconds() - startTimeSeconds; - Assert.assertTrue(durationSeconds < (expectedDurationInSeconds + operationDurationInSeconds) && - durationSeconds >= expectedDurationInSeconds); + DurationSample durationSample = new DurationSample(timer.duration(), expectedDurationInSeconds, defaultDeviation); + + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test (expectedExceptions = ScriptTimeoutException.class) @@ -186,18 +189,17 @@ public void testShouldBePossibleToGetBrowserName() { @Test public void testShouldBePossibleToSetImplicitWait(){ long waitTime = 5L; - long operationTime = 2L; getBrowser().setImplicitWaitTimeout(waitTime); - double startTime = getCurrentTimeInSeconds(); - double endTime = 0L; + Timer timer = new Timer(); + timer.start(); + DurationSample durationSample = null; try{ getBrowser().getDriver().findElement(By.id("not_exist_element")); }catch (NoSuchElementException e){ - endTime = getCurrentTimeInSeconds(); + durationSample = new DurationSample(timer.duration(), waitTime, defaultDeviation); } - Assert.assertTrue((endTime - startTime) < waitTime + operationTime); - Assert.assertTrue((endTime - startTime) >= waitTime); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test diff --git a/src/test/java/tests/integration/ElementStateTests.java b/src/test/java/tests/integration/ElementStateTests.java index 8952120..5817582 100644 --- a/src/test/java/tests/integration/ElementStateTests.java +++ b/src/test/java/tests/integration/ElementStateTests.java @@ -2,7 +2,6 @@ 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; @@ -12,12 +11,14 @@ import theinternet.TheInternetPage; import theinternet.forms.DynamicControlsForm; import theinternet.forms.DynamicLoadingForm; -import static utils.TimeUtil.*; +import utils.DurationSample; +import utils.Timer; public class ElementStateTests extends BaseTest { - private final double operationTime = 5; private final long customWaitTime = 2L; + private final double customDeviation = 2; + private final double defaultDeviation = 7; private final ElementFactory elementFactory = new ElementFactory(); private final ILabel lblNotExists = elementFactory.getLabel(By.xpath("//div[@class='not exist element']"), "not exist element"); @@ -26,12 +27,13 @@ public void testElementShouldWaitForEnabledWithCustomTimeout() { navigate(TheInternetPage.DYNAMIC_CONTROLS); long waitTime = customWaitTime; - long startTime = getCurrentTime(); + Timer timer = new Timer(); + timer.start(); boolean isEnabled = new DynamicControlsForm().getTxbInput().state().waitForEnabled(waitTime); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, customDeviation); Assert.assertFalse(isEnabled); - Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test @@ -39,12 +41,13 @@ public void testElementShouldWaitForEnabledWithDefaultTimeout() { navigate(TheInternetPage.DYNAMIC_CONTROLS); long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); - long startTime = getCurrentTime(); + Timer timer = new Timer(); + timer.start(); boolean isEnabled = new DynamicControlsForm().getTxbInput().state().waitForEnabled(); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, defaultDeviation); Assert.assertFalse(isEnabled); - Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test @@ -56,12 +59,13 @@ public void testElementShouldWaitForNotEnabledWithCustomTimeout() { dynamicControlsForm.getBtnEnable().click(); dynamicControlsForm.getTxbInput().state().waitForEnabled(); - long startTime = getCurrentTime(); + Timer timer = new Timer(); + timer.start(); boolean isDisabled = dynamicControlsForm.getTxbInput().state().waitForNotEnabled(waitTime); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, defaultDeviation); Assert.assertFalse(isDisabled); - Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test(expectedExceptions = NoSuchElementException.class) @@ -83,12 +87,13 @@ public void testElementShouldWaitForNotEnabledWithDefaultTimeout() { dynamicControlsForm.getBtnEnable().click(); dynamicControlsForm.getTxbInput().state().waitForEnabled(); - long startTime = getCurrentTime(); + Timer timer = new Timer(); + timer.start(); boolean isDisabled = dynamicControlsForm.getTxbInput().state().waitForNotEnabled(); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, defaultDeviation); Assert.assertFalse(isDisabled); - Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test @@ -100,35 +105,6 @@ public void testTextBoxEnabled() { Assert.assertTrue(dynamicControlsForm.getTxbInput().state().isEnabled()); } - @Test - public void testWaitInvisibility() { - navigate(TheInternetPage.DYNAMIC_LOADING); - DynamicLoadingForm loadingForm = new DynamicLoadingForm(); - - loadingForm.getBtnStart().state().waitForClickable(); - loadingForm.getBtnStart().click(); - - ILabel lblLoading = loadingForm.getLblLoading(); - String id = lblLoading.getAttribute("id", HighlightState.HIGHLIGHT); - String id2 = lblLoading.getAttribute("id"); - String loadingText = "loading"; - - Assert.assertEquals(id,loadingText); - Assert.assertEquals(id2,loadingText); - - lblLoading.state().waitForDisplayed(2L); - - boolean status = lblLoading.state().waitForNotDisplayed(2L); - Assert.assertFalse(status); - - status = lblLoading.state().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); @@ -145,12 +121,14 @@ public void testShouldBePossibleToWaitElementNotExistsCustom(){ DynamicControlsForm dynamicControlsForm = new DynamicControlsForm(); long waitTime = customWaitTime; dynamicControlsForm.getBtnRemove().click(); - long startTime = getCurrentTime(); + + Timer timer = new Timer(); + timer.start(); boolean isMissed = dynamicControlsForm.getChbACheckbox().state().waitForNotExist(waitTime); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, customDeviation); Assert.assertFalse(isMissed); - Assert.assertTrue(duration >= waitTime && duration <= (waitTime + operationTime)); + Assert.assertTrue(durationSample.isDurationBetweenLimits(), durationSample.toString()); } @Test @@ -160,11 +138,13 @@ public void testShouldBePossibleToWaitElementNotExists(){ long waitTime = Configuration.getInstance().getTimeoutConfiguration().getCondition(); dynamicControlsForm.getBtnRemove().click(); - long startTime = getCurrentTime(); + Timer timer = new Timer(); + timer.start(); boolean isMissed = dynamicControlsForm.getChbACheckbox().state().waitForNotExist(); - double duration = calculateDuration(startTime); + DurationSample durationSample = new DurationSample(timer.duration(), waitTime, defaultDeviation); + Assert.assertTrue(isMissed); - Assert.assertTrue(duration < waitTime); + Assert.assertTrue(durationSample.getDuration() < waitTime, durationSample.toString()); } } diff --git a/src/test/java/tests/usecases/BrowserFactoryTests.java b/src/test/java/tests/usecases/BrowserFactoryTests.java index 3735f42..50d1030 100644 --- a/src/test/java/tests/usecases/BrowserFactoryTests.java +++ b/src/test/java/tests/usecases/BrowserFactoryTests.java @@ -13,6 +13,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.InvalidArgumentException; +import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; @@ -28,6 +29,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collections; import java.util.Comparator; import java.util.stream.Stream; @@ -82,7 +84,7 @@ public void testShouldBePossibleToOverrideDownloadDirectory() throws IOException BrowserManager.getBrowser().goTo(urlXlsSample); File fileDownloaded = new File(downloadDirFactoryInitialized + fileName); - boolean isFileDownloaded = ConditionalWait.waitFor(driver -> fileDownloaded.exists(), "File should be downloaded"); + boolean isFileDownloaded = ConditionalWait.waitFor(driver -> fileDownloaded.exists(), 120, 300, "File should be downloaded", Collections.singleton(StaleElementReferenceException.class)); Assert.assertTrue(isFileDownloaded, "Downloaded file exists"); } diff --git a/src/test/java/tests/usecases/TestTimeoutConfiguration.java b/src/test/java/tests/usecases/TestTimeoutConfiguration.java index 9c52e40..7ddb9d1 100644 --- a/src/test/java/tests/usecases/TestTimeoutConfiguration.java +++ b/src/test/java/tests/usecases/TestTimeoutConfiguration.java @@ -1,31 +1,41 @@ package tests.usecases; +import aquality.selenium.browser.Browser; import aquality.selenium.browser.BrowserManager; +import aquality.selenium.configuration.*; +import aquality.selenium.utils.JsonFile; import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import theinternet.TheInternetPage; public class TestTimeoutConfiguration { - private static final String TIMEOUT_KEY = "timeouts.timeoutCondition"; - - @BeforeMethod - private void before(){ - System.setProperty(TIMEOUT_KEY, "abcdef"); - } - - @AfterMethod - private void after(){ - System.clearProperty(TIMEOUT_KEY); - } @Test public void testNumberFormatExceptionShouldBeThrownIfTimeoutIsNotANumber() { - Assert.assertThrows(NumberFormatException.class, () -> { - BrowserManager.getBrowser().goTo(TheInternetPage.LOGIN.getAddress()); + BrowserManager.setBrowser(new Browser(null, configuration)); }); } + + IConfiguration configuration = new IConfiguration() { + @Override + public IBrowserProfile getBrowserProfile() { + return Configuration.getInstance().getBrowserProfile(); + } + + @Override + public ITimeoutConfiguration getTimeoutConfiguration() { + return new TimeoutConfiguration(new JsonFile("settings.incorrect.json")); + } + + @Override + public IRetryConfiguration getRetryConfiguration() { + return Configuration.getInstance().getRetryConfiguration(); + } + + @Override + public ILoggerConfiguration getLoggerConfiguration() { + return Configuration.getInstance().getLoggerConfiguration(); + } + }; } diff --git a/src/test/java/utils/DurationSample.java b/src/test/java/utils/DurationSample.java new file mode 100644 index 0000000..662b35d --- /dev/null +++ b/src/test/java/utils/DurationSample.java @@ -0,0 +1,37 @@ +package utils; + +public class DurationSample { + + private final double duration; + private final double minLimit; + private final double maxLimit; + private final double deviation; + + public DurationSample(double duration, double minLimit, double maxLimit, double deviation) { + this.duration = duration; + this.minLimit = minLimit; + this.maxLimit = maxLimit; + this.deviation = deviation; + } + + public DurationSample(double duration, double expectedDuration, double deviation) { + this(duration, expectedDuration, expectedDuration, deviation); + } + + public DurationSample(double duration, double expectedDuration) { + this(duration, expectedDuration, expectedDuration, 0); + } + + public boolean isDurationBetweenLimits(){ + return duration >= (minLimit - deviation) && duration <= (maxLimit + deviation); + } + + public double getDuration(){ + return duration; + } + + @Override + public String toString(){ + return String.format("Duration: %1$s\nMin Limit: %2$s\nMax Limit: %3$s\nDeviation: %4$s", duration, minLimit, maxLimit, deviation); + } +} diff --git a/src/test/java/utils/TimeUtil.java b/src/test/java/utils/TimeUtil.java deleted file mode 100644 index 825adea..0000000 --- a/src/test/java/utils/TimeUtil.java +++ /dev/null @@ -1,16 +0,0 @@ -package utils; - -public class TimeUtil { - - public static long getCurrentTime(){ - return System.nanoTime(); - } - - public static double getCurrentTimeInSeconds(){ - return System.nanoTime()/Math.pow(10,9); - } - - public static double calculateDuration(long startTimeNanoSec){ - return (getCurrentTime() - startTimeNanoSec)/Math.pow(10,9); - } -} diff --git a/src/test/java/utils/Timer.java b/src/test/java/utils/Timer.java index 6e196fd..cfad00b 100644 --- a/src/test/java/utils/Timer.java +++ b/src/test/java/utils/Timer.java @@ -1,16 +1,52 @@ package utils; -import static utils.TimeUtil.*; +import java.util.function.Supplier; public class Timer{ private double startTime; + private final Supplier getCurrentTime; + public Timer(){ + getCurrentTime = Timer::getCurrentTimeInSeconds; + } + + public Timer(TimeUnit timeUnit){ + switch (timeUnit){ + case MILLISECONDS: + getCurrentTime = Timer::getCurrentTimeInMilliseconds; + break; + case SECONDS: + getCurrentTime = Timer::getCurrentTimeInSeconds; + break; + default: + throw new IllegalArgumentException("Unknown TimeUnit " + timeUnit); + } + } + + /** + * timer can be started only once + */ public void start(){ if(startTime == 0){ - startTime = getCurrentTimeInSeconds(); + startTime = getCurrentTime.get(); } } - public double stop(){ - return getCurrentTimeInSeconds() - startTime; + /** + * @return duration from the start to current moment + */ + public double duration(){ + return getCurrentTime.get() - startTime; + } + + public enum TimeUnit{ + SECONDS, MILLISECONDS + } + + private static double getCurrentTimeInSeconds(){ + return System.nanoTime()/Math.pow(10,9); + } + + private static double getCurrentTimeInMilliseconds(){ + return System.nanoTime()/Math.pow(10,6); } } \ No newline at end of file diff --git a/src/test/resources/TestSuite.xml b/src/test/resources/TestSuite.xml index 213e913..274fe6a 100644 --- a/src/test/resources/TestSuite.xml +++ b/src/test/resources/TestSuite.xml @@ -10,6 +10,7 @@ + @@ -24,7 +25,6 @@ - diff --git a/src/test/resources/settings.incorrect.json b/src/test/resources/settings.incorrect.json new file mode 100644 index 0000000..1f3b356 --- /dev/null +++ b/src/test/resources/settings.incorrect.json @@ -0,0 +1,71 @@ +{ + "browserName" : "chrome", + "isRemote": true, + "remoteConnectionUrl": "http://qa-auto-nexus:4444/wd/hub", + "isElementHighlightEnabled" : true, + + "driverSettings": { + "chrome": { + "webDriverVersion": "latest", + "capabilities": { + "enableVNC": true + }, + "options": { + "intl.accept_languages": "en", + "safebrowsing.enabled": "true", + "profile.default_content_settings.popups": "0", + "disable-popup-blocking": "true", + "download.prompt_for_download": "false", + "download.default_directory": "//home//selenium//downloads" + }, + "startArguments": [] + }, + "firefox": { + "webDriverVersion": "latest", + "capabilities": { + "enableVNC": true + }, + "options": { + "intl.accept_languages": "en", + "browser.download.dir": "//home//selenium//downloads", + "browser.download.folderList": 2, + "browser.helperApps.neverAsk.saveToDisk": "application/octet-stream, application/x-debian-package, application/x-www-form-urlencod, application/json, application/x-compressed, application/x-zip-compressed, application/zip, multipart/x-zip, text/plain, text/csv", + "browser.helperApps.alwaysAsk.force": false, + "browser.download.manager.alertOnEXEOpen": false, + "browser.download.manager.focusWhenStarting": false, + "browser.download.useDownloadDir": true, + "browser.download.manager.showWhenStarting": false, + "browser.download.manager.closeWhenDone": true, + "browser.download.manager.showAlertOnComplete": false, + "browser.download.manager.useWindow": false, + "browser.download.panel.shown": false + }, + "startArguments": [] + }, + "iexplorer": { + "webDriverVersion": "latest", + "systemArchitecture": "X32", + "capabilities": { + "ignoreProtectedModeSettings": true + } + }, + "safari": { + "downloadDir": "/Users/username/Downloads" + } + }, + "timeouts": { + "timeoutImplicit" : "asd", + "timeoutCondition" : 25, + "timeoutScript" : 10, + "timeoutPageLoad" : 60, + "timeoutPollingInterval": 300, + "timeoutCommand": 120 + }, + "retry": { + "number": 2, + "pollingInterval": 300 + }, + "logger": { + "language": "en" + } +} \ No newline at end of file diff --git a/src/test/resources/settings.json b/src/test/resources/settings.json index eef2087..40d95a5 100644 --- a/src/test/resources/settings.json +++ b/src/test/resources/settings.json @@ -57,7 +57,7 @@ "timeoutImplicit" : 0, "timeoutCondition" : 25, "timeoutScript" : 10, - "timeoutPageLoad" : 30, + "timeoutPageLoad" : 60, "timeoutPollingInterval": 300, "timeoutCommand": 120 },