Skip to content

Commit 11439b1

Browse files
committed
Merge branch 'master' into GridAlignment
# Conflicts: # src/main/java/net/itarray/automotion/internal/ResponsiveUIChunkValidatorBase.java # src/main/java/net/itarray/automotion/internal/UIValidatorBase.java
2 parents a12db2a + 82de68e commit 11439b1

File tree

11 files changed

+119
-52
lines changed

11 files changed

+119
-52
lines changed

pom.xml

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

77
<groupId>net.itarray</groupId>
88
<artifactId>automotion</artifactId>
9-
<version>2.0.4</version>
9+
<version>2.0.6</version>
1010
<name>Automotion</name>
1111
<description>Library for smart visual automation testing</description>
1212
<url>https://automotion.itarray.net</url>
@@ -143,27 +143,27 @@
143143
<dependency>
144144
<groupId>org.seleniumhq.selenium</groupId>
145145
<artifactId>selenium-java</artifactId>
146-
<version>3.5.3</version>
146+
<version>3.7.1</version>
147147
</dependency>
148148
<dependency>
149149
<groupId>org.seleniumhq.selenium</groupId>
150150
<artifactId>selenium-server</artifactId>
151-
<version>3.5.3</version>
151+
<version>3.7.1</version>
152152
</dependency>
153153
<dependency>
154154
<groupId>org.seleniumhq.selenium</groupId>
155155
<artifactId>selenium-remote-driver</artifactId>
156-
<version>3.5.3</version>
156+
<version>3.7.1</version>
157157
</dependency>
158158
<dependency>
159159
<groupId>io.appium</groupId>
160160
<artifactId>java-client</artifactId>
161-
<version>5.0.2</version>
161+
<version>5.0.4</version>
162162
</dependency>
163163
<dependency>
164164
<groupId>com.google.guava</groupId>
165165
<artifactId>guava</artifactId>
166-
<version>23.0</version>
166+
<version>23.5-jre</version>
167167
</dependency>
168168
<dependency>
169169
<groupId>org.apache.httpcomponents</groupId>
@@ -222,7 +222,7 @@
222222
<dependency>
223223
<groupId>com.webfirmframework</groupId>
224224
<artifactId>wffweb</artifactId>
225-
<version>2.1.12</version>
225+
<version>2.1.13</version>
226226
</dependency>
227227
<dependency>
228228
<groupId>org.assertj</groupId>

src/main/java/net/itarray/automotion/internal/DriverFacade.java

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.itarray.automotion.internal;
22

33
import io.appium.java_client.AppiumDriver;
4+
import io.appium.java_client.android.AndroidDriver;
5+
import io.appium.java_client.ios.IOSDriver;
46
import org.openqa.selenium.*;
57
import org.openqa.selenium.remote.RemoteWebDriver;
68

@@ -33,6 +35,22 @@ public void takeScreenshot(File file) {
3335
}
3436
}
3537

