Skip to content

Commit d791910

Browse files
authored
Appium v2.4 Support (#190)
* Appium v2.4 support * Update tests * Cleanup * Resolve comments
1 parent 3eea3b2 commit d791910

File tree

8 files changed

+162
-74
lines changed

8 files changed

+162
-74
lines changed

src/main/java/io/percy/appium/metadata/AndroidMetadata.java

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,37 +46,55 @@ public Integer deviceScreenHeight() {
4646
}
4747

4848
public Integer statBarHeight() {
49-
5049
Integer statBar = getStatusBar();
51-
if (statBar == null && orientation != null && orientation.toLowerCase().equals("auto")) {
52-
statBar = Utils.extractStatusBarHeight(getDisplaySysDump());
53-
}
54-
if (statBar != null) {
55-
return statBar;
50+
if (statBar == null) {
51+
try {
52+
if (orientation != null && orientation.toLowerCase().equals("auto")) {
53+
statBar = Utils.extractStatusBarHeight(getDisplaySysDump());
54+
} else {
55+
statBar = Utils.extractStatusBarHeight(getDisplaySysDumpCache());
56+
}
57+
} catch (Exception e) {
58+
statBar = ((Long) getViewportRect().get("top")).intValue();
59+
}
5660
}
57-
return ((Long) getViewportRect().get("top")).intValue();
61+
62+
return statBar;
5863
}
5964

6065
public Integer navBarHeight() {
6166
Integer navBar = getNavBar();
62-
if (navBar == null && orientation != null && orientation.toLowerCase().equals("auto")) {
63-
navBar = Utils.extractNavigationBarHeight(getDisplaySysDump());
64-
}
65-
if (navBar != null) {
66-
return navBar;
67+
if (navBar == null) {
68+
try {
69+
if (orientation != null && orientation.toLowerCase().equals("auto")) {
70+
navBar = Utils.extractNavigationBarHeight(getDisplaySysDump());
71+
} else {
72+
navBar = Utils.extractNavigationBarHeight(getDisplaySysDumpCache());
73+
}
74+
} catch (Exception e) {
75+
Integer fullDeviceScreenHeight = deviceScreenHeight();
76+
Integer deviceScreenHeight = ((Long) getViewportRect().get("height")).intValue();
77+
navBar = fullDeviceScreenHeight - (deviceScreenHeight + statBarHeight());
78+
}
6779
}
68-
Integer fullDeviceScreenHeight = deviceScreenHeight();
69-
Integer deviceScreenHeight = ((Long) getViewportRect().get("height")).intValue();
70-
return fullDeviceScreenHeight - (deviceScreenHeight + statBarHeight());
80+
81+
return navBar;
7182
}
7283

7384
private Map getViewportRect() {
7485
if (Cache.CACHE_MAP.get("viewportRect_" + sessionId) == null) {
75-
Cache.CACHE_MAP.put("viewportRect_" + sessionId, getSession().get("viewportRect"));
86+
Cache.CACHE_MAP.put("viewportRect_" + sessionId, driver.getCapabilities().getCapability("viewportRect"));
7687
}
7788
return (Map) Cache.CACHE_MAP.get("viewportRect_" + sessionId);
7889
}
7990

91+
private String getDisplaySysDumpCache() {
92+
if (Cache.CACHE_MAP.get("getDisplaySysDump_" + sessionId) == null) {
93+
Cache.CACHE_MAP.put("getDisplaySysDump_" + sessionId, getDisplaySysDump());
94+
}
95+
return (String) Cache.CACHE_MAP.get("getDisplaySysDump_" + sessionId);
96+
}
97+
8098
public Integer scaleFactor() {
8199
return 1;
82100
}

src/main/java/io/percy/appium/metadata/IosMetadata.java

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

33
import java.util.Map;
44

5+
import org.openqa.selenium.Dimension;
6+
57
import io.appium.java_client.AppiumDriver;
68
import io.appium.java_client.ios.IOSDriver;
79
import io.percy.appium.lib.Cache;
@@ -67,7 +69,7 @@ public Integer statBarHeight() {
6769

6870
private Map getViewportRect() {
6971
if (Cache.CACHE_MAP.get("viewportRect_" + sessionId) == null) {
70-
Cache.CACHE_MAP.put("viewportRect_" + sessionId, getSession().get("viewportRect"));
72+
Cache.CACHE_MAP.put("viewportRect_" + sessionId, driver.executeScript("mobile: viewportRect"));
7173
}
7274
return (Map) Cache.CACHE_MAP.get("viewportRect_" + sessionId);
7375
}
@@ -81,7 +83,10 @@ public Integer navBarHeight() {
8183
}
8284

8385
public Integer scaleFactor() {
84-
return Integer.valueOf(getSession().get("pixelRatio").toString());
86+
Dimension windowSize = driver.manage().window().getSize();
87+
int screenWidth = windowSize.getWidth();
88+
int actualWidth = deviceScreenWidth();
89+
return actualWidth / screenWidth;
8590
}
8691

8792

src/main/java/io/percy/appium/metadata/Metadata.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
package io.percy.appium.metadata;
22

3-
import java.util.Map;
4-
5-
import org.openqa.selenium.remote.Response;
6-
import org.openqa.selenium.remote.http.HttpMethod;
7-
83
import io.appium.java_client.AppiumDriver;
9-
import io.percy.appium.lib.Cache;
104

115
public abstract class Metadata {
126
private static AppiumDriver driver;
@@ -59,15 +53,6 @@ public Integer getStatusBar() {
5953
return statusBar;
6054
}
6155

62-
public Map getSession() {
63-
if (Cache.CACHE_MAP.get("getSession_" + sessionId) == null) {
64-
driver.addCommand(HttpMethod.GET, "/session/" + driver.getSessionId(), "getSession");
65-
Response session = driver.execute("getSession");
66-
Cache.CACHE_MAP.put("getSession_" + sessionId, session.getValue());
67-
}
68-
return (Map) Cache.CACHE_MAP.get("getSession_" + sessionId);
69-
}
70-
7156
public abstract Integer deviceScreenWidth();
7257

7358
public abstract String orientation();

src/test/java/io/percy/appium/lib/CacheTest.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import org.junit.rules.ExpectedException;
1111
import org.junit.runner.RunWith;
1212
import org.mockito.Mock;
13-
import org.openqa.selenium.Capabilities;
13+
import org.openqa.selenium.remote.DesiredCapabilities;
1414
import org.openqa.selenium.remote.Response;
1515
import org.openqa.selenium.remote.SessionId;
1616

@@ -24,21 +24,18 @@ public class CacheTest {
2424
@Mock
2525
AndroidDriver driver;
2626

27-
@Mock
28-
Capabilities capabilities;
27+
private DesiredCapabilities capabilities;
2928

3029
HashMap<String, Long> viewportRect = new HashMap<String, Long>();
31-
HashMap<String, HashMap<String, Long>> sessionValue = new HashMap<String, HashMap<String, Long>>();
32-
Response session = new Response(new SessionId("abc"));
3330

3431
@Test
3532
public void testStatBarHeight() {
3633
Cache.CACHE_MAP.clear();
3734
viewportRect.put("top", 100L);
38-
sessionValue.put("viewportRect", viewportRect);
39-
session.setValue(sessionValue);
35+
capabilities = new DesiredCapabilities();
36+
capabilities.setCapability("viewportRect", viewportRect);
37+
when(driver.getCapabilities()).thenReturn(capabilities);
4038
when(driver.getSessionId()).thenReturn(new SessionId("abc"));
41-
when(driver.execute("getSession")).thenReturn(session);
4239
metadata = new AndroidMetadata(driver, null, null, null, null, null);
4340
Assert.assertEquals(metadata.statBarHeight().intValue(), 100);
4441
}

src/test/java/io/percy/appium/metadata/AndroidMetadataTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.mockito.Mock;
1919
import org.openqa.selenium.Capabilities;
2020
import org.openqa.selenium.ScreenOrientation;
21-
import org.openqa.selenium.remote.Response;
2221
import org.openqa.selenium.remote.SessionId;
2322

2423
import com.github.javafaker.Faker;
@@ -38,19 +37,15 @@ public class AndroidMetadataTest {
3837
Long height = faker.number().randomNumber(3, false);
3938

4039
HashMap<String, Long> viewportRect = new HashMap<String, Long>();
41-
HashMap<String, HashMap<String, Long>> sessionValue = new HashMap<String, HashMap<String, Long>>();
42-
Response session = new Response(new SessionId("abc"));
4340

4441
@Before
4542
public void setup() {
4643
viewportRect.put("top", top);
4744
viewportRect.put("height", height);
48-
sessionValue.put("viewportRect", viewportRect);
49-
session.setValue(sessionValue);
5045
when(androidDriver.getSessionId()).thenReturn(new SessionId("abc"));
5146
when(androidDriver.getCapabilities()).thenReturn(capabilities);
52-
when(androidDriver.execute("getSession")).thenReturn(session);
5347
when(capabilities.getCapability("deviceScreenSize")).thenReturn("1080x2160");
48+
when(capabilities.getCapability("viewportRect")).thenReturn(viewportRect);
5449
metadata = new AndroidMetadata(androidDriver, null, null, null, null, null);
5550
}
5651

src/test/java/io/percy/appium/metadata/IosMetadataTest.java

Lines changed: 110 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import static org.mockito.Mockito.when;
77

88
import java.util.HashMap;
9-
import java.util.Map;
9+
import java.util.Set;
1010

1111
import org.junit.After;
1212
import org.junit.Assert;
@@ -16,8 +16,14 @@
1616

1717
import org.mockito.Mock;
1818
import org.openqa.selenium.Capabilities;
19+
import org.openqa.selenium.Cookie;
20+
import org.openqa.selenium.Dimension;
21+
import org.openqa.selenium.Point;
1922
import org.openqa.selenium.ScreenOrientation;
20-
import org.openqa.selenium.remote.Response;
23+
import org.openqa.selenium.WebDriver.Options;
24+
import org.openqa.selenium.WebDriver.Timeouts;
25+
import org.openqa.selenium.WebDriver.Window;
26+
import org.openqa.selenium.logging.Logs;
2127
import org.openqa.selenium.remote.SessionId;
2228

2329
import com.github.javafaker.Faker;
@@ -34,24 +40,18 @@ public class IosMetadataTest {
3440
Capabilities capabilities;
3541

3642
HashMap<String, Long> viewportRect = new HashMap<String, Long>();
37-
HashMap<String, Object> sessionValue = new HashMap<>();
38-
Response session = new Response(new SessionId("abc"));
3943

4044
Faker faker = new Faker();
4145
Long width = faker.number().randomNumber(3, false);
4246
Long top = faker.number().randomNumber(3, false);
4347
Long height = faker.number().randomNumber(3, false);
44-
Long pixelRatio = faker.number().randomNumber(1, false);
4548

4649
@Before
4750
public void setup() {
4851
viewportRect.put("width", width);
4952
viewportRect.put("top", top);
5053
viewportRect.put("height", height);
51-
sessionValue.put("viewportRect", viewportRect);
52-
sessionValue.put("pixelRatio", pixelRatio);
53-
session.setValue(sessionValue);
54-
when(driver.execute("getSession")).thenReturn(session);
54+
when(driver.executeScript("mobile: viewportRect")).thenReturn(viewportRect);
5555
when(driver.getCapabilities()).thenReturn(capabilities);
5656
when(driver.getSessionId()).thenReturn(new SessionId("abc"));
5757
metadata = new IosMetadata(driver, null, null, null, null, null);
@@ -173,8 +173,106 @@ public void testOrientatioAuto() {
173173
@Test
174174
public void testScaleFactor() {
175175
Cache.CACHE_MAP.clear();
176-
Map details = new HashMap<>();
177-
details.put("pixelRatio", 2);
178-
Assert.assertEquals(metadata.scaleFactor().intValue(), pixelRatio.intValue());
176+
when(driver.manage()).thenReturn(new Options() {
177+
178+
@Override
179+
public void addCookie(Cookie cookie) {
180+
// TODO Auto-generated method stub
181+
throw new UnsupportedOperationException("Unimplemented method 'addCookie'");
182+
}
183+
184+
@Override
185+
public void deleteCookieNamed(String name) {
186+
// TODO Auto-generated method stub
187+
throw new UnsupportedOperationException("Unimplemented method 'deleteCookieNamed'");
188+
}
189+
190+
@Override
191+
public void deleteCookie(Cookie cookie) {
192+
// TODO Auto-generated method stub
193+
throw new UnsupportedOperationException("Unimplemented method 'deleteCookie'");
194+
}
195+
196+
@Override
197+
public void deleteAllCookies() {
198+
// TODO Auto-generated method stub
199+
throw new UnsupportedOperationException("Unimplemented method 'deleteAllCookies'");
200+
}
201+
202+
@Override
203+
public Set<Cookie> getCookies() {
204+
// TODO Auto-generated method stub
205+
throw new UnsupportedOperationException("Unimplemented method 'getCookies'");
206+
}
207+
208+
@Override
209+
public Cookie getCookieNamed(String name) {
210+
// TODO Auto-generated method stub
211+
throw new UnsupportedOperationException("Unimplemented method 'getCookieNamed'");
212+
}
213+
214+
@Override
215+
public Timeouts timeouts() {
216+
// TODO Auto-generated method stub
217+
throw new UnsupportedOperationException("Unimplemented method 'timeouts'");
218+
}
219+
220+
@Override
221+
public Window window() {
222+
// TODO Auto-generated method stub
223+
return new Window() {
224+
225+
@Override
226+
public Dimension getSize() {
227+
return new Dimension(width.intValue(), height.intValue());
228+
}
229+
230+
@Override
231+
public void setSize(Dimension targetSize) {
232+
// TODO Auto-generated method stub
233+
throw new UnsupportedOperationException("Unimplemented method 'setSize'");
234+
}
235+
236+
@Override
237+
public Point getPosition() {
238+
// TODO Auto-generated method stub
239+
throw new UnsupportedOperationException("Unimplemented method 'getPosition'");
240+
}
241+
242+
@Override
243+
public void setPosition(Point targetPosition) {
244+
// TODO Auto-generated method stub
245+
throw new UnsupportedOperationException("Unimplemented method 'setPosition'");
246+
}
247+
248+
@Override
249+
public void maximize() {
250+
// TODO Auto-generated method stub
251+
throw new UnsupportedOperationException("Unimplemented method 'maximize'");
252+
}
253+
254+
@Override
255+
public void minimize() {
256+
// TODO Auto-generated method stub
257+
throw new UnsupportedOperationException("Unimplemented method 'minimize'");
258+
}
259+
260+
@Override
261+
public void fullscreen() {
262+
// TODO Auto-generated method stub
263+
throw new UnsupportedOperationException("Unimplemented method 'fullscreen'");
264+
}
265+
266+
};
267+
}
268+
269+
@Override
270+
public Logs logs() {
271+
// TODO Auto-generated method stub
272+
throw new UnsupportedOperationException("Unimplemented method 'logs'");
273+
}
274+
});
275+
when(capabilities.getCapability("deviceName")).thenReturn("iphone 12 pro");
276+
Assert.assertEquals(metadata.scaleFactor().intValue(), 1);
179277
}
180278
}

src/test/java/io/percy/appium/providers/AppAutomateTest.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
import org.mockito.Mockito;
1616
import org.mockito.MockedStatic;
1717
import org.openqa.selenium.Capabilities;
18-
import org.openqa.selenium.OutputType;
19-
import org.openqa.selenium.remote.Response;
2018
import org.openqa.selenium.remote.SessionId;
2119

2220
import com.github.javafaker.Faker;
@@ -43,8 +41,6 @@ public class AppAutomateTest {
4341

4442
HashMap<String, String> bstackCaps = new HashMap<String, String>();
4543
HashMap<String, Long> viewportRect = new HashMap<String, Long>();
46-
HashMap<String, HashMap<String, Long>> sessionValue = new HashMap<String, HashMap<String, Long>>();
47-
Response session = new Response(new SessionId("abc"));
4844

4945
Faker faker = new Faker();
5046
Long top = faker.number().randomNumber(3, false);
@@ -55,16 +51,14 @@ public class AppAutomateTest {
5551
@Before
5652
public void setup() {
5753
Cache.CACHE_MAP.clear();
54+
viewportRect.put("top", top);
55+
viewportRect.put("height", height);
5856
appAutomate = new AppAutomate(androidDriver);
5957
when(androidDriver.getCapabilities()).thenReturn(capabilities);
6058
when(capabilities.getCapability("deviceScreenSize")).thenReturn("1080x2160");
6159
when(androidDriver.getSessionId()).thenReturn(new SessionId("abc"));
62-
viewportRect.put("top", top);
63-
viewportRect.put("height", height);
64-
sessionValue.put("viewportRect", viewportRect);
65-
session.setValue(sessionValue);
66-
when(androidDriver.execute("getSession")).thenReturn(session);
67-
}
60+
when(capabilities.getCapability("viewportRect")).thenReturn(viewportRect);
61+
}
6862

6963
@Test
7064
public void testGetDebugUrl() {

0 commit comments

Comments
 (0)