Skip to content

Commit e662d48

Browse files
Merge pull request #2 from aquality-automation/basic/structure
Basic/structure
2 parents c4e68b0 + 9403835 commit e662d48

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1771
-0
lines changed

.gitignore

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Created by .ignore support plugin (hsz.mobi)
2+
### Java template
3+
# Compiled class file
4+
*.class
5+
6+
# Log file
7+
*.log
8+
9+
# BlueJ files
10+
*.ctxt
11+
12+
# Mobile Tools for Java (J2ME)
13+
.mtj.tmp/
14+
15+
# Package Files #
16+
*.jar
17+
*.war
18+
*.nar
19+
*.ear
20+
*.zip
21+
*.tar.gz
22+
*.rar
23+
24+
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
25+
hs_err_pid*
26+
### Maven template
27+
target/
28+
pom.xml.tag
29+
pom.xml.releaseBackup
30+
pom.xml.versionsBackup
31+
pom.xml.next
32+
release.properties
33+
dependency-reduced-pom.xml
34+
buildNumber.properties
35+
.mvn/timing.properties
36+
37+
# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
38+
!/.mvn/wrapper/maven-wrapper.jar
39+
.gitignore
40+
.idea/

pom.xml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.github.aquality-automation</groupId>
8+
<artifactId>aquality-appium</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
<build>
11+
<plugins>
12+
<plugin>
13+
<groupId>org.apache.maven.plugins</groupId>
14+
<artifactId>maven-compiler-plugin</artifactId>
15+
<configuration>
16+
<source>8</source>
17+
<target>8</target>
18+
</configuration>
19+
</plugin>
20+
</plugins>
21+
</build>
22+
<dependencies>
23+
<dependency>
24+
<groupId>com.fasterxml.jackson.core</groupId>
25+
<artifactId>jackson-databind</artifactId>
26+
<version>2.9.9</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>log4j</groupId>
30+
<artifactId>log4j</artifactId>
31+
<version>1.2.17</version>
32+
</dependency>
33+
<dependency>
34+
<groupId>io.appium</groupId>
35+
<artifactId>java-client</artifactId>
36+
<version>5.0.0-BETA6</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.testng</groupId>
40+
<artifactId>testng</artifactId>
41+
<version>6.14.3</version>
42+
<scope>test</scope>
43+
</dependency>
44+
</dependencies>
45+
46+
47+
</project>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IConfiguration;
4+
import aquality.appium.configuration.ITimeoutConfiguration;
5+
import aquality.appium.logger.Logger;
6+
import io.appium.java_client.AppiumDriver;
7+
import org.openqa.selenium.remote.service.DriverService;
8+
9+
public class Application {
10+
11+
private final Logger logger = Logger.getInstance();
12+
private final IConfiguration configuration;
13+
private final ITimeoutConfiguration timeouts;
14+
private Long timeoutImpl;
15+
private final AppiumDriver appiumDriver;
16+
private final DriverService driverService;
17+
18+
public Application(AppiumDriver appiumDriver, IConfiguration configuration) {
19+
this.driverService = null;
20+
this.appiumDriver = appiumDriver;
21+
this.configuration = configuration;
22+
this.timeouts = configuration.getTimeoutConfiguration();
23+
this.timeoutImpl = timeouts.getImplicit();
24+
/*
25+
todo: determine if all of these timeouts are necessary to be set this way
26+
getDriver().manage().timeouts().implicitlyWait(timeoutImpl, TimeUnit.SECONDS);
27+
setPageLoadTimeout(timeouts.getPageLoad());
28+
setScriptTimeout(timeouts.getScript());
29+
*/
30+
}
31+
32+
public Application(DriverService driverService, AppiumDriver appiumDriver, IConfiguration configuration) {
33+
this.driverService = driverService;
34+
this.appiumDriver = appiumDriver;
35+
this.configuration = configuration;
36+
this.timeouts = configuration.getTimeoutConfiguration();
37+
this.timeoutImpl = timeouts.getImplicit();
38+
}
39+
40+
/**
41+
* Provides AppiumDriver instance for current application session
42+
* @return driver instance
43+
*/
44+
public AppiumDriver getDriver() {
45+
return appiumDriver;
46+
}
47+
48+
/**
49+
* Provides current AppiumDriver service instance (would be null if driver is not local)
50+
* @return driver service instance
51+
*/
52+
public DriverService getDriverService() {
53+
return driverService;
54+
}
55+
56+
/**
57+
* Returns name of current platform
58+
* @return name
59+
*/
60+
public final PlatformName getPlatformName() {
61+
return configuration.getApplicationProfile().getPlatformName();
62+
}
63+
64+
public void quit() {
65+
// todo: logger.info(getLocManager().getValue("loc.browser.driver.quit"));
66+
if (getDriver() != null) {
67+
getDriver().quit();
68+
}
69+
70+
if (getDriverService() != null) {
71+
getDriverService().stop();
72+
}
73+
}
74+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IConfiguration;
4+
import aquality.appium.localization.LocalizationManager;
5+
import aquality.appium.logger.Logger;
6+
import io.appium.java_client.AppiumDriver;
7+
import io.appium.java_client.android.AndroidDriver;
8+
import io.appium.java_client.ios.IOSDriver;
9+
import io.appium.java_client.windows.WindowsDriver;
10+
import org.openqa.selenium.Capabilities;
11+
12+
import java.net.URL;
13+
14+
abstract class ApplicationFactory implements IApplicationFactory {
15+
16+
IllegalArgumentException getLoggedWrongPlatformNameException() {
17+
// todo: String message = getLocManager().getValue("loc.browser.name.wrong");
18+
String message = "Platform name is not supported";
19+
IllegalArgumentException exception = new IllegalArgumentException(message);
20+
Logger.getInstance().fatal(message, exception);
21+
return exception;
22+
}
23+
24+
AppiumDriver getDriver(URL serviceUrl, IConfiguration configuration) {
25+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
26+
Capabilities capabilities = configuration.getApplicationProfile().getDriverSettings().getCapabilities();
27+
AppiumDriver driver;
28+
switch (platformName) {
29+
case ANDROID:
30+
driver = new AndroidDriver<>(serviceUrl, capabilities);
31+
break;
32+
case IOS:
33+
driver = new IOSDriver<>(serviceUrl, capabilities);
34+
break;
35+
case WINDOWS:
36+
driver = new WindowsDriver<>(serviceUrl, capabilities);
37+
break;
38+
default:
39+
throw getLoggedWrongPlatformNameException();
40+
}
41+
return driver;
42+
}
43+
44+
void logApplicationIsReady(PlatformName platformName) {
45+
Logger.getInstance().info(getLocManager().getValue("loc.browser.ready"), platformName.toString());
46+
}
47+
48+
private LocalizationManager getLocManager(){
49+
return LocalizationManager.getInstance();
50+
}
51+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.Configuration;
4+
import aquality.appium.configuration.IConfiguration;
5+
6+
public class ApplicationManager {
7+
private static final ThreadLocal<Application> applicationContainer = new ThreadLocal<>();
8+
private static final ThreadLocal<IApplicationFactory> factoryContainer = new ThreadLocal<>();
9+
10+
private ApplicationManager() {
11+
}
12+
13+
14+
public static Application getApplication(){
15+
if(applicationContainer.get() == null || applicationContainer.get().getDriver().getSessionId() == null) {
16+
setDefaultApplication();
17+
}
18+
return applicationContainer.get();
19+
}
20+
21+
public static void setDefaultFactory(){
22+
IConfiguration configuration = Configuration.getInstance();
23+
IApplicationFactory applicationFactory = Configuration.getInstance().getApplicationProfile().isRemote()
24+
? new RemoteApplicationFactory(configuration) : new LocalApplicationFactory(configuration);
25+
26+
setFactory(applicationFactory);
27+
}
28+
29+
public static void setFactory(IApplicationFactory applicationFactory){
30+
remove(factoryContainer);
31+
ApplicationManager.factoryContainer.set(applicationFactory);
32+
}
33+
34+
private static void setDefaultApplication(){
35+
if(factoryContainer.get() == null){
36+
setDefaultFactory();
37+
}
38+
setApplication(factoryContainer.get().getApplication());
39+
}
40+
41+
public static void setApplication(Application application){
42+
remove(applicationContainer);
43+
ApplicationManager.applicationContainer.set(application);
44+
}
45+
46+
private static void remove(ThreadLocal<?> container){
47+
if(container.get() != null){
48+
container.remove();
49+
}
50+
}
51+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package aquality.appium.application;
2+
3+
public interface IApplicationFactory {
4+
5+
Application getApplication();
6+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IConfiguration;
4+
import io.appium.java_client.AppiumDriver;
5+
import io.appium.java_client.service.local.AppiumDriverLocalService;
6+
7+
public class LocalApplicationFactory extends ApplicationFactory {
8+
private final IConfiguration configuration;
9+
10+
public LocalApplicationFactory(IConfiguration configuration){
11+
this.configuration = configuration;
12+
}
13+
14+
@Override
15+
public Application getApplication() {
16+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
17+
AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
18+
service.start();
19+
AppiumDriver driver = getDriver(service.getUrl(), configuration);
20+
logApplicationIsReady(platformName);
21+
return new Application(service, driver, configuration);
22+
}
23+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package aquality.appium.application;
2+
3+
public enum PlatformName {
4+
ANDROID,
5+
IOS,
6+
WINDOWS
7+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IApplicationProfile;
4+
import aquality.appium.configuration.IConfiguration;
5+
import aquality.appium.localization.LocalizationManager;
6+
import aquality.appium.logger.Logger;
7+
import io.appium.java_client.AppiumDriver;
8+
import org.openqa.selenium.remote.LocalFileDetector;
9+
10+
public class RemoteApplicationFactory extends ApplicationFactory {
11+
12+
private final IConfiguration configuration;
13+
14+
public RemoteApplicationFactory(IConfiguration configuration){
15+
this.configuration = configuration;
16+
}
17+
18+
@Override
19+
public Application getApplication() {
20+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
21+
IApplicationProfile applicationProfile = configuration.getApplicationProfile();
22+
Logger.getInstance().info(LocalizationManager.getInstance().getValue("loc.browser.grid"));
23+
AppiumDriver driver = getDriver(applicationProfile.getRemoteConnectionUrl(), configuration);
24+
driver.setFileDetector(new LocalFileDetector());
25+
logApplicationIsReady(platformName);
26+
return new Application(driver, configuration);
27+
}
28+
}

0 commit comments

Comments
 (0)