Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
1278a63
extracted ISettingsFile and added tests
knysh Jan 27, 2020
3cd01b3
Merge branch 'master' into Feature/10-implement-SettingsFile
knysh Jan 27, 2020
1c72731
added documentation for ISettingsFile
knysh Jan 28, 2020
1f0602a
extracted ILoggerConfiguration
knysh Jan 28, 2020
aee9151
extracted ITimeoutConfiguration
knysh Jan 28, 2020
3ede916
extracted IRetryConfiguration
knysh Jan 28, 2020
4e2b14f
renamed one test
knysh Jan 28, 2020
d4ec648
added empty end line and
knysh Jan 28, 2020
5dd1015
renamed constants to upper case
knysh Jan 28, 2020
b7c5b5f
removed redundant method from ISettingsFile
knysh Jan 28, 2020
0e62ec6
Merge remote-tracking branch 'origin/Feature/10-implement-SettingsFil…
knysh Jan 28, 2020
890314e
fixed naming and added empty line at the end of files
knysh Jan 28, 2020
5b47103
Merge branch 'Feature/11-LoggerConfiguration' into Feature/11-Timeout…
knysh Jan 28, 2020
5ad2519
fixed naming and added empty line at the end of files
knysh Jan 28, 2020
fc6cfdb
Merge branch 'Feature/11-TimeoutConfiguration' into Feature/11-IRetry…
knysh Jan 28, 2020
b2f48c8
fixed naming and added empty line at the end of files
knysh Jan 28, 2020
88b025a
Merge branch 'master' into Feature/10-implement-SettingsFile
knysh Jan 29, 2020
4619ac0
merged with master and added test for CustomSettingsFile
knysh Jan 29, 2020
ccac733
fix for the tests
knysh Jan 29, 2020
1abd298
Merge branch 'Feature/10-implement-SettingsFile' into Feature/11-Logg…
knysh Jan 29, 2020
d58605f
merge and small refactoring of tests
knysh Jan 29, 2020
4983e88
Merge branch 'Feature/11-LoggerConfiguration' into Feature/11-Timeout…
knysh Jan 29, 2020
7513559
merge from master
knysh Jan 29, 2020
cd4d3ed
Merge branch 'Feature/11-TimeoutConfiguration' into Feature/11-IRetry…
knysh Jan 29, 2020
a968e5c
merge from master
knysh Jan 29, 2020
792cda2
extracted IElementCacheConfiguration
knysh Jan 30, 2020
adb00be
extracted IConditionalWait
knysh Jan 30, 2020
bd4b4fa
Merge branch 'master' into Feature/11-IRetryConfiguration
knysh Jan 30, 2020
a9ee1f3
merge and test fix
knysh Jan 30, 2020
05b05b5
Merge branch 'Feature/11-IRetryConfiguration' into Feature/6-Conditio…
knysh Jan 30, 2020
8545c56
application to applications
knysh Jan 30, 2020
6266fd3
removed SupportedLanguaged and added default language if configuratio…
knysh Jan 30, 2020
6093c76
support multiple threads in ConditionalWaitTests
knysh Jan 30, 2020
ee3383c
register configuration as singleton
knysh Jan 30, 2020
4244600
fixed comments
knysh Jan 30, 2020
327a682
moved SettingsFileUtil to ISettingsFile
knysh Jan 30, 2020
70c1b01
added IWaitingsModule
knysh Jan 30, 2020
a88af11
small fix in summary
knysh Jan 30, 2020
454cf84
Merge branch 'Feature/11-IRetryConfiguration' into Feature/6-Conditio…
knysh Jan 30, 2020
60f56a4
merge
knysh Jan 30, 2020
7d36c5c
Merge branch 'master' into Feature/6-ConditionalWait
knysh Jan 30, 2020
84365cf
update doc
knysh Jan 30, 2020
0b3e61b
rename applications to application in docs
knysh Jan 30, 2020
c4d26aa
#6 removed using of DI in tests
knysh Jan 31, 2020
4803910
Merge branch 'master' into Feature/6-ConditionalWait
knysh Jan 31, 2020
9e0d607
Merge branch 'master' into Feature/6-ConditionalWait
knysh Jan 31, 2020
7afcfa0
Merge branch 'master' into Feature/6-ConditionalWait
knysh Feb 3, 2020
7452a3e
small fix
knysh Feb 3, 2020
ec3d273
Merge branch 'master' into Feature/6-ConditionalWait
knysh Feb 3, 2020
991d152
merge with master
knysh Feb 3, 2020
dffe9ec
optimized import
knysh Feb 3, 2020
56b874b
fixed tests
knysh Feb 4, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package aquality.selenium.core.application;
package aquality.selenium.core.applications;

