Skip to content

Commit e1039a4

Browse files
committed
Implement VisualStateProvider and tests for it
Add draft for VisualConfiguration and settings for it, add it to DI module Add localization values for logger moved ILogElementState to logging package
1 parent f5f6278 commit e1039a4

27 files changed

+500
-47
lines changed

src/main/java/aquality/selenium/core/applications/AqualityModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ protected void configure() {
4545
bind(ITimeoutConfiguration.class).to(getTimeoutConfigurationImplementation()).in(Singleton.class);
4646
bind(IRetryConfiguration.class).to(getRetryConfigurationImplementation()).in(Singleton.class);
4747
bind(IElementCacheConfiguration.class).to(getElementCacheConfigurationImplementation()).in(Singleton.class);
48+
bind(IVisualConfiguration.class).to(getVisualConfigurationImplementation()).in(Singleton.class);
4849
bind(IElementActionRetrier.class).to(getElementActionRetrierImplementation()).in(Singleton.class);
4950
bind(IActionRetrier.class).to(getActionRetrierImplementation()).in(Singleton.class);
5051
bind(ILocalizationManager.class).to(getLocalizationManagerImplementation()).in(Singleton.class);

src/main/java/aquality/selenium/core/configurations/IConfigurationsModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
* Describes implementations of configurations to be registered in DI container.
55
*/
66
public interface IConfigurationsModule {
7+
/**
8+
* @return class which implements {@link IVisualConfiguration}
9+
*/
10+
default Class<? extends IVisualConfiguration> getVisualConfigurationImplementation() {
11+
return VisualConfiguration.class;
12+
}
13+
714
/**
815
* @return class which implements {@link IElementCacheConfiguration}
916
*/
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package aquality.selenium.core.configurations;
2+
3+
/**
4+
* Represents visualization configuration, used for image comparison.
5+
*/
6+
public interface IVisualConfiguration {
7+
/**
8+
* Image format for comparison.
9+
* @return image format.
10+
*/
11+
String getImageFormat();
12+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package aquality.selenium.core.configurations;
2+
3+
import aquality.selenium.core.utilities.ISettingsFile;
4+
import com.google.inject.Inject;
5+
6+
import javax.imageio.ImageIO;
7+
import java.util.Arrays;
8+
9+
/**
10+
* Represents visualization configuration, used for image comparison.
11+
* Uses {@link ISettingsFile} as source for configuration values.
12+
*/
13+
public class VisualConfiguration implements IVisualConfiguration {
14+
private String imageFormat;
15+
private final ISettingsFile settingsFile;
16+
17+
/**
18+
* Instantiates class using {@link ISettingsFile} with visualization settings.
19+
* @param settingsFile settings file.
20+
*/
21+
@Inject
22+
public VisualConfiguration(ISettingsFile settingsFile) {
23+
this.settingsFile = settingsFile;
24+
}
25+
26+
@Override
27+
public String getImageFormat() {
28+
if (imageFormat == null) {
29+
String[] supportedFormats = ImageIO.getWriterFormatNames();
30+
String valueFromConfig = settingsFile.getValueOrDefault("/visualization/imageExtension", "png").toString();
31+
String actualFormat = valueFromConfig.startsWith(".") ? valueFromConfig.substring(1) : valueFromConfig;
32+
if (Arrays.stream(supportedFormats).noneMatch(format -> format.equals(actualFormat))) {
33+
throw new IllegalArgumentException(String.format(
34+
"Format [%s] is not supported by current JRE. Supported formats: %s", actualFormat, Arrays.toString(supportedFormats)));
35+
}
36+
imageFormat = actualFormat;
37+
}
38+
return imageFormat;
39+
}
40+
}

src/main/java/aquality/selenium/core/elements/CachedElementStateProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package aquality.selenium.core.elements;
22

33
import aquality.selenium.core.elements.interfaces.IElementCacheHandler;
4-
import aquality.selenium.core.elements.interfaces.ILogElementState;
4+
import aquality.selenium.core.logging.ILogElementState;
55
import aquality.selenium.core.waitings.IConditionalWait;
66
import org.openqa.selenium.By;
77
import org.openqa.selenium.NoSuchElementException;

src/main/java/aquality/selenium/core/elements/DefaultElementStateProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package aquality.selenium.core.elements;
22

33
import aquality.selenium.core.elements.interfaces.IElementFinder;
4-
import aquality.selenium.core.elements.interfaces.ILogElementState;
4+
import aquality.selenium.core.logging.ILogElementState;
55
import aquality.selenium.core.waitings.IConditionalWait;
66
import org.openqa.selenium.By;
77

src/main/java/aquality/selenium/core/elements/Element.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66
import aquality.selenium.core.elements.interfaces.*;
77
import aquality.selenium.core.localization.ILocalizationManager;
88
import aquality.selenium.core.localization.ILocalizedLogger;
9+
import aquality.selenium.core.logging.ILogElementState;
10+
import aquality.selenium.core.logging.ILogVisualState;
911
import aquality.selenium.core.logging.Logger;
1012
import aquality.selenium.core.utilities.IElementActionRetrier;
13+
import aquality.selenium.core.visualization.IImageComparator;
14+
import aquality.selenium.core.visualization.IVisualStateProvider;
15+
import aquality.selenium.core.visualization.VisualStateProvider;
1116
import aquality.selenium.core.waitings.IConditionalWait;
1217
import org.openqa.selenium.By;
1318
import org.openqa.selenium.NoSuchElementException;
@@ -37,6 +42,8 @@ protected Element(final By loc, final String name, final ElementState state) {
3742

3843
protected abstract IElementFinder getElementFinder();
3944

45+
protected abstract IImageComparator getImageComparator();
46+
4047
protected abstract IElementCacheConfiguration getElementCacheConfiguration();
4148

4249
protected abstract IElementActionRetrier getElementActionRetrier();
@@ -70,6 +77,10 @@ protected ILogElementState logElementState() {
7077
getLocalizationManager().getLocalizedMessage(stateKey)));
7178
}
7279

80+
protected ILogVisualState logVisualState() {
81+
return this::logElementAction;
82+
}
83+
7384
@Override
7485
public By getLocator() {
7586
return locator;
@@ -87,6 +98,11 @@ public IElementStateProvider state() {
8798
: new DefaultElementStateProvider(locator, getConditionalWait(), getElementFinder(), logElementState());
8899
}
89100

101+
@Override
102+
public IVisualStateProvider visual() {
103+
return new VisualStateProvider(getImageComparator(), getElementActionRetrier(), this::getElement, logVisualState());
104+
}
105+
90106
@Override
91107
public RemoteWebElement getElement(Duration timeout) {
92108
try {

src/main/java/aquality/selenium/core/elements/ElementStateProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package aquality.selenium.core.elements;
22

33
import aquality.selenium.core.elements.interfaces.IElementStateProvider;
4-
import aquality.selenium.core.elements.interfaces.ILogElementState;
4+
import aquality.selenium.core.logging.ILogElementState;
55
import org.openqa.selenium.WebElement;
66

77
public abstract class ElementStateProvider implements IElementStateProvider {

src/main/java/aquality/selenium/core/elements/interfaces/IElement.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package aquality.selenium.core.elements.interfaces;
22

3+
import aquality.selenium.core.visualization.IVisualStateProvider;
34
import org.openqa.selenium.By;
45
import org.openqa.selenium.remote.RemoteWebElement;
56

@@ -27,6 +28,12 @@ public interface IElement extends IParent {
2728
*/
2829
IElementStateProvider state();
2930

31+
/**
32+
* Gets element visual state.
33+
* @return provider to define element's visual state.
34+
*/
35+
IVisualStateProvider visual();
36+
3037
/**
3138
* Gets current element by specified {@link #getLocator()}
3239
* Default timeout is provided in {@link aquality.selenium.core.configurations.ITimeoutConfiguration}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package aquality.selenium.core.elements.interfaces;
1+
package aquality.selenium.core.logging;
22

33
/**
44
* Describes interface that can log element state.

0 commit comments

Comments
 (0)