38+
public WebDriver getDriver() {
39+
return driver;
40+
}
41+
42+
public boolean isAppiumAndroidContext() {
43+
return driver instanceof AndroidDriver;
44+
}
45+
46+
public boolean isAppiumIOSContext() {
47+
return driver instanceof IOSDriver;
48+
}
49+
50+
public boolean isAppiumContext() {
51+
return driver instanceof AppiumDriver;
52+
}
53+
3654
public boolean isAppiumWebContext() {
3755
if (!(driver instanceof AppiumDriver)) {
3856
return false;
@@ -52,11 +70,15 @@ public Object executeScript(String script) {
5270
}
5371

5472
public String getZoom() {
55-
String zoom = (String) executeScript(getZoomScript());
56-
if (zoom == null || zoom.equals("")) {
57-
zoom = "100%";
73+
if (!isAppiumContext()) {
74+
String zoom = (String) executeScript(getZoomScript());
75+
if (zoom == null || zoom.equals("")) {
76+
zoom = "100%";
77+
}
78+
return zoom;
79+
} else {
80+
return "100%";
5881
}
59-
return zoom;
6082
}
6183

6284
private String getZoomScript() {
@@ -68,14 +90,14 @@ private String getZoomScript() {
6890
}
6991

7092
private long retrievePageHeight() {
71-
if (!isMobile()) {
93+
if (!isAppiumContext()) {
7294
if (getZoom().equals("100%")) {
73-
return (long) executeScript("if (self.innerHeight) {return self.innerHeight;} if (document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}if (document.body) {return document.body.clientHeight;}");
95+
return (long) executeScript("if (window.innerHeight) {return window.innerHeight;} if (document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}if (document.body) {return document.body.clientHeight;}");
7496
} else {
7597
return (long) executeScript("return document.getElementsByTagName('body')[0].offsetHeight");
7698
}
7799
} else {
78-
if (isAppiumNativeMobileContext() || isIOS()) {
100+
if (isAppiumNativeMobileContext() || isAppiumIOSContext()) {
79101
return driver.manage().window().getSize().getHeight();
80102
} else {
81103
return (long) executeScript("if (self.innerHeight) {return self.innerHeight;} if (document.documentElement && document.documentElement.clientHeight) {return document.documentElement.clientHeight;}if (document.body) {return document.body.clientHeight;}");
@@ -84,18 +106,18 @@ private long retrievePageHeight() {
84106
}
85107

86108
private long retrievePageWidth() {
87-
if (!isMobile()) {
109+
if (!isAppiumContext()) {
88110
if (getZoom().equals("100%")) {
89-
String script = "if (self.innerWidth) {return self.innerWidth;} if (document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}if (document.body) {return document.body.clientWidth;}";
111+
String script = "if (window.innerWidth) {return window.innerWidth;} if (document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}if (document.body) {return document.body.clientWidth;}";
90112
return (long) executeScript(script);
91113
} else {
92114
return (long) executeScript("return document.getElementsByTagName('body')[0].offsetWidth");
93115
}
94116
} else {
95-
if (isAppiumNativeMobileContext() || isIOS()) {
117+
if (isAppiumNativeMobileContext() || isAppiumIOSContext()) {
96118
return driver.manage().window().getSize().getWidth();
97119
} else {
98-
return (long) executeScript("if (self.innerWidth) {return self.innerWidth;} if (document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}if (document.body) {return document.body.clientWidth;}");
120+
return (long) executeScript("if (self.innerWidth) {return self.outerWidth;} if (document.documentElement && document.documentElement.clientWidth) {return document.documentElement.clientWidth;}if (document.body) {return document.body.clientWidth;}");
99121
}
100122
}
101123
}
@@ -110,7 +132,7 @@ public void setResolution(Dimension resolution) {
110132
}
111133

112134
public Dimension getResolution() {
113-
if (isMobile() && getApp() == null) {
135+
if (isAppiumContext() && getApp() == null) {
114136
String resolution = ((RemoteWebDriver) driver).getCapabilities().getCapability("deviceScreenSize").toString();
115137
int width = Integer.parseInt(resolution.split("x")[0]);
116138
int height = Integer.parseInt(resolution.split("x")[1]);
@@ -122,14 +144,16 @@ public Dimension getResolution() {
122144
}
123145

124146
public void setZoom(int percentage) {
125-
if (percentage <= 0) {
126-
throw new IllegalArgumentException(String.format("illegal zoom percentage %s - should be greater than zero", percentage));
127-
}
128-
JavascriptExecutor jse = (JavascriptExecutor) driver;
129-
if (isFirefox()) {
130-
jse.executeScript("document.body.style.MozTransform = 'scale(" + (percentage / 100f) + ")';");
131-
} else {
132-
jse.executeScript("document.body.style.zoom = '" + percentage + "%'");
147+
if (!isAppiumContext()) {
148+
if (percentage <= 0) {
149+
throw new IllegalArgumentException(String.format("illegal zoom percentage %s - should be greater than zero", percentage));
150+
}
151+
JavascriptExecutor jse = (JavascriptExecutor) driver;
152+
if (isFirefox()) {
153+
jse.executeScript("document.body.style.MozTransform = 'scale(" + (percentage / 100f) + ")';");
154+
} else {
155+
jse.executeScript("document.body.style.zoom = '" + percentage + "%'");
156+
}
133157
}
134158

135159
}

src/main/java/net/itarray/automotion/internal/HtmlReportBuilder.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.webfirmframework.wffweb.tag.html.*;
44
import com.webfirmframework.wffweb.tag.html.attribute.Alt;
55
import com.webfirmframework.wffweb.tag.html.attribute.Src;
6+
import com.webfirmframework.wffweb.tag.html.attribute.event.mouse.OnMouseOut;
7+
import com.webfirmframework.wffweb.tag.html.attribute.event.mouse.OnMouseOver;
8+
import com.webfirmframework.wffweb.tag.html.attribute.global.ClassAttribute;
9+
import com.webfirmframework.wffweb.tag.html.attribute.global.Id;
610
import com.webfirmframework.wffweb.tag.html.attribute.global.Style;
711
import com.webfirmframework.wffweb.tag.html.images.Img;
812
import com.webfirmframework.wffweb.tag.html.lists.Li;
@@ -30,6 +34,7 @@
3034
public class HtmlReportBuilder {
3135

3236
private List<String> jsonFiles;
37+
private Object screenshotDrawingOverlay;
3338

3439
public void buildReport(String reportName, List<String> jsonFiles) {
3540
this.jsonFiles = jsonFiles;
@@ -108,17 +113,26 @@ private Html buildHtml() throws IOException, ParseException {
108113
new Style("color: rgb(105,105,105)")) {{
109114
new NoTag(this, String.format("Time execution: %s", jsonObject.get(TIME_EXECUTION)));
110115
}};
116+
117+
new H5(this,
118+
new Style("color: #4d4d4d")) {{
119+
new NoTag(this, "Hover over the image to see the results");
120+
}};
111121
new P(this) {{
112-
new Div(this,
122+
screenshotDrawingOverlay = jsonObject.get(DRAWINGS);
123+
new Div(this,
124+
new OnMouseOver("document.getElementById('" + screenshotDrawingOverlay.toString()+ "').style.display = 'block'"),
125+
new OnMouseOut("document.getElementById('" + screenshotDrawingOverlay.toString()+ "').style.display = 'none'"),
113126
new Style("position:relative; left: 0; top:0; width: 96%; margin-left:2%")) {{
114127
new Img(this,
115128
new Style("position:relative; left: 0; top:0"),
116129
new Src(String.format("img/%s", jsonObject.get(SCREENSHOT))),
117130
new Alt("screenshot"));
118131
new Img(this,
119-
new Style("position:absolute; left: 0; top:0"),
120-
new Src(String.format("img/%s", jsonObject.get(DRAWINGS))),
121-
new Alt("screenshot"));
132+
new Id(screenshotDrawingOverlay.toString()),
133+
new Style("position:absolute; left: 0; top:0; display:none;"),
134+
new Src(String.format("img/%s", screenshotDrawingOverlay)),
135+
new Alt("screenshot-overlay"));
122136
}};
123137

124138
}};

src/main/java/net/itarray/automotion/internal/ResponsiveUIChunkValidatorBase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.itarray.automotion.validation.UISnapshot;
88
import net.itarray.automotion.validation.Units;
99
import org.json.simple.JSONObject;
10+
import org.openqa.selenium.JavascriptExecutor;
1011
import org.openqa.selenium.WebElement;
1112
import util.validator.ResponsiveUIValidator;
1213

@@ -29,6 +30,14 @@ public ResponsiveUIChunkValidatorBase(UISnapshot snapshot, List<WebElement> webE
2930
if (!allowEmpty && webElements.isEmpty()) {
3031
String message = "Set root web element";
3132
addError(message);
33+
} else {
34+
if (!getDriver().isAppiumContext()) {
35+
try {
36+
((JavascriptExecutor) getDriver().getDriver()).executeScript("arguments[0].scrollIntoView();", webElements.get(0));
37+
((JavascriptExecutor) getDriver().getDriver()).executeScript("javascript:window.scrollBy(0,250);");
38+
((JavascriptExecutor) getDriver().getDriver()).executeScript("document.documentElement.style.overflow = 'hidden'");
39+
} catch (Exception e) {}
40+
}
3241
}
3342
}
3443

src/main/java/net/itarray/automotion/internal/ResponsiveUIValidatorBase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ private SimpleTransform getTransform() {
112112

113113
private double getScaleFactor() {
114114
double factor;
115-
if (isMobile()) {
115+
if (getDriver().isAppiumContext()) {
116116
factor = getReport().getRetinaScaleFactor();
117117
} else {
118118
factor = zoomFactor;
@@ -124,8 +124,8 @@ private double getScaleFactor() {
124124
}
125125

126126
private int getYOffset() {
127-
if (isMobile() && getDriver().isAppiumWebContext() && getReport().isMobileTopBarOffsetState()) {
128-
if (isIOS() || isAndroid()) {
127+
if (getDriver().isAppiumContext() && getDriver().isAppiumWebContext() && getReport().isMobileTopBarOffsetState()) {
128+
if (getDriver().isAppiumAndroidContext() || getDriver().isAppiumIOSContext()) {
129129
return (int) getReport().getMobileTopBarOffsetState();
130130
}
131131
}

src/main/java/net/itarray/automotion/internal/UIValidatorBase.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
import net.itarray.automotion.internal.geometry.Rectangle;
55
import net.itarray.automotion.internal.geometry.Scalar;
66
import net.itarray.automotion.internal.properties.Context;
7-
import net.itarray.automotion.validation.properties.Expression;
87
import net.itarray.automotion.internal.properties.PixelConstant;
98
import net.itarray.automotion.validation.UIElementValidator;
109
import net.itarray.automotion.validation.UISnapshot;
1110
import net.itarray.automotion.validation.Units;
1211
import net.itarray.automotion.validation.properties.Condition;
12+
import net.itarray.automotion.validation.properties.Expression;
1313
import net.itarray.automotion.validation.properties.Padding;
1414
import org.json.simple.JSONObject;
15+
import org.openqa.selenium.JavascriptExecutor;
1516
import org.openqa.selenium.WebElement;
1617

1718
import java.util.List;
@@ -21,7 +22,13 @@
2122
import static net.itarray.automotion.validation.properties.Expression.percentOrPixels;
2223
import static net.itarray.automotion.validation.Constants.*;
2324
import static net.itarray.automotion.validation.properties.Condition.*;
25+
import static net.itarray.automotion.internal.UIElement.asElement;
26+
import static net.itarray.automotion.internal.UIElement.asElements;
2427
import static net.itarray.automotion.internal.properties.PercentReference.PAGE;
28+
import static net.itarray.automotion.validation.Constants.*;
29+
import static net.itarray.automotion.validation.properties.Condition.greaterOrEqualTo;
30+
import static net.itarray.automotion.validation.properties.Condition.lessOrEqualTo;
31+
import static net.itarray.automotion.validation.properties.Expression.percentOrPixels;
2532

2633
public class UIValidatorBase extends ResponsiveUIValidatorBase implements UIElementValidator {
2734

@@ -34,6 +41,13 @@ public class UIValidatorBase extends ResponsiveUIValidatorBase implements UIElem
3441
public UIValidatorBase(UISnapshot snapshot, WebElement webElement, String readableNameOfElement) {
3542
super(snapshot);
3643
this.rootElement = asElement(webElement, readableNameOfElement);
44+
if (!getDriver().isAppiumContext()) {
45+
try {
46+
((JavascriptExecutor) getDriver().getDriver()).executeScript("arguments[0].scrollIntoView();", webElement);
47+
((JavascriptExecutor) getDriver().getDriver()).executeScript("javascript:window.scrollBy(0,250);");
48+
((JavascriptExecutor) getDriver().getDriver()).executeScript("document.documentElement.style.overflow = 'hidden'");
49+
} catch (Exception e) {}
50+
}
3751
}
3852

3953
@Override

src/main/java/net/itarray/automotion/tools/general/SystemHelper.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.itarray.automotion.tools.general;
22

3+
import javafx.stage.Screen;
4+
35
import java.awt.*;
46
import java.io.File;
57
import java.lang.reflect.Field;
@@ -28,14 +30,22 @@ public static boolean isRetinaDisplay() {
2830
}
2931
}
3032
} catch (Exception e) {
31-
e.printStackTrace();
33+
isRetina = getDisplayScaleFactor() > 140;
3234
}
3335
} catch (Exception e) {
34-
e.printStackTrace();
36+
isRetina = getDisplayScaleFactor() > 140;
3537
}
3638
return isRetina;
3739
}
3840

41+
private static double getDisplayScaleFactor() {
42+
double screenHeight = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
43+
double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
44+
int screenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
45+
46+
return screenResolution;
47+
}
48+
3949
/**
4050
* Convert hex color to rgb or rgba
4151
*

src/main/java/net/itarray/automotion/validation/UISnapshot.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
import java.io.File;
1111
import java.util.List;
1212

13-
import static net.itarray.automotion.tools.environment.EnvironmentFactory.isMobile;
14-
1513
public class UISnapshot {
1614

1715
private final ResponsiveUIValidator responsiveUIValidator;
@@ -25,7 +23,7 @@ public UISnapshot(ResponsiveUIValidator responsiveUIValidator, String name, Reso
2523
this.name = name;
2624
this.resolution = resolution.queryIfUnknown(responsiveUIValidator.driver);
2725
this.zoom = zoom.queryIfUnknown(responsiveUIValidator.driver);
28-
if (!isMobile()) {
26+
if (!responsiveUIValidator.getDriver().isAppiumContext()) {
2927
resolution.applyTo(responsiveUIValidator.driver);
3028
zoom.applyTo(responsiveUIValidator.driver);
3129
}

src/test/java/ResponsiveValidatorCompatibleTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import http.helpers.EnvironmentHelper;
1+
import net.itarray.automotion.tools.driver.DriverHelper;
2+
import net.itarray.automotion.tools.driver.WebDriverFactory;
3+
import net.itarray.automotion.tools.helpers.EnvironmentHelper;
24
import net.itarray.automotion.validation.ResponsiveUIValidator;
35
import net.itarray.automotion.validation.properties.Padding;
46
import org.assertj.core.api.SoftAssertions;
@@ -9,8 +11,6 @@
911
import org.openqa.selenium.WebDriver;
1012
import org.openqa.selenium.WebElement;
1113
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
12-
import util.driver.DriverHelper;
13-
import util.driver.WebDriverFactory;
1414

1515
import java.awt.*;
1616
import java.util.HashMap;

0 commit comments

Comments
 (0)