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
},