├── README.md
├── drivers
├── chromedriver
└── chromedriver.exe
├── spring-selenium.iml
├── src
└── test
│ ├── resources
│ ├── twitter-client.properties
│ ├── database-test.properties
│ └── log4j.properties
│ ├── java
│ └── com
│ │ ├── web
│ │ ├── context
│ │ │ ├── driver
│ │ │ │ ├── BrowserType.java
│ │ │ │ ├── DriverManager.java
│ │ │ │ ├── DriverWebTestFactory.java
│ │ │ │ ├── ChromeDriverManager.java
│ │ │ │ └── Browser.java
│ │ │ ├── twitter
│ │ │ │ └── AbstractTwitterTest.java
│ │ │ ├── pages
│ │ │ │ ├── UrlFactory.java
│ │ │ │ └── twitter
│ │ │ │ │ ├── PageObject.java
│ │ │ │ │ └── LoginPage.java
│ │ │ └── AbstractSeleniumTest.java
│ │ ├── tutorial
│ │ │ ├── hibernate
│ │ │ │ ├── BeanTest.java
│ │ │ │ └── BeanSample.java
│ │ │ └── value
│ │ │ │ ├── ValueAnnotationTest.java
│ │ │ │ ├── ValueConfig.java
│ │ │ │ └── TwitterConfigProp.java
│ │ └── test
│ │ │ ├── QueryTest.java
│ │ │ └── TwitterTest.java
│ │ ├── mobile
│ │ ├── context
│ │ │ ├── MobileAppConfig.java
│ │ │ ├── ADBCommands.java
│ │ │ ├── AppiumServer.java
│ │ │ └── DeviceManager.java
│ │ ├── AbstractTest.java
│ │ └── test
│ │ │ └── SampleMobileTest.java
│ │ ├── AppConfig.java
│ │ └── HibernateConfiguration.java
│ └── test.iml
├── .gitignore
└── pom.xml
/README.md:
--------------------------------------------------------------------------------
1 | # spring-selenium
2 |
3 | vm options ;
4 |
5 | -Dbrowser.type=CHROME
6 |
--------------------------------------------------------------------------------
/drivers/chromedriver:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enesaydinqa/spring-selenium/HEAD/drivers/chromedriver
--------------------------------------------------------------------------------
/spring-selenium.iml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/drivers/chromedriver.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enesaydinqa/spring-selenium/HEAD/drivers/chromedriver.exe
--------------------------------------------------------------------------------
/src/test/resources/twitter-client.properties:
--------------------------------------------------------------------------------
1 | test.user.name=SpringUser
2 | test.user.password=springuserpassword
3 | base.url=https://twitter.com/
--------------------------------------------------------------------------------
/src/test/java/com/web/context/driver/BrowserType.java:
--------------------------------------------------------------------------------
1 | package com.web.context.driver;
2 |
3 | public enum BrowserType
4 | {
5 | CHROME,
6 | FIREFOX
7 | }
8 |
--------------------------------------------------------------------------------
/src/test/java/com/web/tutorial/hibernate/BeanTest.java:
--------------------------------------------------------------------------------
1 | package com.web.tutorial.hibernate;
2 |
3 | import org.junit.Test;
4 |
5 | public class BeanTest extends BeanSample
6 | {
7 | @Test
8 | public void testBean()
9 | {
10 |
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /*/.classpath
2 | /*/.project
3 | /*/.settings
4 | /*/logs
5 | /.metadata
6 | /*/target/
7 | /sandbox*/
8 | logs/*
9 | .idea
10 | *.iml
11 | *.class
12 | *.DS_Store
13 | MANIFEST.MF
14 | */src/main/java/META-INF
15 | /*/logs
16 | */nbactions.xml
17 | */nb-configuration.xml
18 | rebel.xml
19 | *~
--------------------------------------------------------------------------------
/src/test/resources/database-test.properties:
--------------------------------------------------------------------------------
1 | database.connection.url.master = jdbc:mysql://localhost:3306/sahibindenqa
2 |
3 | database.connection.driver = com.mysql.cj.jdbc.Driver
4 | database.connection.username = root
5 | database.connection.password = deadlydream61
6 |
7 | database.connection.connectionTimeout = 30000
8 | database.connection.maxLifetime = 80000
9 | database.connection.idleTimeout = 60000
10 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/twitter/AbstractTwitterTest.java:
--------------------------------------------------------------------------------
1 | package com.web.context.twitter;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 |
5 | import com.web.context.AbstractSeleniumTest;
6 | import com.web.tutorial.value.TwitterConfigProp;
7 |
8 | public class AbstractTwitterTest extends AbstractSeleniumTest
9 | {
10 | @Autowired
11 | public TwitterConfigProp twitterConfigProp;
12 | }
--------------------------------------------------------------------------------
/src/test/java/com/mobile/context/MobileAppConfig.java:
--------------------------------------------------------------------------------
1 | package com.mobile.context;
2 |
3 | import org.springframework.context.annotation.ComponentScan;
4 | import org.springframework.context.annotation.Configuration;
5 | import org.springframework.context.annotation.PropertySource;
6 |
7 | @Configuration
8 | @ComponentScan(basePackages = "com.mobile")
9 | @PropertySource(value = {"classpath:/log4j.properties"})
10 | public class MobileAppConfig
11 | {
12 | }
13 |
--------------------------------------------------------------------------------
/src/test/test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/test/java/com/web/test/QueryTest.java:
--------------------------------------------------------------------------------
1 | package com.web.test;
2 |
3 | import com.web.context.twitter.AbstractTwitterTest;
4 | import org.apache.log4j.Logger;
5 | import org.junit.Test;
6 |
7 | public class QueryTest extends AbstractTwitterTest
8 | {
9 | private static final Logger logger = Logger.getLogger(TwitterTest.class);
10 |
11 | @Test
12 | public void testQuery()
13 | {
14 | logger.error(jdbcTemplate.queryForObject("SELECT first_name FROM users WHERE id=1", String.class));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/pages/UrlFactory.java:
--------------------------------------------------------------------------------
1 | package com.web.context.pages;
2 |
3 | public enum UrlFactory
4 | {
5 |
6 | BASE_URL("https://twitter.com"),
7 | LOGIN_PAGE(BASE_URL, "/login"),
8 | HOME_PAGE(BASE_URL, "/home");
9 |
10 | public final String pageUrl;
11 |
12 | UrlFactory(String pageUrl)
13 | {
14 | this.pageUrl = pageUrl;
15 | }
16 |
17 | UrlFactory(UrlFactory baseUrl, String pageUrl)
18 | {
19 | this.pageUrl = baseUrl.pageUrl + pageUrl;
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/pages/twitter/PageObject.java:
--------------------------------------------------------------------------------
1 | package com.web.context.pages.twitter;
2 |
3 | import com.web.context.driver.Browser;
4 | import com.web.context.driver.DriverManager;
5 | import org.openqa.selenium.support.PageFactory;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 |
8 | public class PageObject
9 | {
10 | PageObject(DriverManager driverManager)
11 | {
12 | PageFactory.initElements(driverManager.getWebDriver(), this);
13 | }
14 |
15 | @Autowired
16 | Browser browser;
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/java/com/web/tutorial/value/ValueAnnotationTest.java:
--------------------------------------------------------------------------------
1 | package com.web.tutorial.value;
2 |
3 |
4 | import org.apache.log4j.Logger;
5 | import org.junit.Test;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 |
8 | public class ValueAnnotationTest extends ValueConfig
9 | {
10 | private static final Logger logger = Logger.getLogger(ValueAnnotationTest.class);
11 |
12 | @Autowired
13 | protected TwitterConfigProp twitterConfigProp;
14 |
15 | @Test
16 | public void propFileValueReadTest()
17 | {
18 | logger.info(twitterConfigProp.getBaseUrl());
19 | }
20 | }
--------------------------------------------------------------------------------
/src/test/java/com/web/context/driver/DriverManager.java:
--------------------------------------------------------------------------------
1 | package com.web.context.driver;
2 |
3 | import com.AppConfig;
4 | import org.openqa.selenium.WebDriver;
5 |
6 | public abstract class DriverManager extends AppConfig
7 | {
8 | protected static WebDriver driver;
9 |
10 | protected void createDriver()
11 | {
12 | }
13 |
14 | public WebDriver getWebDriver()
15 | {
16 | if (driver == null)
17 | {
18 | createDriver();
19 | }
20 | return driver;
21 | }
22 |
23 | public static WebDriver getDriver()
24 | {
25 | return driver;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/test/java/com/web/tutorial/value/ValueConfig.java:
--------------------------------------------------------------------------------
1 | package com.web.tutorial.value;
2 |
3 | import org.junit.runner.RunWith;
4 | import org.springframework.context.annotation.ComponentScan;
5 | import org.springframework.context.annotation.PropertySource;
6 | import org.springframework.test.context.ContextConfiguration;
7 | import org.springframework.test.context.junit4.SpringRunner;
8 |
9 | @RunWith(SpringRunner.class)
10 | @PropertySource(value = "classpath:/twitter-client.properties")
11 | @ComponentScan(basePackages = "com.web.tutorial.value")
12 | @ContextConfiguration(classes = ValueConfig.class)
13 | public class ValueConfig
14 | {
15 | }
16 |
--------------------------------------------------------------------------------
/src/test/java/com/mobile/context/ADBCommands.java:
--------------------------------------------------------------------------------
1 | package com.mobile.context;
2 |
3 | public enum ADBCommands
4 | {
5 | ADB_DEVICES("adb devices"),
6 | ADB_RO_BUILD_VERSION_RELEASE("adb -s %s shell getprop ro.build.version.release"),
7 | ADB_RO_PRODUCT_MANUFACTURER("adb -s %s shell getprop ro.product.manufacturer"),
8 | ADB_RO_PRODUCT_MODEL("adb -s %s shell getprop ro.product.model");
9 |
10 | private String adbCommand;
11 |
12 | ADBCommands(String adbCommand)
13 | {
14 | this.adbCommand = adbCommand;
15 | }
16 |
17 | public String getAdbCommand()
18 | {
19 | return adbCommand;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/test/java/com/mobile/AbstractTest.java:
--------------------------------------------------------------------------------
1 | package com.mobile;
2 |
3 | import com.mobile.context.AppiumServer;
4 | import com.mobile.context.DeviceManager;
5 | import com.mobile.context.MobileAppConfig;
6 | import org.junit.runner.RunWith;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.test.context.ContextConfiguration;
9 | import org.springframework.test.context.junit4.SpringRunner;
10 |
11 | @RunWith(SpringRunner.class)
12 | @ContextConfiguration(classes = {MobileAppConfig.class, AppiumServer.class})
13 | public abstract class AbstractTest
14 | {
15 | @Autowired
16 | public DeviceManager deviceManager;
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | # Root logger option
2 | log4j.rootLogger=INFO, file, stdout
3 |
4 | # Direct log messages to a log file
5 | log4j.appender.file=org.apache.log4j.RollingFileAppender
6 | log4j.appender.file.File=logs/console.log
7 | log4j.appender.file.MaxFileSize=50MB
8 | log4j.appender.file.MaxBackupIndex=10
9 | log4j.appender.file.layout=org.apache.log4j.PatternLayout
10 | log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
11 |
12 | # Direct log messages to stdout
13 | log4j.appender.stdout=org.apache.log4j.ConsoleAppender
14 | log4j.appender.stdout.Target=System.out
15 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
16 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
--------------------------------------------------------------------------------
/src/test/java/com/web/test/TwitterTest.java:
--------------------------------------------------------------------------------
1 | package com.web.test;
2 |
3 | import com.web.context.pages.twitter.LoginPage;
4 | import com.web.context.twitter.AbstractTwitterTest;
5 | import org.apache.log4j.Logger;
6 | import org.junit.Test;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 |
9 | public class TwitterTest extends AbstractTwitterTest
10 | {
11 | private static final Logger logger = Logger.getLogger(TwitterTest.class);
12 |
13 | @Autowired
14 | LoginPage loginPage;
15 |
16 | @Test
17 | public void testSuccessfullyLogin()
18 | {
19 | loginPage
20 | .navigateToLoginPage()
21 | .usernameAndPasswordEnter(twitterConfigProp.testUserName, twitterConfigProp.testUserPassword)
22 | .loginButtonClick()
23 | .assertLoggedInUser();
24 | }
25 | }
--------------------------------------------------------------------------------
/src/test/java/com/web/context/driver/DriverWebTestFactory.java:
--------------------------------------------------------------------------------
1 | package com.web.context.driver;
2 |
3 | import org.apache.log4j.Logger;
4 |
5 | public class DriverWebTestFactory
6 | {
7 | private static final Logger logger = Logger.getLogger(DriverWebTestFactory.class);
8 |
9 | public static DriverManager getManager() throws Exception
10 | {
11 | DriverManager driverManager;
12 |
13 | BrowserType browserType = BrowserType.valueOf(System.getProperty("browser.type").toUpperCase());
14 |
15 | logger.info("BrowserType : " + browserType);
16 |
17 | switch (browserType)
18 | {
19 | case CHROME:
20 | driverManager = new ChromeDriverManager();
21 | break;
22 |
23 | default:
24 | throw new Exception("undefined browser type");
25 | }
26 |
27 | return driverManager;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/test/java/com/AppConfig.java:
--------------------------------------------------------------------------------
1 | package com;
2 |
3 | import org.junit.runner.RunWith;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.context.annotation.ComponentScan;
6 | import org.springframework.context.annotation.PropertySource;
7 | import org.springframework.core.annotation.Order;
8 | import org.springframework.jdbc.core.JdbcTemplate;
9 | import org.springframework.test.context.ContextConfiguration;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 |
12 | @Order(0)
13 | @RunWith(SpringRunner.class)
14 | @PropertySource(value =
15 | {
16 | "classpath:/log4j.properties",
17 | "classpath:/twitter-client.properties"
18 | })
19 | @ComponentScan(basePackages = "com.web")
20 | @ContextConfiguration(classes = HibernateConfiguration.class)
21 | public class AppConfig
22 | {
23 | @Autowired
24 | protected JdbcTemplate jdbcTemplate;
25 | }
26 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/AbstractSeleniumTest.java:
--------------------------------------------------------------------------------
1 | package com.web.context;
2 |
3 | import com.AppConfig;
4 | import com.web.context.driver.DriverManager;
5 | import com.web.context.driver.DriverWebTestFactory;
6 | import org.junit.After;
7 | import org.junit.Before;
8 | import org.springframework.test.context.ContextConfiguration;
9 |
10 | @ContextConfiguration(classes = AppConfig.class)
11 | public class AbstractSeleniumTest extends DriverManager
12 | {
13 | @Before
14 | public void setUp() throws Exception
15 | {
16 | init();
17 | }
18 |
19 | private void init() throws Exception
20 | {
21 | DriverManager driverManager;
22 | driverManager = DriverWebTestFactory.getManager();
23 |
24 | driver = driverManager.getWebDriver();
25 | }
26 |
27 | @After
28 | public void tearDown()
29 | {
30 | if (driver != null)
31 | {
32 | driver.quit();
33 | driver = null;
34 | }
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/test/java/com/web/tutorial/value/TwitterConfigProp.java:
--------------------------------------------------------------------------------
1 | package com.web.tutorial.value;
2 |
3 | import org.springframework.beans.factory.annotation.Value;
4 | import org.springframework.stereotype.Component;
5 |
6 | @Component
7 | public class TwitterConfigProp
8 | {
9 | @Value("${test.user.name}")
10 | public String testUserName;
11 |
12 | @Value("${test.user.password}")
13 | public String testUserPassword;
14 |
15 | @Value("${base.url}")
16 | public String baseUrl;
17 |
18 | public String getTestUserName()
19 | {
20 | return testUserName;
21 | }
22 |
23 | public void setTestUserName(String testUserName)
24 | {
25 | this.testUserName = testUserName;
26 | }
27 |
28 | public String getTestUserPassword()
29 | {
30 | return testUserPassword;
31 | }
32 |
33 | public void setTestUserPassword(String testUserPassword)
34 | {
35 | this.testUserPassword = testUserPassword;
36 | }
37 |
38 | public String getBaseUrl()
39 | {
40 | return baseUrl;
41 | }
42 |
43 | public void setBaseUrl(String baseUrl)
44 | {
45 | this.baseUrl = baseUrl;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/test/java/com/web/tutorial/hibernate/BeanSample.java:
--------------------------------------------------------------------------------
1 | package com.web.tutorial.hibernate;
2 |
3 | import com.web.tutorial.value.ValueAnnotationTest;
4 | import org.apache.log4j.Logger;
5 | import org.junit.runner.RunWith;
6 | import org.springframework.context.annotation.Bean;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.test.context.ContextConfiguration;
9 | import org.springframework.test.context.junit4.SpringRunner;
10 |
11 | @RunWith(SpringRunner.class)
12 | @Configuration
13 | @ContextConfiguration(classes = BeanSample.class)
14 | public class BeanSample
15 | {
16 | private static final Logger logger = Logger.getLogger(ValueAnnotationTest.class);
17 |
18 | @Bean
19 | String firstBean()
20 | {
21 | logger.info("firstBean çalıştı");
22 |
23 | return "firstBean";
24 | }
25 |
26 | @Bean
27 | Integer secondBean()
28 | {
29 | logger.info("secondBean çalıştı");
30 |
31 | return 0;
32 | }
33 |
34 | @Bean
35 | Double thirdBean()
36 | {
37 | logger.info("thirdBean çalıştı");
38 |
39 | return 0.0;
40 | }
41 |
42 | @Bean
43 | CharSequence fourthBean()
44 | {
45 | logger.info("fourthBean çalıştı");
46 |
47 | return "fourthBean";
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/test/java/com/HibernateConfiguration.java:
--------------------------------------------------------------------------------
1 | package com;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.context.annotation.PropertySource;
7 | import org.springframework.core.env.Environment;
8 | import org.springframework.jdbc.core.JdbcTemplate;
9 | import org.springframework.jdbc.datasource.DriverManagerDataSource;
10 |
11 | import javax.sql.DataSource;
12 |
13 | @Configuration
14 | @PropertySource("classpath:database-test.properties")
15 | public class HibernateConfiguration
16 | {
17 | @Autowired
18 | private Environment environment;
19 |
20 | @Bean
21 | DataSource dataSource()
22 | {
23 | DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
24 | driverManagerDataSource.setUrl(environment.getRequiredProperty("database.connection.url.master"));
25 | driverManagerDataSource.setUsername(environment.getRequiredProperty("database.connection.username"));
26 | driverManagerDataSource.setPassword(environment.getRequiredProperty("database.connection.password"));
27 | driverManagerDataSource.setDriverClassName(environment.getRequiredProperty("database.connection.driver"));
28 | return driverManagerDataSource;
29 | }
30 |
31 | @Bean
32 | JdbcTemplate jdbcTemplate(DataSource dataSource)
33 | {
34 | JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
35 | jdbcTemplate.setQueryTimeout(60);
36 | return jdbcTemplate;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/pages/twitter/LoginPage.java:
--------------------------------------------------------------------------------
1 | package com.web.context.pages.twitter;
2 |
3 | import com.web.context.driver.DriverManager;
4 | import com.web.context.pages.UrlFactory;
5 | import org.apache.log4j.Logger;
6 | import org.junit.Assert;
7 | import org.openqa.selenium.WebElement;
8 | import org.openqa.selenium.support.FindBy;
9 | import org.springframework.stereotype.Component;
10 |
11 | @Component
12 | public class LoginPage extends PageObject
13 | {
14 | private static final Logger logger = Logger.getLogger(LoginPage.class);
15 |
16 | LoginPage(DriverManager driverManager)
17 | {
18 | super(driverManager);
19 | }
20 |
21 | @FindBy(xpath = "(//input[@name='session[username_or_email]'])")
22 | private WebElement usernameOrEmailInput;
23 |
24 | @FindBy(xpath = "(//input[@name='session[password]'])")
25 | private WebElement passwordInput;
26 |
27 | @FindBy(css = "[data-testid='LoginForm_Login_Button']")
28 | private WebElement logInButton;
29 |
30 | public LoginPage navigateToLoginPage()
31 | {
32 | browser.navigate().to(UrlFactory.LOGIN_PAGE.pageUrl);
33 | return this;
34 | }
35 |
36 | public LoginPage usernameAndPasswordEnter(String username, String password)
37 | {
38 | logger.info("send keys username : " + username);
39 | browser.waitAndSendKeys(usernameOrEmailInput, username);
40 | logger.info("send keys password : " + password);
41 | browser.waitAndSendKeys(passwordInput, password);
42 | return this;
43 | }
44 |
45 | public LoginPage loginButtonClick()
46 | {
47 | browser.waitAndClick(logInButton);
48 | return this;
49 | }
50 |
51 | public LoginPage assertLoggedInUser()
52 | {
53 | browser.sleep(5);
54 | browser.waitForPageLoadComplete();
55 |
56 | Assert.assertEquals(UrlFactory.HOME_PAGE.pageUrl, DriverManager.getDriver().getCurrentUrl());
57 | return this;
58 | }
59 |
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/driver/ChromeDriverManager.java:
--------------------------------------------------------------------------------
1 | package com.web.context.driver;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.openqa.selenium.Platform;
5 | import org.openqa.selenium.chrome.ChromeDriver;
6 | import org.openqa.selenium.chrome.ChromeOptions;
7 | import org.openqa.selenium.remote.DesiredCapabilities;
8 | import org.springframework.stereotype.Component;
9 |
10 | import java.util.HashMap;
11 | import java.util.Map;
12 | import java.util.concurrent.TimeUnit;
13 |
14 | @Component
15 | public class ChromeDriverManager extends DriverManager
16 | {
17 | private static final Logger logger = Logger.getLogger(ChromeDriverManager.class);
18 |
19 | private ChromeOptions chromeOptions;
20 | private DesiredCapabilities desiredCapabilities;
21 |
22 | @Override
23 | public void createDriver()
24 | {
25 | chromeOptions = chromeOptions();
26 |
27 | desiredCapabilities = desiredCapabilities(chromeOptions);
28 |
29 | if (Platform.getCurrent().is(Platform.MAC))
30 | {
31 | System.setProperty("webdriver.chrome.driver", "drivers/chromedriver");
32 | }
33 | else if (Platform.getCurrent().is(Platform.WINDOWS))
34 | {
35 | System.setProperty("webdriver.chrome.driver", "drivers\\chromedriver.exe");
36 | }
37 |
38 | driver = new ChromeDriver(desiredCapabilities);
39 |
40 | driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
41 | driver.manage().timeouts().pageLoadTimeout(90, TimeUnit.SECONDS);
42 | driver.manage().timeouts().setScriptTimeout(90, TimeUnit.SECONDS);
43 | }
44 |
45 | private DesiredCapabilities desiredCapabilities(ChromeOptions chromeOptions)
46 | {
47 | DesiredCapabilities capabilities = new DesiredCapabilities();
48 |
49 | capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
50 |
51 | return capabilities;
52 | }
53 |
54 | private ChromeOptions chromeOptions()
55 | {
56 | ChromeOptions chromeOptions = new ChromeOptions();
57 | chromeOptions.addArguments("disable-infobars");
58 | chromeOptions.addArguments("--window-size=1400,800");
59 | Map prefs = new HashMap<>();
60 | chromeOptions.setExperimentalOption("prefs", prefs);
61 |
62 | return chromeOptions;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/test/java/com/mobile/test/SampleMobileTest.java:
--------------------------------------------------------------------------------
1 | package com.mobile.test;
2 |
3 | import com.mobile.AbstractTest;
4 | import com.mobile.context.ADBCommands;
5 | import com.web.context.driver.DriverManager;
6 | import io.appium.java_client.AppiumDriver;
7 | import io.appium.java_client.android.AndroidDriver;
8 | import io.appium.java_client.remote.MobileCapabilityType;
9 | import org.apache.log4j.Logger;
10 | import org.junit.After;
11 | import org.junit.Before;
12 | import org.junit.Test;
13 | import org.openqa.selenium.remote.DesiredCapabilities;
14 |
15 | import java.io.File;
16 | import java.io.IOException;
17 | import java.net.URL;
18 |
19 | public class SampleMobileTest extends AbstractTest
20 | {
21 | private Logger logger = Logger.getLogger(DriverManager.class);
22 |
23 | public AppiumDriver androidDriver;
24 |
25 | private static final String createDriverUrl = "http://127.0.0.1:8888/wd/hub";
26 |
27 | @Before
28 | public void startApp() throws IOException, InterruptedException
29 | {
30 | DesiredCapabilities capability = new DesiredCapabilities();
31 |
32 | File appDir = new File("/opt/sahibinden/");
33 | File app = new File(appDir, "app-debug.apk");
34 | String uid = deviceManager.getDevicesUID().get(0);
35 | capability.setCapability("platformName", "Android");
36 | capability.setCapability("platformVersion", deviceManager.getDevicesInformation(ADBCommands.ADB_RO_BUILD_VERSION_RELEASE.getAdbCommand(), uid));
37 | capability.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
38 | capability.setCapability("udid", uid);
39 | capability.setCapability("deviceName", "Spring Tutorial Test Device");
40 | capability.setCapability("appPackage", "com.sahibinden");
41 | capability.setCapability("appActivity", "com.sahibinden.ui.supplementary.SplashScreenActivity");
42 | capability.setCapability("autoGrantPermissions", true);
43 | capability.setCapability("fastReset", true);
44 | capability.setCapability("noSign", true);
45 | capability.setCapability("noReset", false);
46 | capability.setCapability("automationName", "UiAutomator2");
47 | capability.setCapability("waitForAppScript", "$.delay(10000); $.acceptAlert();");
48 | capability.setCapability("keystorePath", "/opt/sahibinden/debug.keystore");
49 |
50 | URL url = new URL(createDriverUrl);
51 |
52 | androidDriver = new AndroidDriver(url, capability);
53 | }
54 |
55 | @Test
56 | public void testSample()
57 | {
58 | logger.info("STARTED TEST");
59 | }
60 |
61 | @After
62 | public void quitApp()
63 | {
64 | androidDriver.quit();
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/test/java/com/mobile/context/AppiumServer.java:
--------------------------------------------------------------------------------
1 | package com.mobile.context;
2 |
3 | import io.appium.java_client.service.local.AppiumDriverLocalService;
4 | import io.appium.java_client.service.local.AppiumServiceBuilder;
5 | import io.appium.java_client.service.local.flags.GeneralServerFlag;
6 | import org.apache.log4j.Logger;
7 | import org.openqa.selenium.Platform;
8 | import org.springframework.context.annotation.Bean;
9 | import org.springframework.context.annotation.Configuration;
10 |
11 | import java.io.File;
12 | import java.io.IOException;
13 | import java.net.ServerSocket;
14 |
15 | @Configuration
16 | public class AppiumServer
17 | {
18 | private static final Logger logger = Logger.getLogger(AppiumServer.class);
19 |
20 | private static final String PORT = "8888";
21 |
22 | @Bean
23 | boolean startAppiumServer()
24 | {
25 | if (!checkIfServerIsRunning(PORT))
26 | {
27 | return startAppiumServer("127.0.0.1", PORT);
28 | }
29 | else
30 | {
31 | logger.info("already started appium server");
32 | return true;
33 | }
34 | }
35 |
36 | @Bean
37 | boolean removeDevicesApp()
38 | {
39 | // test devices remove app
40 | return true;
41 | }
42 |
43 | @Bean
44 | boolean removeDevicesUiAutomator()
45 | {
46 | // test devices remove removeDevicesUiAutomator
47 | return true;
48 | }
49 |
50 | private boolean startAppiumServer(String deviceServer, String devicePort)
51 | {
52 | AppiumServiceBuilder builder = new AppiumServiceBuilder();
53 |
54 | try
55 | {
56 | if (Platform.getCurrent().is(Platform.MAC))
57 | {
58 | builder.withAppiumJS(new File("/usr/local/lib/node_modules/appium/build/lib/main.js"));
59 | }
60 |
61 | builder.withIPAddress(deviceServer);
62 | builder.usingPort(Integer.valueOf(devicePort));
63 | builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE);
64 | builder.withArgument(GeneralServerFlag.LOG_LEVEL, "error");
65 |
66 | AppiumDriverLocalService service = AppiumDriverLocalService.buildService(builder);
67 | service.start();
68 | return true;
69 | }
70 | catch (Exception ex)
71 | {
72 | return false;
73 | }
74 | }
75 |
76 | private boolean checkIfServerIsRunning(String port)
77 | {
78 | boolean isServerRunning = false;
79 | ServerSocket serverSocket;
80 | try
81 | {
82 | serverSocket = new ServerSocket(Integer.valueOf(port));
83 | serverSocket.close();
84 | }
85 | catch (IOException e)
86 | {
87 | isServerRunning = true;
88 | }
89 | finally
90 | {
91 | serverSocket = null;
92 | }
93 | return isServerRunning;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/src/test/java/com/mobile/context/DeviceManager.java:
--------------------------------------------------------------------------------
1 | package com.mobile.context;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.springframework.stereotype.Component;
5 |
6 | import java.io.BufferedReader;
7 | import java.io.IOException;
8 | import java.io.InputStreamReader;
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | @Component
13 | public class DeviceManager
14 | {
15 | private static final Logger logger = Logger.getLogger(DeviceManager.class);
16 |
17 | public DeviceManager() throws IOException, InterruptedException
18 | {
19 | List getDevicesUID = getDevicesUID();
20 |
21 | getDevicesUID.forEach(device ->
22 | {
23 | String deviceVersion = getDevicesInformation(ADBCommands.ADB_RO_BUILD_VERSION_RELEASE.getAdbCommand(), device);
24 | String deviceManufacturer = getDevicesInformation(ADBCommands.ADB_RO_PRODUCT_MANUFACTURER.getAdbCommand(), device);
25 | String deviceModel = getDevicesInformation(ADBCommands.ADB_RO_PRODUCT_MODEL.getAdbCommand(), device);
26 |
27 | logger.info("-----------------------------------------------------");
28 | logger.info("device uid : { " + device + " }");
29 | logger.info("device version : { " + deviceVersion + " }");
30 | logger.info("device manufacturer : { " + deviceManufacturer + " }");
31 | logger.info("device model : { " + deviceModel + " }");
32 | logger.info("-----------------------------------------------------");
33 | });
34 | }
35 |
36 | public List getDevicesUID() throws IOException, InterruptedException
37 | {
38 | List devicesUID = new ArrayList<>();
39 |
40 | String command = ADBCommands.ADB_DEVICES.getAdbCommand();
41 |
42 | Process procGetDeviceUID = Runtime.getRuntime().exec(command);
43 |
44 | try (BufferedReader processOutputReader =
45 | new BufferedReader(new InputStreamReader(procGetDeviceUID.getInputStream())))
46 | {
47 | String readLine;
48 |
49 | while ((readLine = processOutputReader.readLine()) != null)
50 | {
51 | if (!readLine.contains("List") & readLine.contains("device"))
52 | {
53 | String result = readLine.split("device")[0].trim();
54 |
55 | devicesUID.add(result);
56 | }
57 | }
58 | procGetDeviceUID.waitFor();
59 | }
60 |
61 | return devicesUID;
62 | }
63 |
64 | public String getDevicesInformation(String adbCommand, String devicesUid)
65 | {
66 | String result = null;
67 |
68 | String command = String.format(adbCommand, devicesUid);
69 |
70 | try
71 | {
72 | Process procGetDeviceOperator = Runtime.getRuntime().exec(command);
73 |
74 | try (BufferedReader processOutputReader =
75 | new BufferedReader(new InputStreamReader(procGetDeviceOperator.getInputStream())))
76 | {
77 | result = processOutputReader.readLine();
78 |
79 | procGetDeviceOperator.waitFor();
80 | }
81 | }
82 | catch (IOException | InterruptedException e)
83 | {
84 | e.printStackTrace();
85 | }
86 |
87 | return result;
88 | }
89 |
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | spring-test-automation
8 | spring-test-automation
9 | 1.0-SNAPSHOT
10 |
11 |
12 |
13 | org.apache.maven.plugins
14 | maven-compiler-plugin
15 |
16 | 8
17 | 8
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | org.seleniumhq.selenium
27 | selenium-java
28 | 3.12.0
29 |
30 |
31 |
32 | junit
33 | junit
34 | 4.12
35 | compile
36 |
37 |
38 |
39 | org.slf4j
40 | slf4j-api
41 | 1.7.5
42 |
43 |
44 |
45 | org.slf4j
46 | slf4j-log4j12
47 | 1.7.5
48 |
49 |
50 |
51 | org.springframework
52 | spring-context
53 | 5.0.6.RELEASE
54 |
55 |
56 | commons-logging
57 | commons-logging
58 |
59 |
60 |
61 |
62 |
63 | org.springframework
64 | spring-jdbc
65 | 5.0.6.RELEASE
66 |
67 |
68 | commons-logging
69 | commons-logging
70 |
71 |
72 |
73 |
74 |
75 | mysql
76 | mysql-connector-java
77 | 8.0.16
78 |
79 |
80 |
81 |
82 | io.appium
83 | java-client
84 | 6.1.0
85 |
86 |
87 |
88 | org.springframework
89 | spring-test
90 | 5.0.6.RELEASE
91 |
92 |
93 | commons-logging
94 | commons-logging
95 |
96 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/src/test/java/com/web/context/driver/Browser.java:
--------------------------------------------------------------------------------
1 | package com.web.context.driver;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.openqa.selenium.By;
5 | import org.openqa.selenium.JavascriptExecutor;
6 | import org.openqa.selenium.WebDriver;
7 | import org.openqa.selenium.WebElement;
8 | import org.openqa.selenium.support.ui.ExpectedCondition;
9 | import org.openqa.selenium.support.ui.ExpectedConditions;
10 | import org.openqa.selenium.support.ui.WebDriverWait;
11 | import org.springframework.stereotype.Component;
12 |
13 | import java.util.List;
14 | import java.util.Set;
15 |
16 | @Component
17 | public class Browser implements WebDriver
18 | {
19 | private static final Logger logger = Logger.getLogger(Browser.class);
20 |
21 | private DriverManager driverManager;
22 | private WebDriverWait webDriverWait;
23 |
24 | Browser(DriverManager driverManager)
25 | {
26 | this.driverManager = driverManager;
27 | }
28 |
29 | @Override
30 | public void get(String s)
31 | {
32 | driverManager.getWebDriver().get(s);
33 | }
34 |
35 | @Override
36 | public String getCurrentUrl()
37 | {
38 | return driverManager.getWebDriver().getCurrentUrl();
39 | }
40 |
41 | @Override
42 | public String getTitle()
43 | {
44 | return driverManager.getWebDriver().getTitle();
45 | }
46 |
47 | @Override
48 | public List findElements(By by)
49 | {
50 | return driverManager.getWebDriver().findElements(by);
51 | }
52 |
53 | @Override
54 | public WebElement findElement(By by)
55 | {
56 | return driverManager.getWebDriver().findElement(by);
57 | }
58 |
59 | @Override
60 | public String getPageSource()
61 | {
62 | return driverManager.getWebDriver().getPageSource();
63 | }
64 |
65 | @Override
66 | public void close()
67 | {
68 | driverManager.getWebDriver().close();
69 | }
70 |
71 | @Override
72 | public void quit()
73 | {
74 | driverManager.getWebDriver().quit();
75 | }
76 |
77 | @Override
78 | public Set getWindowHandles()
79 | {
80 | return driverManager.getWebDriver().getWindowHandles();
81 | }
82 |
83 | @Override
84 | public String getWindowHandle()
85 | {
86 | return driverManager.getWebDriver().getWindowHandle();
87 | }
88 |
89 | @Override
90 | public TargetLocator switchTo()
91 | {
92 | return driverManager.getWebDriver().switchTo();
93 | }
94 |
95 | @Override
96 | public Navigation navigate()
97 | {
98 | return driverManager.getWebDriver().navigate();
99 | }
100 |
101 | @Override
102 | public Options manage()
103 | {
104 | return driverManager.getWebDriver().manage();
105 | }
106 |
107 | public void waitAndSendKeys(WebElement element, String keys)
108 | {
109 | waitUntilVisibilityOf(element);
110 | element.sendKeys(keys);
111 | }
112 |
113 | public void waitAndClick(WebElement element)
114 | {
115 | waitUntilVisibilityOf(element);
116 | waitUntilElementToClickable(element);
117 | element.click();
118 | }
119 |
120 | public void waitUntilVisibilityOf(WebElement element)
121 | {
122 | webDriverWait = new WebDriverWait(driverManager.getWebDriver(), 30);
123 | webDriverWait.until(ExpectedConditions.visibilityOf(element));
124 | }
125 |
126 | public void waitUntilElementToClickable(WebElement element)
127 | {
128 | webDriverWait = new WebDriverWait(driverManager.getWebDriver(), 30);
129 | webDriverWait.until(ExpectedConditions.elementToBeClickable(element));
130 | }
131 |
132 | public void waitForPageLoadComplete()
133 | {
134 | logger.info("waiting for page load complete : " + getCurrentUrl());
135 |
136 | ExpectedCondition pageLoadCondition = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
137 | webDriverWait = new WebDriverWait(driverManager.getWebDriver(), 30);
138 | webDriverWait.until(pageLoadCondition);
139 |
140 | logger.info("page load ready state triggered");
141 | }
142 |
143 | public void sleep(int seconds)
144 | {
145 | try
146 | {
147 | Thread.sleep(seconds * 1000);
148 | }
149 | catch (InterruptedException e)
150 | {
151 | e.printStackTrace();
152 | }
153 | }
154 | }
155 |
--------------------------------------------------------------------------------