Skip to content

Commit 8668269

Browse files
Merge pull request #35 from aquality-automation/breaking/add-visualization
[Feature][Breaking] Visualization
2 parents 23edfa3 + d77141e commit 8668269

File tree

15 files changed

+127
-23
lines changed

15 files changed

+127
-23
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ We use interfaces where is possible, so you can implement your own version of ta
1717

1818
### Quick start
1919

20-
To start the project using Aquality.Selenium framework, you can [download our template BDD project by this link.](https://github.com/aquality-automation/aquality-appium-mobile-java-template)
20+
To start the project using aquality.appium.mobile framework, you can [download our template BDD project by this link.](https://github.com/aquality-automation/aquality-appium-mobile-java-template)
2121

2222
Alternatively, you can follow the steps below:
2323

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.github.aquality-automation</groupId>
88
<artifactId>aquality-appium-mobile</artifactId>
9-
<version>3.1.2</version>
9+
<version>4.0.0</version>
1010

1111
<packaging>jar</packaging>
1212
<name>Aquality Appium Mobile</name>
@@ -172,7 +172,7 @@
172172
<dependency>
173173
<groupId>com.github.aquality-automation</groupId>
174174
<artifactId>aquality-selenium-core</artifactId>
175-
<version>2.0.5</version>
175+
<version>3.0.0</version>
176176
</dependency>
177177

178178
<dependency>

src/main/java/aquality/appium/mobile/configuration/Configuration.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package aquality.appium.mobile.configuration;
22

3-
import aquality.selenium.core.configurations.IElementCacheConfiguration;
4-
import aquality.selenium.core.configurations.ILoggerConfiguration;
5-
import aquality.selenium.core.configurations.IRetryConfiguration;
6-
import aquality.selenium.core.configurations.ITimeoutConfiguration;
3+
import aquality.selenium.core.configurations.*;
74
import com.google.inject.Inject;
85

96
public class Configuration implements IConfiguration {
@@ -14,18 +11,20 @@ public class Configuration implements IConfiguration {
1411
private final ILoggerConfiguration loggerConfiguration;
1512
private final IElementCacheConfiguration elementCacheConfiguration;
1613
private final ITouchActionsConfiguration touchActionsConfiguration;
14+
private final IVisualizationConfiguration visualizationConfiguration;
1715

1816
@Inject
1917
public Configuration(ITimeoutConfiguration timeoutConfiguration, IRetryConfiguration retryConfiguration,
2018
IApplicationProfile applicationProfile, ILoggerConfiguration loggerConfiguration,
2119
IElementCacheConfiguration elementCacheConfiguration,
22-
ITouchActionsConfiguration touchActionsConfiguration) {
20+
ITouchActionsConfiguration touchActionsConfiguration, IVisualizationConfiguration visualizationConfiguration) {
2321
this.timeoutConfiguration = timeoutConfiguration;
2422
this.retryConfiguration = retryConfiguration;
2523
this.applicationProfile = applicationProfile;
2624
this.loggerConfiguration = loggerConfiguration;
2725
this.elementCacheConfiguration = elementCacheConfiguration;
2826
this.touchActionsConfiguration = touchActionsConfiguration;
27+
this.visualizationConfiguration = visualizationConfiguration;
2928
}
3029

3130
@Override
@@ -57,4 +56,9 @@ public IElementCacheConfiguration getElementCacheConfiguration() {
5756
public ITouchActionsConfiguration getTouchActionsConfiguration() {
5857
return touchActionsConfiguration;
5958
}
59+
60+
@Override
61+
public IVisualizationConfiguration getVisualizationConfiguration() {
62+
return visualizationConfiguration;
63+
}
6064
}

src/main/java/aquality/appium/mobile/configuration/IConfiguration.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package aquality.appium.mobile.configuration;
22

3-
import aquality.selenium.core.configurations.IElementCacheConfiguration;
4-
import aquality.selenium.core.configurations.ILoggerConfiguration;
5-
import aquality.selenium.core.configurations.IRetryConfiguration;
6-
import aquality.selenium.core.configurations.ITimeoutConfiguration;
3+
import aquality.selenium.core.configurations.*;
74

5+
/**
6+
* Describes tools configuration.
7+
*/
88
public interface IConfiguration {
99

1010
/**
@@ -48,4 +48,11 @@ public interface IConfiguration {
4848
* @return Configuration of touch actions.
4949
*/
5050
ITouchActionsConfiguration getTouchActionsConfiguration();
51+
52+
/**
53+
* Gets configuration of VisualStateProvider and Dump manager.
54+
*
55+
* @return Visualization configuration.
56+
*/
57+
IVisualizationConfiguration getVisualizationConfiguration();
5158
}

src/main/java/aquality/appium/mobile/elements/Element.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import aquality.selenium.core.localization.ILocalizationManager;
1313
import aquality.selenium.core.localization.ILocalizedLogger;
1414
import aquality.selenium.core.utilities.IElementActionRetrier;
15+
import aquality.selenium.core.visualization.IImageComparator;
1516
import aquality.selenium.core.waitings.IConditionalWait;
1617
import org.openqa.selenium.*;
1718

@@ -45,6 +46,11 @@ protected IElementFinder getElementFinder() {
4546
return AqualityServices.get(IElementFinder.class);
4647
}
4748

49+
@Override
50+
protected IImageComparator getImageComparator() {
51+
return AqualityServices.get(IImageComparator.class);
52+
}
53+
4854
@Override
4955
protected IElementCacheConfiguration getElementCacheConfiguration() {
5056
return AqualityServices.get(IElementCacheConfiguration.class);

src/main/java/aquality/appium/mobile/screens/IScreen.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package aquality.appium.mobile.screens;
22

33
import aquality.selenium.core.elements.interfaces.IElementStateProvider;
4+
import aquality.selenium.core.forms.IForm;
5+
import aquality.selenium.core.visualization.IDumpManager;
46
import org.openqa.selenium.By;
5-
import org.openqa.selenium.Dimension;
67

7-
public interface IScreen {
8+
import java.awt.*;
9+
10+
/**
11+
* Defines interface for any UI form.
12+
*/
13+
public interface IScreen extends IForm {
814
/**
915
* Locator for specified screen
1016
*/
@@ -26,4 +32,13 @@ public interface IScreen {
2632
* @return provider to define element's state
2733
*/
2834
IElementStateProvider state();
35+
36+
37+
/**
38+
* Gets dump manager for the current form that could be used for visualization purposes,
39+
* such as saving and comparing dumps.
40+
*
41+
* @return form's dump manager.
42+
*/
43+
IDumpManager dump();
2944
}
Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,84 @@
11
package aquality.appium.mobile.screens;
22

33
import aquality.appium.mobile.application.AqualityServices;
4+
import aquality.appium.mobile.elements.interfaces.IElement;
45
import aquality.appium.mobile.elements.interfaces.IElementFactory;
5-
import aquality.appium.mobile.elements.interfaces.ILabel;
6+
import aquality.selenium.core.configurations.IVisualizationConfiguration;
67
import aquality.selenium.core.elements.interfaces.IElementStateProvider;
8+
import aquality.selenium.core.forms.Form;
9+
import aquality.selenium.core.localization.ILocalizedLogger;
710
import org.openqa.selenium.By;
8-
import org.openqa.selenium.Dimension;
911

10-
public abstract class Screen implements IScreen {
12+
import java.awt.*;
1113

14+
/**
15+
* Defines base class for any UI form.
16+
*/
17+
public abstract class Screen extends Form<IElement> implements IScreen {
18+
/**
19+
* Locator for specified form
20+
*/
1221
private final By locator;
22+
/**
23+
* Name of specified form
24+
*/
1325
private final String name;
14-
private final ILabel screenLabel;
26+
/**
27+
* Screen element defined by its locator and name.
28+
*/
29+
private final IElement screenElement;
1530

1631
/**
1732
* Constructor with parameters
1833
*/
1934
protected Screen(By locator, String name) {
35+
super(IElement.class);
2036
this.locator = locator;
2137
this.name = name;
22-
this.screenLabel = getElementFactory().getLabel(locator, name);
38+
this.screenElement = getElementFactory().getLabel(locator, name);
2339
}
2440

41+
@Override
2542
public By getLocator() {
2643
return locator;
2744
}
2845

46+
@Override
2947
public String getName() {
3048
return name;
3149
}
3250

51+
@Override
3352
public Dimension getSize() {
34-
return screenLabel.getElement().getSize();
53+
return screenElement.visual().getSize();
3554
}
3655

56+
@Override
3757
public IElementStateProvider state() {
38-
return screenLabel.state();
58+
return screenElement.state();
59+
}
60+
61+
/**
62+
* Gets form element defined by its locator and name.
63+
* Could be used to find child elements relative to form element.
64+
*
65+
* @return form element.
66+
*/
67+
protected IElement getScreenElement() {
68+
return screenElement;
3969
}
4070

4171
protected IElementFactory getElementFactory(){
4272
return AqualityServices.getElementFactory();
4373
}
74+
75+
@Override
76+
protected IVisualizationConfiguration getVisualizationConfiguration() {
77+
return AqualityServices.getConfiguration().getVisualizationConfiguration();
78+
}
79+
80+
@Override
81+
protected ILocalizedLogger getLocalizedLogger() {
82+
return AqualityServices.getLocalizedLogger();
83+
}
4484
}

src/main/resources/settings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,13 @@
5151
"verticalOffset": 0.2,
5252
"horizontalOffset": 0.5
5353
}
54+
},
55+
"visualization": {
56+
"imageExtension": "png",
57+
"maxFullFileNameLength": 255,
58+
"defaultThreshold": 0.012,
59+
"comparisonWidth": 16,
60+
"comparisonHeight": 16,
61+
"pathToDumps": "./src/test/resources/visualDumps/"
5462
}
5563
}

src/test/java/samples/android/nativeapp/AndroidBasicInteractionsTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@ public void testSendKeys() {
6363
Assert.assertEquals(searchScreen.getSearchResult(), query, "Search result don't match to entered query");
6464
}
6565

66+
@Test
67+
public void testSaveAndCompareScreenDump()
68+
{
69+
InvokeSearchScreen searchScreen = ApplicationActivity.SEARCH.open();
70+
Assert.assertTrue(searchScreen.state().isDisplayed(), String.format("%s should be opened", searchScreen.getName()));
71+
final String customDumpName = String.format("my dump of %s", searchScreen.getName());
72+
searchScreen.dump().save(customDumpName);
73+
Assert.assertEquals(searchScreen.dump().compare(customDumpName), 0, "Current screen should have no visual difference comparing to just saved dump");
74+
final String query = "Hello world!";
75+
searchScreen.typeQuery(query);
76+
Assert.assertTrue(searchScreen.dump().compare() > 0, "Current screen after the search should have visual difference comparing to dump saved");
77+
}
78+
6679
@Test
6780
public void testRadioButton() {
6881
ITestRadioButton.super.testRadioButton();

src/test/java/samples/android/nativeapp/apidemos/screens/AndroidScreen.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ protected AndroidScreen(By locator, String name) {
1212
super(locator, name);
1313
}
1414

15-
@SuppressWarnings("unchecked")
1615
protected void startActivity(Activity activity) {
1716
AqualityServices.getLocalizedLogger().info("loc.application.android.activity.start",
1817
activity.getAppActivity(),

0 commit comments

Comments
 (0)