import aquality.selenium.core.configurations.*;
import aquality.selenium.core.localization.*;
import aquality.selenium.core.localization.ILocalizationManager;
import aquality.selenium.core.localization.ILocalizationModule;
import aquality.selenium.core.localization.ILocalizedLogger;
import aquality.selenium.core.logging.Logger;
import aquality.selenium.core.utilities.IElementActionRetrier;
import aquality.selenium.core.utilities.ISettingsFile;
import aquality.selenium.core.utilities.IUtilitiesModule;
import aquality.selenium.core.waitings.IConditionalWait;
import aquality.selenium.core.waitings.IWaitingsModule;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.Singleton;
Expand All @@ -14,7 +18,7 @@
* Describes all dependencies which is registered for the project.
*/
public class AqualityModule<T extends IApplication> extends AbstractModule
implements ILocalizationModule, IUtilitiesModule {
implements ILocalizationModule, IUtilitiesModule, IWaitingsModule {

private final Provider<T> applicationProvider;

Expand All @@ -37,5 +41,6 @@ protected void configure() {
bind(IElementActionRetrier.class).to(getElementActionRetrierImplementation()).in(Singleton.class);
bind(ILocalizationManager.class).to(getLocalizationManagerImplementation()).in(Singleton.class);
bind(ILocalizedLogger.class).to(getLocalizedLoggerImplementation()).in(Singleton.class);
bind(IConditionalWait.class).to(getConditionalWaitImplementation());
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package aquality.selenium.core.application;
package aquality.selenium.core.applications;

import com.google.inject.Guice;
import com.google.inject.Injector;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package aquality.selenium.core.application;
package aquality.selenium.core.applications;

import org.openqa.selenium.remote.RemoteWebDriver;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
public interface ILocalizationManager {
/**
* Gets localized message from resources by its key.
*
* @param messageKey Key in resource file.
* @param args Arguments, which will be provided to template of localized message.
* @return Localized message.
Expand Down
112 changes: 112 additions & 0 deletions src/main/java/aquality/selenium/core/waitings/ConditionalWait.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package aquality.selenium.core.waitings;

import aquality.selenium.core.applications.IApplication;
import aquality.selenium.core.configurations.ITimeoutConfiguration;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.BooleanSupplier;

public class ConditionalWait implements IConditionalWait {

private final Provider<IApplication> applicationProvider;
private final ITimeoutConfiguration timeoutConfiguration;

@Inject
public ConditionalWait(Provider<IApplication> applicationProvider, ITimeoutConfiguration timeoutConfiguration) {
this.applicationProvider = applicationProvider;
this.timeoutConfiguration = timeoutConfiguration;
}

@Override
public boolean waitFor(BooleanSupplier condition, Long timeoutInSeconds, Long pollingIntervalInMilliseconds, String message, Collection<Class<? extends Throwable>> exceptionsToIgnore) {
try {
waitForTrue(condition, timeoutInSeconds, pollingIntervalInMilliseconds, message, exceptionsToIgnore);
return true;
} catch (TimeoutException e) {
return false;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please, refactor this as follow:
a. should return void
b. should not catch an exception

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refactored

}
}

@Override
public void waitForTrue(BooleanSupplier condition, Long timeoutInSeconds, Long pollingIntervalInMilliseconds, String message, Collection<Class<? extends Throwable>> exceptionsToIgnore) throws TimeoutException {
BooleanSupplier supplier = Optional.ofNullable(condition).orElseThrow(() -> new IllegalArgumentException("Condition cannot be null"));
Long timeout = resolveConditionTimeout(timeoutInSeconds);
Long pollingInterval = resolvePollingInterval(pollingIntervalInMilliseconds);
String exMessage = resolveMessage(message);
double startTime = getCurrentTime();
while (true) {
if (isConditionSatisfied(supplier, exceptionsToIgnore)) {
return;
}

double currentTime = getCurrentTime();
if ((currentTime - startTime) > timeout) {
String exceptionMessage = String.format("Timed out after %1$s seconds during wait for condition '%2$s'", timeout, exMessage);
throw new TimeoutException(exceptionMessage);
}

try {
Thread.sleep(pollingInterval);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}

@Override
public <T> T waitFor(ExpectedCondition<T> condition, Long timeoutInSeconds, Long pollingIntervalInMilliseconds, String message, Collection<Class<? extends Throwable>> exceptionsToIgnore) {
IApplication app = applicationProvider.get();
app.setImplicitWaitTimeout(0, TimeUnit.SECONDS);
Long timeout = resolveConditionTimeout(timeoutInSeconds);
Long pollingInterval = resolvePollingInterval(pollingIntervalInMilliseconds);
String exMessage = resolveMessage(message);
WebDriverWait wait = new WebDriverWait(app.getDriver(), timeout);
wait.pollingEvery(Duration.ofMillis(pollingInterval));
wait.withMessage(exMessage);
wait.ignoreAll(exceptionsToIgnore == null ? Collections.singleton(StaleElementReferenceException.class) : exceptionsToIgnore);
try {
return wait.until(condition);
} finally {
app.setImplicitWaitTimeout(timeoutConfiguration.getImplicit(), TimeUnit.SECONDS);
}
}

private double getCurrentTime() {
return System.nanoTime() / Math.pow(10, 9);
}

private boolean isConditionSatisfied(BooleanSupplier condition, Collection<Class<? extends Throwable>> exceptionsToIgnore) {
try {
return condition.getAsBoolean();
} catch (Exception e) {
if (exceptionsToIgnore == null || !exceptionsToIgnore.contains(e.getClass())) {
throw e;
}

return false;
}
}

private Long resolveConditionTimeout(Long timeout) {
return Optional.ofNullable(timeout).orElse(timeoutConfiguration.getCommand());
}

private Long resolvePollingInterval(Long timeout) {
return Optional.ofNullable(timeout).orElse(timeoutConfiguration.getPollingInterval());
}

private String resolveMessage(String message) {
return Strings.isNullOrEmpty(message) ? "" : message;
}
}
Loading