diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a1eae78e --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.gradle +.idea +allure-results +build +out +logs +Reports +ScreensDoc +Screenshots \ No newline at end of file diff --git a/CIStrategy.png b/CIStrategy.png deleted file mode 100644 index 35925409..00000000 Binary files a/CIStrategy.png and /dev/null differ diff --git a/README.md b/README.md index 2526d441..a24b1774 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### Introduction: The main purpose of this framework to add automation capability to mobile applications - + ### Supported Platforms diff --git a/Server/AppServer4723.bat b/Server/AppServer4723.bat deleted file mode 100644 index 48fa0c9d..00000000 --- a/Server/AppServer4723.bat +++ /dev/null @@ -1,8 +0,0 @@ -cd C:\Users\dipjyoti.metia\AppData\Roaming\npm\node_modules\appium\build\lib -@echo off & setlocal -node main.js -a 172.23.126.97 -p 4723 -cp 4723 -bp 4732" -if errorlevel 1 ( - echo Not successful -) else ( - echo Successful -)node \ No newline at end of file diff --git a/Server/AppServer4724.bat b/Server/AppServer4724.bat deleted file mode 100644 index 02a6319e..00000000 --- a/Server/AppServer4724.bat +++ /dev/null @@ -1,8 +0,0 @@ -cd C:\Users\dipjyoti.metia\AppData\Roaming\npm\node_modules\appium\build\lib -@echo off & setlocal -node main.js -a 172.23.126.97 -p 4724 -cp 4724 -bp 4742" -if errorlevel 1 ( - echo Not successful -) else ( - echo Successful -)node \ No newline at end of file diff --git a/Server/DeviceConnect.bat b/Server/DeviceConnect.bat deleted file mode 100644 index cf0cc482..00000000 --- a/Server/DeviceConnect.bat +++ /dev/null @@ -1,8 +0,0 @@ -cd C:\Users\dipjyoti.metia\AppData\Local\Android\Sdk\platform-tools -@echo off & setlocal -adb -s 9889d6324131325a34 tcpip 5555 -if errorlevel 1 ( - echo Not successful -) else ( - echo Successful -)adb \ No newline at end of file diff --git a/Server/StartAppiumServer.bat b/Server/StartAppiumServer.bat deleted file mode 100644 index a68d8947..00000000 --- a/Server/StartAppiumServer.bat +++ /dev/null @@ -1 +0,0 @@ -"C:\Program Files\nodejs\node.exe" "C:\Users\dipjyoti.metia\AppData\Roaming\npm\node_modules\appium\build\lib\main.js" \ No newline at end of file diff --git a/Server/StartEmulator.bat b/Server/StartEmulator.bat deleted file mode 100644 index 30c52f41..00000000 --- a/Server/StartEmulator.bat +++ /dev/null @@ -1 +0,0 @@ -C:\Users\dipjyoti.metia\AppData\Local\Android\Sdk\emulator\emulator -avd Pixel2 \ No newline at end of file diff --git a/Server/wirelessConnectS8.bat b/Server/wirelessConnectS8.bat deleted file mode 100644 index 5f56140d..00000000 --- a/Server/wirelessConnectS8.bat +++ /dev/null @@ -1,9 +0,0 @@ -cd C:\Users\dipjyoti.metia\AppData\Local\Android\Sdk\platform-tools -@echo off & setlocal -set IP=172.23.25.185:5555 -adb connect %IP% | find /i "connected to" >nul -if errorlevel 1 ( - echo Not successful -) else ( - echo Successful -)adb \ No newline at end of file diff --git a/build.gradle b/build.gradle index b85502f7..66bc1da4 100644 --- a/build.gradle +++ b/build.gradle @@ -72,11 +72,11 @@ compileTestKotlin { allure { autoconfigure = true aspectjweaver = true - version = '2.7.0' + version = '2.11.0' useTestNG { - version = '2.7.0' + version = '2.11.0' } - downloadLink = 'https://github.com/allure-framework/allure2/releases/download/2.7.0/allure-2.7.0.zip' + downloadLink = 'https://dl.bintray.com/qameta/maven/io/qameta/allure/allure-commandline/2.11.0/allure-commandline-2.11.0.zip' } //loadConfig() @@ -120,7 +120,7 @@ sourceSets { } dependencies { - compile group: 'com.amazonaws', name: 'aws-java-sdk', version: '1.11.402' + compile group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.550' compile group: 'io.appium', name: 'java-client', version: '7.0.0' compile group: 'net.reini', name: 'slf4-cdi', version: '1.0' compile group: 'org.assertj', name: 'assertj-core', version: '3.11.0' @@ -130,27 +130,27 @@ dependencies { compile group: 'com.relevantcodes', name: 'extentreports', version: '2.41.2' compile group: 'commons-io', name: 'commons-io', version: '2.6' compile group: 'net.sourceforge.javacsv', name: 'javacsv', version: '2.0' - compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.0.1' - compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '4.0.1' - compile group: 'org.apache.poi', name: 'poi-excelant', version: '4.0.1' - compile group: 'org.apache.poi', name: 'poi-examples', version: '4.0.1' - compile group: 'org.apache.poi', name: 'poi-scratchpad', version: '4.0.1' - compile group: 'org.apache.poi', name: 'poi', version: '4.0.1' + compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.0' + compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '4.1.0' + compile group: 'org.apache.poi', name: 'poi-excelant', version: '4.1.0' + compile group: 'org.apache.poi', name: 'poi-examples', version: '4.1.0' + compile group: 'org.apache.poi', name: 'poi-scratchpad', version: '4.1.0' + compile group: 'org.apache.poi', name: 'poi', version: '4.1.0' compile group: 'org.apache.xmlbeans', name: 'xmlbeans', version: '3.1.0' compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '7.2.1.jre8' - compile group: 'io.qameta.allure', name: 'allure-gradle', version: '2.4' - compile group: 'io.qameta.allure', name: 'allure-testng', version: '2.7.0' - compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25' + compile group: 'io.qameta.allure', name: 'allure-gradle', version: '2.5' + compile group: 'io.qameta.allure', name: 'allure-testng', version: '2.11.0' + compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.26' compile group: 'com.github.javafaker', name: 'javafaker', version: '0.17.2' - compile group: 'io.rest-assured', name: 'rest-assured', version: '3.3.0' - compile 'io.rest-assured:json-path:3.3.0' - compile 'io.rest-assured:json-schema-validator:3.3.0' + compile group: 'io.rest-assured', name: 'rest-assured', version: '4.0.0' + compile 'io.rest-assured:json-path:4.0.0' + compile 'io.rest-assured:json-schema-validator:4.0.0' compile group: 'org.json', name: 'json', version: '20180130' compile group: 'com.mashape.unirest', name: 'unirest-java', version: '1.4.9' - compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1' - compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.2' + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.2' compile group: 'com.mashape.unirest', name: 'unirest-java', version: '1.4.9' - compile group: 'com.github.tomakehurst', name: 'wiremock', version: '2.22.0' + compile group: 'com.github.tomakehurst', name: 'wiremock', version: '2.23.0' compile group: 'net.lightbody.bmp', name: 'browsermob-core', version: '2.1.5' compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } diff --git a/input/Driver/chromedriver.exe b/input/Driver/chromedriver.exe new file mode 100644 index 00000000..d7ac3c69 Binary files /dev/null and b/input/Driver/chromedriver.exe differ diff --git a/screens/architecture.png b/screens/architecture.png deleted file mode 100644 index 6498f2e6..00000000 Binary files a/screens/architecture.png and /dev/null differ diff --git a/src/main/java/com/Constants/Arg.java b/src/main/java/com/Constants/Arg.java index 04dbe46d..0d784be1 100644 --- a/src/main/java/com/Constants/Arg.java +++ b/src/main/java/com/Constants/Arg.java @@ -10,7 +10,7 @@ public enum Arg implements ServerArgument { private final String arg; - Arg(String arg){ + Arg(String arg) { this.arg = arg; } diff --git a/src/main/java/com/Exception/AppiumException.java b/src/main/java/com/Exception/AppiumException.java index 257a044f..5f4a7ce7 100644 --- a/src/main/java/com/Exception/AppiumException.java +++ b/src/main/java/com/Exception/AppiumException.java @@ -4,6 +4,7 @@ public class AppiumException extends Exception { /** * Appium server exception + * * @param message exception message */ public AppiumException(String message) { diff --git a/src/main/java/com/Exception/DeviceException.java b/src/main/java/com/Exception/DeviceException.java index ac01bb08..8711f313 100644 --- a/src/main/java/com/Exception/DeviceException.java +++ b/src/main/java/com/Exception/DeviceException.java @@ -3,6 +3,7 @@ public class DeviceException extends Exception { /** * Device exception + * * @param message exception message */ public DeviceException(String message) { diff --git a/src/main/java/com/Exception/ElementException.java b/src/main/java/com/Exception/ElementException.java index 616d63b7..5654621b 100644 --- a/src/main/java/com/Exception/ElementException.java +++ b/src/main/java/com/Exception/ElementException.java @@ -5,6 +5,7 @@ public class ElementException extends ElementNotVisibleException { /** * Element exception + * * @param message exception message */ public ElementException(String message) { diff --git a/src/main/java/com/Exception/MobileAppException.java b/src/main/java/com/Exception/MobileAppException.java index 742d136f..ddf0278c 100644 --- a/src/main/java/com/Exception/MobileAppException.java +++ b/src/main/java/com/Exception/MobileAppException.java @@ -3,6 +3,7 @@ public class MobileAppException extends Exception { /** * App exception + * * @param message exception message */ public MobileAppException(String message) { diff --git a/src/main/java/com/Utils/FileSystem.java b/src/main/java/com/Utils/FileSystem.java index 2898c52e..0bcdad9e 100644 --- a/src/main/java/com/Utils/FileSystem.java +++ b/src/main/java/com/Utils/FileSystem.java @@ -7,7 +7,6 @@ import java.io.File; import java.io.IOException; -import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; @@ -61,7 +60,7 @@ public static String readFile(String filePath) throws IOException { * @throws IOException When fail to write in file. */ public static void appendFile(String filePath, String text) throws IOException { - FileUtils.writeStringToFile(new File(filePath), text, "UTF-8",true); + FileUtils.writeStringToFile(new File(filePath), text, "UTF-8", true); } /** @@ -72,7 +71,7 @@ public static void appendFile(String filePath, String text) throws IOException { * @throws IOException When fail to write in file. */ public static void writeFile(String filePath, String text) throws IOException { - FileUtils.writeStringToFile(new File(filePath), text,"UTF-8"); + FileUtils.writeStringToFile(new File(filePath), text, "UTF-8"); } /** diff --git a/src/main/java/com/core/ADB.java b/src/main/java/com/core/ADB.java index 645b32c1..99d5e846 100644 --- a/src/main/java/com/core/ADB.java +++ b/src/main/java/com/core/ADB.java @@ -3,130 +3,163 @@ import org.apache.log4j.LogManager; import org.apache.log4j.Logger; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.concurrent.TimeUnit; public class ADB { private Logger logger = LogManager.getLogger(ADB.class); + private static String sdkPath = System.getenv("ANDROID_HOME"); + private static String adbPath = sdkPath + "platform-tools" + File.separator + "adb"; + private static String emulatorPath = sdkPath +File.separator + "emulator"; + private String ID; - public ADB(String deviceID){ID = deviceID;} + public ADB(String deviceID) { + ID = deviceID; + } + + public static void launchEmulator(String nameOfAVD) { + System.out.println("Starting emulator for '" + nameOfAVD + "' ..."); + String[] aCommand = new String[] { emulatorPath, "-avd", nameOfAVD }; + try { + Process process = new ProcessBuilder(aCommand).start(); + process.waitFor(180, TimeUnit.SECONDS); + System.out.println("Emulator launched successfully!"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void closeEmulator() { + System.out.println("Killing emulator..."); + String[] aCommand = new String[] { adbPath, "emu", "kill" }; + try { + Process process = new ProcessBuilder(aCommand).start(); + process.waitFor(1, TimeUnit.SECONDS); + System.out.println("Emulator closed successfully!"); + } catch (Exception e) { + e.printStackTrace(); + } + } - public String command(String command){ - logger.debug("Formatting ADB Command: "+command); - if(command.startsWith("adb")) command = command.replace("adb ", ServerManager.getAndroidHome()+"/platform-tools/adb "); + public String command(String command) { + logger.debug("Formatting ADB Command: " + command); + if (command.startsWith("adb")) + command = command.replace("adb ", ServerManager.getAndroidHome() + "/platform-tools/adb "); else throw new RuntimeException("This method is designed to run ADB commands only!"); - logger.debug("Formatted ADB Command: "+command); + logger.debug("Formatted ADB Command: " + command); String output = ServerManager.runCommand(command); - logger.debug("Output of the ADB Command: "+output); - if(output == null) return ""; + logger.debug("Output of the ADB Command: " + output); + if (output == null) return ""; else return output.trim(); } - public void killServer(){ + public void killServer() { command("adb kill-server"); } - public void startServer(){ + public void startServer() { command("adb start-server"); } - public ArrayList getConnectedDevices(){ + public ArrayList getConnectedDevices() { ArrayList devices = new ArrayList(); String output = command("adb devices"); - for(String line : output.split("\n")){ + for (String line : output.split("\n")) { line = line.trim(); - if(line.endsWith("device")) devices.add(line.replace("device", "").trim()); + if (line.endsWith("device")) devices.add(line.replace("device", "").trim()); } return devices; } - public String getForegroundActivity(){ - return command("adb -s "+ID+" shell dumpsys window windows | grep mCurrentFocus"); + public String getForegroundActivity() { + return command("adb -s " + ID + " shell dumpsys window windows | grep mCurrentFocus"); } - public String getAndroidVersionAsString(){ - String output = command("adb -s "+ID+" shell getprop ro.build.version.release"); - if(output.length() == 3) output+=".0"; + public String getAndroidVersionAsString() { + String output = command("adb -s " + ID + " shell getprop ro.build.version.release"); + if (output.length() == 3) output += ".0"; return output; } - public int getAndroidVersion(){ + public int getAndroidVersion() { return Integer.parseInt(getAndroidVersionAsString().replaceAll("\\.", "")); } - public ArrayList getInstalledPackages(){ + public ArrayList getInstalledPackages() { ArrayList packages = new ArrayList(); - String[] output = command("adb -s "+ID+" shell pm list packages").split("\n"); - for(String packageID : output) packages.add(packageID.replace("package:","").trim()); + String[] output = command("adb -s " + ID + " shell pm list packages").split("\n"); + for (String packageID : output) packages.add(packageID.replace("package:", "").trim()); return packages; } - public void openAppsActivity(String packageID, String activityID){ - command("adb -s "+ID+" shell am start -c api.android.intent.category.LAUNCHER -a api.android.intent.action.MAIN -n "+packageID+"/"+activityID); + public void openAppsActivity(String packageID, String activityID) { + command("adb -s " + ID + " shell am start -c api.android.intent.category.LAUNCHER -a api.android.intent.action.MAIN -n " + packageID + "/" + activityID); } - public void clearAppsData(String packageID){ - command("adb -s "+ID+" shell pm clear "+packageID); + public void clearAppsData(String packageID) { + command("adb -s " + ID + " shell pm clear " + packageID); } - public void forceStopApp(String packageID){ - command("adb -s "+ID+" shell am force-stop "+packageID); + public void forceStopApp(String packageID) { + command("adb -s " + ID + " shell am force-stop " + packageID); } - public void installApp(String apkPath){ - command("adb -s "+ID+" install "+apkPath); + public void installApp(String apkPath) { + command("adb -s " + ID + " install " + apkPath); } - public void uninstallApp(String packageID){ - command("adb -s "+ID+" uninstall "+packageID); + public void uninstallApp(String packageID) { + command("adb -s " + ID + " uninstall " + packageID); } - public void clearLogBuffer(){ - command("adb -s "+ID+" shell -c"); + public void clearLogBuffer() { + command("adb -s " + ID + " shell -c"); } - public void pushFile(String source, String target){ - command("adb -s "+ID+" push "+source+" "+target); + public void pushFile(String source, String target) { + command("adb -s " + ID + " push " + source + " " + target); } - public void pullFile(String source, String target){ - command("adb -s "+ID+" pull "+source+" "+target); + public void pullFile(String source, String target) { + command("adb -s " + ID + " pull " + source + " " + target); } - public void deleteFile(String target){ - command("adb -s "+ID+" shell rm "+target); + public void deleteFile(String target) { + command("adb -s " + ID + " shell rm " + target); } - public void moveFile(String source, String target){ - command("adb -s "+ID+" shell mv "+source+" "+target); + public void moveFile(String source, String target) { + command("adb -s " + ID + " shell mv " + source + " " + target); } - public void takeScreenshot(String target){ - command("adb -s "+ID+" shell screencap "+target); + public void takeScreenshot(String target) { + command("adb -s " + ID + " shell screencap " + target); } - public void rebootDevice(){ - command("adb -s "+ID+" reboot"); + public void rebootDevice() { + command("adb -s " + ID + " reboot"); } - public String getDeviceModel(){ - return command("adb -s "+ID+" shell getprop ro.product.model"); + public String getDeviceModel() { + return command("adb -s " + ID + " shell getprop ro.product.model"); } - public String getDeviceSerialNumber(){ - return command("adb -s "+ID+" shell getprop ro.serialno"); + public String getDeviceSerialNumber() { + return command("adb -s " + ID + " shell getprop ro.serialno"); } - public String getDeviceCarrier(){ - return command("adb -s "+ID+" shell getprop gsm.operator.alpha"); + public String getDeviceCarrier() { + return command("adb -s " + ID + " shell getprop gsm.operator.alpha"); } - public ArrayList getLogcatProcesses(){ - String[] output = command("adb -s "+ID+" shell top -n 1 | grep -i 'logcat'").split("\n"); + public ArrayList getLogcatProcesses() { + String[] output = command("adb -s " + ID + " shell top -n 1 | grep -i 'logcat'").split("\n"); ArrayList processes = new ArrayList(); - for(String line : output){ + for (String line : output) { processes.add(line.split(" ")[0]); processes.removeAll(Arrays.asList("", null)); } diff --git a/src/main/java/com/core/Access.java b/src/main/java/com/core/Access.java index bded4c31..faec7d19 100644 --- a/src/main/java/com/core/Access.java +++ b/src/main/java/com/core/Access.java @@ -2,10 +2,10 @@ public interface Access { - String APPIUM_Port = "4723"; + int APPIUM_Port = 4723; int PROXY_Port = 9001; - String PIXEL = ""; - String S9 = ""; + String PIXEL = "emulator-5556"; + String NEXUS = "emulator-5554"; String ANDROID_APP = ""; String AWS_KEY = ""; String AWS_SECRET = ""; diff --git a/src/main/java/com/core/ApiActions.java b/src/main/java/com/core/ApiActions.java index f2676734..18500815 100644 --- a/src/main/java/com/core/ApiActions.java +++ b/src/main/java/com/core/ApiActions.java @@ -62,6 +62,7 @@ private String authLogin() { /** * Authentication token generate + * * @return auth token */ protected String authToken() { @@ -106,11 +107,12 @@ private RequestSpecification httpRequest(JSONObject params) { /** * http request with parameter and auth token + * * @param params jsonObject - * @param token token + * @param token token * @return httpRequest */ - private RequestSpecification httpRequestLogin(JSONObject params,String token) { + private RequestSpecification httpRequestLogin(JSONObject params, String token) { return RestAssured .given() .with() @@ -134,6 +136,7 @@ private RequestSpecification httpRequest() { /** * http request with token + * * @param token token * @return http request */ @@ -189,13 +192,14 @@ protected Response httpPost(JSONObject params, String path) { /** * http post cancel + * * @param params params - * @param path endpoint - * @param token token + * @param path endpoint + * @param token token * @return response */ - protected Response httpPostCancelPendingBets(JSONObject params, String path,String token) { - return httpRequestLogin(params,token).request(Method.POST, path); + protected Response httpPostCancelPendingBets(JSONObject params, String path, String token) { + return httpRequestLogin(params, token).request(Method.POST, path); } /** @@ -210,11 +214,12 @@ protected Response httpGet(String path) { /** * http get pending - * @param path endpoint + * + * @param path endpoint * @param token token * @return response */ - protected Response httpGetMicroServices(String path,String token) { + protected Response httpGetMicroServices(String path, String token) { return httpLogin(token).request(Method.GET, path); } diff --git a/src/main/java/com/core/AppiumController.java b/src/main/java/com/core/AppiumController.java index babe0790..d638a310 100644 --- a/src/main/java/com/core/AppiumController.java +++ b/src/main/java/com/core/AppiumController.java @@ -36,45 +36,46 @@ public class AppiumController implements Access { private Logger logger = LogManager.getLogger(AppiumController.class); private String appiumPort = "4723"; private static BrowserMobProxy server; - private static String nodeJS = System.getenv("APPIUM_HOME")+"/node.exe"; - private static String appiumJS = System.getenv("APPIUM_HOME")+"/node_modules/appium/bin/appium.js"; + private static String nodeJS = System.getenv("NODE_HOME") + "/node.exe"; + private static String appiumJS = System.getenv("APPIUM_HOME") + "/main.js"; private static DriverService service; - // private String serverIp = "127.0.0.1"; //Local + private static String serverIp = "127.0.0.1"; //Local // private String serverIp = "172.23.126.97"; //Jenkins - @Parameters({"device", "apk", "serverIp"}) + @Parameters({"device", "apk"}) @BeforeClass - public void setup(String device, String apk, String serverIp) { - initDriver(device, apk, serverIp); + public void setup(String device, String apk) throws Exception { + initDriver(device, apk); } public AppiumDriver getDriver() { return _driver; } - private void initDriver(String device, String apk, String serverIp) { + private void initDriver(String device, String apk) throws Exception { try { File appDir = new File("AndroidApp"); File app = new File(appDir, "***.apk"); String serverUrl = "http://" + serverIp + ":" + appiumPort + "/wd/hub"; - if (device.equals("S8")) { - logger.info("Selected device is S8"); + if (device.equals("NEXUS")) { + logger.info("Selected device is NEXUS"); if (apk.equals("Y")) { _caps.setCapability(MobileCapabilityType.APP, app); } - _caps.setCapability(MobileCapabilityType.UDID, "9889d6324131325a34"); - _caps.setCapability(MobileCapabilityType.DEVICE_NAME, "9889d6324131325a34"); + _caps.setCapability(MobileCapabilityType.UDID, NEXUS); + _caps.setCapability(MobileCapabilityType.DEVICE_NAME, "NEXUS"); _androidCapabilities(_caps); + _createService().start(); logger.info("Argument to driver object : " + serverUrl); _driver = new AndroidDriver<>(new URL(serverUrl), _caps); - } else if (device.equals("Iphone8")) { - logger.info("Selected device is iphone8"); + } else if (device.equals("PIXEL")) { + logger.info("Selected device is PIXEL"); if (apk.equals("Y")) { _caps.setCapability(MobileCapabilityType.APP, app); } - _caps.setCapability(MobileCapabilityType.UDID, "1cb4062d0b037ece"); - _caps.setCapability(MobileCapabilityType.DEVICE_NAME, "1cb4062d0b037ece"); + _caps.setCapability(MobileCapabilityType.UDID, PIXEL); + _caps.setCapability(MobileCapabilityType.DEVICE_NAME, "PIXEL"); _iosCapabilities(_caps); logger.info("Argument to driver object : " + serverUrl); _driver = new IOSDriver<>(new URL(serverUrl), _caps); @@ -90,19 +91,23 @@ private void initDriver(String device, String apk, String serverIp) { private void _androidCapabilities(DesiredCapabilities _caps) { _caps.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID); - _caps.setCapability("report.disable", "true"); _caps.setCapability(MobileCapabilityType.NO_RESET, true); - _caps.setCapability("gpsEnabled", "true"); - _caps.setCapability(AndroidMobileCapabilityType.INTENT_ACTION, "android.intent.action.MAIN"); - _caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "au.com.test.uat"); - _caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "au.com.test.ui.SplashActivity"); + _caps.setCapability(MobileCapabilityType.FULL_RESET, false); + _caps.setCapability(MobileCapabilityType.AUTO_WEBVIEW, false); + _caps.setCapability(AndroidMobileCapabilityType.AUTO_GRANT_PERMISSIONS, true); + _caps.setCapability(AndroidMobileCapabilityType.APPLICATION_NAME, "UiAutomator2"); + _caps.setCapability(AndroidMobileCapabilityType.ANDROID_INSTALL_TIMEOUT, 60); + _caps.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, "input/Driver/chromedriver.exe"); + _caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.booking"); + _caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, ".startup.HomeActivity"); } private void _iosCapabilities(DesiredCapabilities _caps) { _caps.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.IOS); - _caps.setCapability("report.disable", "true"); + _caps.setCapability(MobileCapabilityType.FULL_RESET, false); + _caps.setCapability(AndroidMobileCapabilityType.AUTO_GRANT_PERMISSIONS, true); + _caps.setCapability(AndroidMobileCapabilityType.APPLICATION_NAME, "XCUITest"); _caps.setCapability(MobileCapabilityType.NO_RESET, true); - _caps.setCapability("gpsEnabled", "true"); _caps.setCapability(IOSMobileCapabilityType.XCODE_ORG_ID, ""); _caps.setCapability(IOSMobileCapabilityType.XCODE_SIGNING_ID, ""); _caps.setCapability(IOSMobileCapabilityType.UPDATE_WDA_BUNDLEID, ""); @@ -110,14 +115,13 @@ private void _iosCapabilities(DesiredCapabilities _caps) { _caps.setCapability(IOSMobileCapabilityType.APP_NAME, ""); } - private void _browserCapabilities(DesiredCapabilities _caps,String browser) { + private void _browserCapabilities(DesiredCapabilities _caps, String browser) { if (browser.contains("chrome")) { _caps.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.CHROME); _caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "72"); - } - else { + } else { _caps.setCapability(MobileCapabilityType.BROWSER_NAME, MobileBrowserType.SAFARI); - _caps.setCapability(MobileCapabilityType.PLATFORM_VERSION,"8.1"); + _caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "8.1"); } } @@ -133,12 +137,12 @@ private void _performanceCapability(DesiredCapabilities _caps) { server.newHar("appiumPerf.har"); } - private static DriverService createService() throws MalformedURLException { + private static DriverService _createService() throws MalformedURLException { service = new AppiumServiceBuilder() .usingDriverExecutable(new File(nodeJS)) .withAppiumJS(new File(appiumJS)) - .withIPAddress("localhost") - .usingPort(4723) + .withIPAddress(serverIp) + .usingPort(APPIUM_Port) .withArgument(Arg.TIMEOUT, "120") .withArgument(Arg.LOG_LEVEL, "warn") .build(); @@ -160,7 +164,7 @@ private String sysTime() { } @AfterClass - public void tearDown() { + public void tearDown() throws Exception { try { Har har = server.getHar(); FileOutputStream fos = new FileOutputStream("C:\\temp\\perf.har"); diff --git a/src/main/java/com/core/DataActions.java b/src/main/java/com/core/DataActions.java index dcf989a6..49c45b48 100644 --- a/src/main/java/com/core/DataActions.java +++ b/src/main/java/com/core/DataActions.java @@ -39,6 +39,7 @@ private void getDbConnection() { /** * Execute query + * * @param query query * @return result */ @@ -111,6 +112,7 @@ private void finallyBlock(ResultSet rs, Connection connObj, Statement stmt) { /** * Query executer + * * @param query query * @return resultset */ diff --git a/src/main/java/com/core/UserActions.java b/src/main/java/com/core/UserActions.java index b8d5ff5a..bec8e6a8 100644 --- a/src/main/java/com/core/UserActions.java +++ b/src/main/java/com/core/UserActions.java @@ -26,8 +26,8 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; -import org.openqa.selenium.*; import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.*; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.FluentWait; import org.openqa.selenium.support.ui.Wait; @@ -170,7 +170,7 @@ public boolean isDisplayed(MobileElement element) { return false; } - public Dimension getDimension(MobileElement element){ + public Dimension getDimension(MobileElement element) { return element.getSize(); } @@ -590,9 +590,10 @@ protected void swipeAxis(int X, int Y, int X1, int Y1, int count, int time) { /** * tap to element for 250sec + * * @param androidElement element */ - public void tapByElement (MobileElement androidElement) { + public void tapByElement(MobileElement androidElement) { new TouchAction(driver) .tap(TapOptions.tapOptions().withElement(ElementOption.element(androidElement))) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(250))).perform(); @@ -600,21 +601,23 @@ public void tapByElement (MobileElement androidElement) { /** * Tap by coordinates + * * @param x x * @param y y */ - public void tapByCoordinates (int x, int y) { + public void tapByCoordinates(int x, int y) { new TouchAction(driver) - .tap(PointOption.point(x,y)) + .tap(PointOption.point(x, y)) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(250))).perform(); } /** * Press by element + * * @param element element * @param seconds time */ - public void pressByElement (MobileElement element, long seconds) { + public void pressByElement(MobileElement element, long seconds) { new TouchAction(driver) .press(ElementOption.element(element)) .waitAction(WaitOptions.waitOptions(Duration.ofSeconds(seconds))) @@ -624,13 +627,14 @@ public void pressByElement (MobileElement element, long seconds) { /** * Press by co-ordinates - * @param x x - * @param y y + * + * @param x x + * @param y y * @param seconds time */ - public void pressByCoordinates (int x, int y, long seconds) { + public void pressByCoordinates(int x, int y, long seconds) { new TouchAction(driver) - .press(PointOption.point(x,y)) + .press(PointOption.point(x, y)) .waitAction(WaitOptions.waitOptions(Duration.ofSeconds(seconds))) .release() .perform(); @@ -638,11 +642,12 @@ public void pressByCoordinates (int x, int y, long seconds) { /** * Horizontal swipe by percentage - * @param startPercentage start - * @param endPercentage end + * + * @param startPercentage start + * @param endPercentage end * @param anchorPercentage anchor */ - public void horizontalSwipeByPercentage (double startPercentage, double endPercentage, double anchorPercentage) { + public void horizontalSwipeByPercentage(double startPercentage, double endPercentage, double anchorPercentage) { Dimension size = driver.manage().window().getSize(); int anchor = (int) (size.height * anchorPercentage); int startPoint = (int) (size.width * startPercentage); @@ -656,8 +661,9 @@ public void horizontalSwipeByPercentage (double startPercentage, double endPerce /** * Veritical swipe by percentage - * @param startPercentage start - * @param endPercentage end + * + * @param startPercentage start + * @param endPercentage end * @param anchorPercentage anchor */ public void verticalSwipeByPercentages(double startPercentage, double endPercentage, double anchorPercentage) { @@ -675,10 +681,11 @@ public void verticalSwipeByPercentages(double startPercentage, double endPercent /** * Swipe by elements + * * @param startElement start - * @param endElement end + * @param endElement end */ - public void swipeByElements (MobileElement startElement, MobileElement endElement) { + public void swipeByElements(MobileElement startElement, MobileElement endElement) { int startX = startElement.getLocation().getX() + (startElement.getSize().getWidth() / 2); int startY = startElement.getLocation().getY() + (startElement.getSize().getHeight() / 2); @@ -686,7 +693,7 @@ public void swipeByElements (MobileElement startElement, MobileElement endElemen int endY = endElement.getLocation().getY() + (endElement.getSize().getHeight() / 2); new TouchAction(driver) - .press(PointOption.point(startX,startY)) + .press(PointOption.point(startX, startY)) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(1000))) .moveTo(PointOption.point(endX, endY)) .release().perform(); @@ -694,9 +701,10 @@ public void swipeByElements (MobileElement startElement, MobileElement endElemen /** * Multi touch by element + * * @param androidElement element */ - public void multiTouchByElement (MobileElement androidElement) { + public void multiTouchByElement(MobileElement androidElement) { TouchAction press = new TouchAction(driver) .press(ElementOption.element(androidElement)) .waitAction(WaitOptions.waitOptions(Duration.ofSeconds(1))) @@ -709,13 +717,14 @@ public void multiTouchByElement (MobileElement androidElement) { /** * Touch Actions - * @param a1 axis 1 - * @param b1 axis 2 - * @param a2 axis 3 - * @param b2 axis 4 + * + * @param a1 axis 1 + * @param b1 axis 2 + * @param a2 axis 3 + * @param b2 axis 4 * @param time time */ - private void touchActions(int a1,int b1,int a2,int b2,int time){ + private void touchActions(int a1, int b1, int a2, int b2, int time) { TouchAction touchAction = new TouchAction(driver); touchAction.press(PointOption.point(a1, b1)). waitAction(WaitOptions.waitOptions(Duration.ofMillis(time))). @@ -739,7 +748,7 @@ protected void swipe(String direction, int count, int time) { int startx = (int) (size.width * 0.8); int endx = (int) (size.width * 0.20); int starty = size.height / 2; - touchActions(startx,starty,endx,starty,time); + touchActions(startx, starty, endx, starty, time); logger.info("Swipe Left"); } } else if (dire.equalsIgnoreCase("RIGHT")) { @@ -749,7 +758,7 @@ protected void swipe(String direction, int count, int time) { int endx = (int) (size.width * 0.8); int startx = (int) (size.width * 0.20); int starty = size.height / 2; - touchActions(startx,starty,endx,starty,time); + touchActions(startx, starty, endx, starty, time); logger.info("Swipe Right"); } } else if (dire.equalsIgnoreCase("UP")) { @@ -758,7 +767,7 @@ protected void swipe(String direction, int count, int time) { int starty = (int) (size.height * 0.80); int endy = (int) (size.height * 0.20); int startx = size.width / 2; - touchActions(startx,starty,startx,endy,time); + touchActions(startx, starty, startx, endy, time); logger.info("Swipe Up"); } } else if (dire.equalsIgnoreCase("DOWN")) { @@ -767,7 +776,7 @@ protected void swipe(String direction, int count, int time) { int starty = (int) (size.height * 0.80); int endy = (int) (size.height * 0.20); int startx = size.width / 2; - touchActions(startx,endy,startx,starty,time); + touchActions(startx, endy, startx, starty, time); logger.info("Swipe Down"); } } @@ -1005,10 +1014,10 @@ protected void SystemDateFormat() { } } - protected void switchToContext(String type){ + protected void switchToContext(String type) { Set s = driver.getContextHandles(); - for(String handle: s){ - if (handle.contains(type)){ + for (String handle : s) { + if (handle.contains(type)) { driver.context(handle); break; } diff --git a/src/main/java/com/logging/ResultSender.java b/src/main/java/com/logging/ResultSender.java index b38702b1..b060f823 100644 --- a/src/main/java/com/logging/ResultSender.java +++ b/src/main/java/com/logging/ResultSender.java @@ -9,7 +9,7 @@ public class ResultSender { private static final String CONTENT_TYPE_VALUE = "application/json"; private static final String ELASTICSEARCH_URL = "http://localhost:9200/app/suite"; - public static void send(final TestStatus testStatus){ + public static void send(final TestStatus testStatus) { try { Unirest.post(ELASTICSEARCH_URL) .header(CONTENT_TYPE, CONTENT_TYPE_VALUE) diff --git a/src/main/java/com/pages/HomePage.java b/src/main/java/com/pages/HomePage.java index b49d5561..c8bb3c96 100644 --- a/src/main/java/com/pages/HomePage.java +++ b/src/main/java/com/pages/HomePage.java @@ -2,23 +2,49 @@ import com.core.UserActions; import io.appium.java_client.MobileElement; -import io.appium.java_client.pagefactory.AndroidBy; +import io.appium.java_client.pagefactory.AndroidFindBy; +import io.appium.java_client.pagefactory.AppiumFieldDecorator; import io.appium.java_client.pagefactory.iOSXCUITBy; import org.openqa.selenium.support.PageFactory; public class HomePage extends UserActions { - @AndroidBy(xpath = "") + @AndroidFindBy(id = "com.booking:id/search_details_text") @iOSXCUITBy(xpath = "") - private MobileElement username; + private MobileElement destination; - public HomePage(){ + @AndroidFindBy(id = "com.booking:id/disam_search") + private MobileElement search; + + @AndroidFindBy(xpath = "(//android.widget.TextView[contains(@text,'Paris')])[1]") + private MobileElement select; + + @AndroidFindBy(id = "com.booking:id/calendar_confirm") + private MobileElement selectDate; + + @AndroidFindBy(id = "com.booking:id/search_search") + private MobileElement searchButton; + + public HomePage() { super(); - PageFactory.initElements(this.driver,HomePage.class); + PageFactory.initElements(new AppiumFieldDecorator(driver), this); } - public void Login(){ - click(username); + public HomePage searchDestination() { + waitForElement(destination); + click(destination); + enter(search, "Paris"); + click(select); + return this; + } + + public HomePage selectDate() { + click(selectDate); + return this; + } + public void search() { + click(searchButton); } + } diff --git a/src/main/java/com/reporting/Jira/Issue.java b/src/main/java/com/reporting/Jira/Issue.java index e8f1ce49..c19eb5fe 100644 --- a/src/main/java/com/reporting/Jira/Issue.java +++ b/src/main/java/com/reporting/Jira/Issue.java @@ -48,7 +48,9 @@ public void linkIssues(String type, String inwardIssue, String outwardIssue) { .post(JiraConfig.JIRA_REST_PATH + "issueLink"); } - /** Returns list of attachment IDs. */ + /** + * Returns list of attachment IDs. + */ public List getAttachmentIds() { return JiraConfig.getJIRARequestSpec() @@ -58,7 +60,9 @@ public List getAttachmentIds() { .getList("fields.attachment.id"); } - /** Adds the file attachment to the JIRA issue. */ + /** + * Adds the file attachment to the JIRA issue. + */ public void addAttachment(File attachment) { String attachmentPath = String.format("issue/%s/attachments", issueKey); diff --git a/src/main/java/com/reporting/Jira/JiraTest.java b/src/main/java/com/reporting/Jira/JiraTest.java index 016357be..12118122 100644 --- a/src/main/java/com/reporting/Jira/JiraTest.java +++ b/src/main/java/com/reporting/Jira/JiraTest.java @@ -2,7 +2,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.json.*; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; import static com.reporting.Jira.JiraConfig.JIRA_REST_PATH; diff --git a/src/main/java/com/reporting/Listeners/Retry.java b/src/main/java/com/reporting/Listeners/Retry.java index 3a0f00e5..64c1eebd 100644 --- a/src/main/java/com/reporting/Listeners/Retry.java +++ b/src/main/java/com/reporting/Listeners/Retry.java @@ -14,6 +14,7 @@ public class Retry extends DriverManager implements IRetryAnalyzer { /** * Retry Times + * * @param iTestResult * @return */ @@ -34,6 +35,7 @@ public boolean retry(ITestResult iTestResult) { /** * Report Fail Operation + * * @param iTestResult */ public void extendReportsFailOperations(ITestResult iTestResult) { diff --git a/src/main/java/com/reporting/Listeners/TestListener.java b/src/main/java/com/reporting/Listeners/TestListener.java index 10be9235..0b4e53de 100644 --- a/src/main/java/com/reporting/Listeners/TestListener.java +++ b/src/main/java/com/reporting/Listeners/TestListener.java @@ -20,7 +20,7 @@ public class TestListener extends DriverManager implements ITestListener { private Logger logger = LogManager.getLogger(TestListener.class); private TestStatus testStatus; - private ResultSender rs= new ResultSender(); + private ResultSender rs = new ResultSender(); private static String getTestMethodName(ITestResult iTestResult) { return iTestResult.getMethod().getConstructorOrMethod().getName(); @@ -48,14 +48,14 @@ public void onTestStart(ITestResult iTestResult) { @Override public void onTestSuccess(ITestResult iTestResult) { - this.sendStatus(iTestResult,"PASS"); + //this.sendStatus(iTestResult,"PASS"); logger.info("I am in onTestSuccess method " + getTestMethodName(iTestResult) + " succeed"); ExtentTestManager.getTest().log(LogStatus.PASS, "Test passed"); } @Override public void onTestFailure(ITestResult iTestResult) { - this.sendStatus(iTestResult,"FAIL"); + //this.sendStatus(iTestResult,"FAIL"); logger.error("I am in onTestFailure method " + getTestMethodName(iTestResult) + " failed"); Object testClass = iTestResult.getInstance(); this.driver = ((DriverManager) testClass).getDriver(); @@ -67,7 +67,7 @@ public void onTestFailure(ITestResult iTestResult) { @Override public void onTestSkipped(ITestResult iTestResult) { - this.sendStatus(iTestResult,"SKIP"); + //this.sendStatus(iTestResult,"SKIP"); logger.warn("I am in onTestSkipped method " + getTestMethodName(iTestResult) + " skipped"); ExtentTestManager.getTest().log(LogStatus.SKIP, "Test Skipped"); } @@ -77,7 +77,7 @@ public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { logger.error("Test failed but it is in defined success ratio " + getTestMethodName(iTestResult)); } - private void sendStatus(ITestResult iTestResult, String status){ + private void sendStatus(ITestResult iTestResult, String status) { this.testStatus.setTestClass(iTestResult.getTestClass().getName()); this.testStatus.setDescription(iTestResult.getMethod().getDescription()); this.testStatus.setStatus(status); diff --git a/src/main/resources/credential.properties b/src/main/resources/credential.properties index 5fa123f6..76fde304 100644 --- a/src/main/resources/credential.properties +++ b/src/main/resources/credential.properties @@ -1,4 +1,4 @@ #AWS Access -Access_key = efwefwegwrwehweh -Secret_Key = ehwehewhwehewhweh +Access_key=efwefwegwrwehweh +Secret_Key=ehwehewhwehewhweh diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 0379e380..26e972a4 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -17,7 +17,7 @@ log4j.logger.org.apache.hadoop=WARN # set to INFO to enable infostream log messages log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF # Configure the com.splunk.logging.HttpEventCollectorLoggingHandler -com.splunk.logging.HttpEventCollectorLoggingHandler.url = %scheme%://%host%:%port% -com.splunk.logging.HttpEventCollectorLoggingHandler.level = INFO -com.splunk.logging.HttpEventCollectorLoggingHandler.token = %user_httpeventcollector_token% +com.splunk.logging.HttpEventCollectorLoggingHandler.url=%scheme%://%host%:%port% +com.splunk.logging.HttpEventCollectorLoggingHandler.level=INFO +com.splunk.logging.HttpEventCollectorLoggingHandler.token=%user_httpeventcollector_token% com.splunk.logging.HttpEventCollectorLoggingHandler.disableCertificateValidation=true \ No newline at end of file diff --git a/src/test/java/com/MockServiceLayer/WireMock.java b/src/test/java/com/MockServiceLayer/WireMock.java index 1f2e1dd6..198076f8 100644 --- a/src/test/java/com/MockServiceLayer/WireMock.java +++ b/src/test/java/com/MockServiceLayer/WireMock.java @@ -1,10 +1,10 @@ package com.MockServiceLayer; -import static com.github.tomakehurst.wiremock.client.WireMock.*; - import com.github.tomakehurst.wiremock.http.Fault; import com.github.tomakehurst.wiremock.stubbing.Scenario; +import static com.github.tomakehurst.wiremock.client.WireMock.*; + public class WireMock { diff --git a/src/test/java/com/ServiceLayer/TC007_ST_TransactionHistoryDepositByDate.java b/src/test/java/com/ServiceLayer/TC007_ST_TransactionHistoryDepositByDate.java index 4db40f4e..aaa477c8 100644 --- a/src/test/java/com/ServiceLayer/TC007_ST_TransactionHistoryDepositByDate.java +++ b/src/test/java/com/ServiceLayer/TC007_ST_TransactionHistoryDepositByDate.java @@ -3,23 +3,15 @@ import com.Common.Property; import com.core.ApiActions; import com.reporting.ExtentReports.ExtentTestManager; -import io.qameta.allure.Description; import io.qameta.allure.Feature; import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import io.restassured.http.Method; -import io.restassured.path.json.JsonPath; import io.restassured.response.Response; -import io.restassured.response.ResponseBody; -import io.restassured.specification.RequestSpecification; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.json.simple.JSONObject; import org.testng.Assert; import org.testng.annotations.Test; -import java.util.ArrayList; - public class TC007_ST_TransactionHistoryDepositByDate extends ApiActions { private Logger logger = LogManager.getLogger(ApiActions.class); diff --git a/src/test/java/com/TestDefinitionLayer/TC001_E2E_MTR_638.java b/src/test/java/com/TestDefinitionLayer/TC001_E2E_MTR_638.java index da0cba1b..9cea45d8 100644 --- a/src/test/java/com/TestDefinitionLayer/TC001_E2E_MTR_638.java +++ b/src/test/java/com/TestDefinitionLayer/TC001_E2E_MTR_638.java @@ -1,7 +1,7 @@ package com.TestDefinitionLayer; import com.core.UserActions; -import com.pages.*; +import com.pages.HomePage; import com.reporting.ExtentReports.ExtentTestManager; import io.qameta.allure.Feature; import io.qameta.allure.Link; @@ -24,7 +24,9 @@ public void E2E_MTR_638() { ExtentTestManager.getTest().setDescription(""); try { - + homePage.searchDestination() + .selectDate() + .search(); CreateImageDoc(Tname); } catch (Exception e) { catchBlock(e); diff --git a/src/test/suite/reporting.xml b/src/test/suite/reporting.xml index 0d76a09f..ee6bdf04 100644 --- a/src/test/suite/reporting.xml +++ b/src/test/suite/reporting.xml @@ -1,6 +1,6 @@ - + diff --git a/src/test/suite/testng.xml b/src/test/suite/testng.xml index 3edeb37e..b0a6b266 100644 --- a/src/test/suite/testng.xml +++ b/src/test/suite/testng.xml @@ -6,14 +6,13 @@ - - - + + + - + -