Skip to content
This repository was archived by the owner on Dec 7, 2020. It is now read-only.

Commit 2b4af66

Browse files
author
Severi Haverila
committed
code refactoring
1 parent 8499f53 commit 2b4af66

File tree

2 files changed

+49
-52
lines changed

2 files changed

+49
-52
lines changed

src/main/java/TestdroidImageRecognition.java

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,25 @@ public void setQueryImageFolder() {
4747

4848
public Point[] findImageOnScreen(String image) throws Exception {
4949
ImageRecognitionSettingsDTO defaultSettings = new ImageRecognitionSettingsDTO();
50-
return findImageOnScreen(image, defaultSettings);
50+
return findImageOnScreen(image, defaultSettings).getImageRectangle();
5151
}
5252

53-
public Point[] findImageOnScreen(String image, ImageRecognitionSettingsDTO settings) throws Exception {
54-
ImageSearchDTO dto = findImageOnScreen2(image, settings);
55-
return dto.getImageRectangle();
56-
}
57-
58-
private ImageSearchDTO findImageOnScreen2(String imageName, ImageRecognitionSettingsDTO settings) throws Exception {
53+
public ImageSearchDTO findImageOnScreen(String imageName, ImageRecognitionSettingsDTO settings) throws Exception {
5954
// queryImageFolder is "", unless set by setQueryImageFolder()
6055
String queryImageFolder = "queryimages/" + queryImageSubFolder;
6156
String screenshotsFolder = "target/reports/screenshots/"; //TODO Severi remove this
62-
ImageSearchDTO foundImage = ImageRecognition.findImageOnScreen(imageName, queryImageFolder, screenshotsFolder, settings, getScreenSizeADB(), platformName);
57+
String imageFile = queryImageFolder+imageName;
58+
log("Searching for: "+imageFile);
59+
ImageSearchDTO foundImage = ImageRecognition.findImageOnScreen(imageFile, screenshotsFolder, settings, getScreenSize(), platformName);
6360
return foundImage;
6461
}
6562

6663
public void waitForImageToDisappearFromScreen(String image) throws Exception {
6764
String queryImageFolder = "queryimages/" + queryImageSubFolder; //TODO Severi remove this
6865
String screenshotsFolder = "target/reports/screenshots/"; //TODO Severi remove this
69-
Dimension screenSize = getScreenSizeADB(); //TODO Severi remove this
70-
boolean hasImageDisappeared = ImageRecognition.hasImageDissappearedFromScreenBeforeTimeout(image, queryImageFolder, screenshotsFolder, screenSize, platformName);
66+
Dimension screenSize = getScreenSize(); //TODO Severi remove this
67+
String imageFile = queryImageFolder+image;
68+
boolean hasImageDisappeared = ImageRecognition.hasImageDissappearedFromScreenBeforeTimeout(imageFile, screenshotsFolder, screenSize, platformName);
7169
assert(hasImageDisappeared);
7270
}
7371

@@ -83,43 +81,42 @@ public void waitForImageToDisappearFromScreen(String image) throws Exception {
8381

8482

8583
//Uses adb commands to get the screen size. To be used when appium methods fail. Only works on Android devices.
86-
public Dimension getScreenSizeADB() throws Exception {
84+
public Dimension getScreenSize() throws Exception {
8785
log("trying to get size from adb...");
8886
log("------------------------------");
8987
if (platformName.equalsIgnoreCase("iOS")) {
9088
return driver.manage().window().getSize();
9189
} else {
92-
String adb = "adb";
93-
String[] adbCommand = {adb, "shell", "dumpsys", "window"};
94-
try {
95-
ProcessBuilder p = new ProcessBuilder(adbCommand);
96-
Process proc = p.start();
97-
InputStream stdin = proc.getInputStream();
98-
InputStreamReader isr = new InputStreamReader(stdin);
99-
BufferedReader br = new BufferedReader(isr);
100-
String line = null;
101-
String[] size = null;
102-
while ((line = br.readLine()) != null) {
103-
if (!line.contains("OriginalmUnrestrictedScreen")) { //we do this check for devices with android 5.x+ The adb command returns an extra line with the values 0x0 which must be filtered out.
104-
if (line.contains("mUnrestrictedScreen")) {
105-
proc.waitFor();
106-
String[] tmp = line.split("\\) ");
107-
size = tmp[1].split("x");
108-
}
109-
}
110-
}
111-
int width = Integer.parseInt(size[0]);
112-
int height = Integer.parseInt(size[1]);
113-
Dimension screenSize = new Dimension(width, height);
114-
return screenSize;
115-
116-
} catch (Throwable t) {
117-
t.printStackTrace();
118-
}
90+
return getAndroidScreenSize();
11991
}
120-
return null;
12192
}
12293

94+
95+
private Dimension getAndroidScreenSize() throws IOException, InterruptedException {
96+
String adb = "adb";
97+
String[] adbCommand = {adb, "shell", "dumpsys", "window"};
98+
ProcessBuilder p = new ProcessBuilder(adbCommand);
99+
Process proc = p.start();
100+
InputStream stdin = proc.getInputStream();
101+
InputStreamReader isr = new InputStreamReader(stdin);
102+
BufferedReader br = new BufferedReader(isr);
103+
String line = null;
104+
String[] size = null;
105+
while ((line = br.readLine()) != null) {
106+
if (!line.contains("OriginalmUnrestrictedScreen")) { //we do this check for devices with android 5.x+ The adb command returns an extra line with the values 0x0 which must be filtered out.
107+
if (line.contains("mUnrestrictedScreen")) {
108+
proc.waitFor();
109+
String[] tmp = line.split("\\) ");
110+
size = tmp[1].split("x");
111+
}
112+
}
113+
}
114+
int width = Integer.parseInt(size[0]);
115+
int height = Integer.parseInt(size[1]);
116+
Dimension screenSize = new Dimension(width, height);
117+
return screenSize;
118+
}
119+
123120
public boolean findDeviceTypeADB() throws Exception {
124121
log("trying to find device type ...");
125122
log("------------------------------");
@@ -172,7 +169,7 @@ public void processBuilder(String[] adbCommand) {
172169
public String grabTextFromImage(String image) throws Exception {
173170
ImageRecognitionSettingsDTO settings = new ImageRecognitionSettingsDTO();
174171
settings.setCrop(true);
175-
ImageSearchDTO imageSearch = findImageOnScreen2(image, settings);
172+
ImageSearchDTO imageSearch = findImageOnScreen(image, settings);
176173
String text = ImageRecognition.getTextStringFromImage(imageSearch.getScreenshotFile());
177174
return text;
178175
}
@@ -195,7 +192,7 @@ public Point correctAndroidCoordinates(Point appium_coord) throws Exception {
195192
int appium_screenWidth = appium_dimensions.getWidth();
196193
int appium_screenHeight = appium_dimensions.getHeight();
197194

198-
Dimension adb_dimension = getScreenSizeADB();
195+
Dimension adb_dimension = getScreenSize();
199196
int adb_screenWidth = adb_dimension.getWidth();
200197
int adb_screenHeight = adb_dimension.getHeight();
201198

src/main/java/library/ImageRecognition.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,15 @@ private static boolean isPointInsideScreenBounds(Point center, Dimension screenS
112112
}
113113

114114

115-
public static boolean hasImageDissappearedFromScreenBeforeTimeout(String image, String queryImageFolder,
115+
public static boolean hasImageDissappearedFromScreenBeforeTimeout(String imageFile,
116116
String screenshotsFolder, Dimension screenSize, String platformName) throws Exception {
117-
log("==> Trying to find image: " + image);
117+
log("==> Trying to find image: " + imageFile);
118118
int retry_counter=0;
119119
long start = System.nanoTime();
120-
String queryImageFile = queryImageFolder + image;
121120
while (((System.nanoTime() - start) / 1e6 / 1000 < 300)) {
122-
String screenshotName = parseFileName(image) + "_screenshot_"+retry_counter;
121+
String screenshotName = parseFileName(imageFile) + "_screenshot_"+retry_counter;
123122
String screenShotFile = ImageRecognition.takeScreenshot(screenshotName, screenshotsFolder, platformName);
124-
if ((findImage(queryImageFile, screenShotFile, platformName, screenSize)) == null) {
123+
if ((findImage(imageFile, screenShotFile, platformName, screenSize)) == null) {
125124
log("Image has successfully disappeared from screen.");
126125
return true;
127126
}
@@ -163,21 +162,22 @@ public static String getTextStringFromImage(String imageInput) {
163162

164163

165164

166-
public static ImageSearchDTO findImageOnScreen(String image, String queryImageFolder, String screenshotsFolder, ImageRecognitionSettingsDTO settings, Dimension screenSize, String platformName) throws InterruptedException, IOException, Exception {
167-
ImageSearchDTO foundImageDto = findImageLoop(image, queryImageFolder, screenshotsFolder, settings, screenSize, platformName);
165+
public static ImageSearchDTO findImageOnScreen(String imageFile, String screenshotsFolder, ImageRecognitionSettingsDTO settings, Dimension screenSize, String platformName) throws InterruptedException, IOException, Exception {
166+
ImageSearchDTO foundImageDto = findImageLoop(imageFile, screenshotsFolder, settings, screenSize, platformName);
168167
if (foundImageDto.isFound() && settings.isCrop()) {
169168
cropImage(foundImageDto);
170169
}
171170
return foundImageDto;
172171
}
173172

174-
private static ImageSearchDTO findImageLoop(String image, String queryImageFolder, String screenshotsFolder, ImageRecognitionSettingsDTO settings, Dimension screenSize, String platformName) throws InterruptedException, IOException, Exception {
173+
private static ImageSearchDTO findImageLoop(String imageFile, String screenshotsFolder, ImageRecognitionSettingsDTO settings, Dimension screenSize, String platformName) throws InterruptedException, IOException, Exception {
175174
long start_time = System.nanoTime();
176175
ImageSearchDTO foundImageDto = new ImageSearchDTO();
176+
String imageName = parseFileName(imageFile);
177177
for (int i = 0; i < settings.getRetries(); i++) {
178-
String queryImageFile = queryImageFolder + image;
179-
String screenshotFile = takeScreenshot(image + "_screenshot",screenshotsFolder, platformName);
180-
Point[] imgRect = ImageRecognition.findImage(queryImageFile, screenshotFile, settings, platformName, screenSize);
178+
String screenshotName = imageName + "_screenshot_"+i;
179+
String screenshotFile = takeScreenshot(screenshotName,screenshotsFolder, platformName);
180+
Point[] imgRect = ImageRecognition.findImage(imageFile, screenshotFile, settings, platformName, screenSize);
181181
if (imgRect!=null){
182182
long end_time = System.nanoTime();
183183
int difference = (int) ((end_time - start_time) / 1e6 / 1000);

0 commit comments

Comments
 (0)