├── 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 | --------------------------------------------------------------------------------