├── .idea
├── .name
├── .gitignore
├── vcs.xml
├── compiler.xml
├── encodings.xml
├── misc.xml
├── gradle.xml
├── jarRepositories.xml
└── uiDesigner.xml
├── src
├── test
│ ├── resources
│ │ ├── configuration
│ │ │ ├── accounts.qa.json
│ │ │ ├── app-settings.qa.json
│ │ │ ├── browsers.qa.json
│ │ │ ├── accounts.dev.json
│ │ │ ├── browsers.dev.json
│ │ │ └── app-settings.dev.json
│ │ ├── data
│ │ │ └── data.json
│ │ └── suites
│ │ │ └── example.xml
│ └── java
│ │ ├── pageObjects
│ │ ├── constants
│ │ │ ├── messages
│ │ │ │ └── CommonAssertMessage.java
│ │ │ ├── locators
│ │ │ │ ├── PageTestLesson7Locator.java
│ │ │ │ ├── PageHomeLocator.java
│ │ │ │ └── PageCommonLocator.java
│ │ │ └── texts
│ │ │ │ ├── MenuItem.java
│ │ │ │ └── ButtonName.java
│ │ ├── pages
│ │ │ ├── PageHome.java
│ │ │ ├── PageCommon.java
│ │ │ ├── PageLogin.java
│ │ │ └── PageTestLesson7.java
│ │ └── base
│ │ │ └── PageObjectBase.java
│ │ └── scripts
│ │ ├── base
│ │ └── TestScriptBase.java
│ │ └── features
│ │ ├── TemplateScript.java
│ │ └── TestClass.java
└── main
│ └── java
│ ├── testng
│ ├── annotations
│ │ ├── Name.java
│ │ ├── Description.java
│ │ ├── Precondition.java
│ │ └── Id.java
│ └── TestRunner.java
│ ├── configuration
│ ├── models
│ │ ├── OsPlatform.java
│ │ ├── WebBrowserType.java
│ │ ├── WebUrl.java
│ │ ├── TimeOut.java
│ │ ├── TimeSleep.java
│ │ ├── Options.java
│ │ ├── Account.java
│ │ ├── AppSetting.java
│ │ ├── WebBrowserSetting.java
│ │ └── WebBrowser.java
│ ├── loaders
│ │ ├── AccountLoader.java
│ │ ├── AppSettingLoader.java
│ │ ├── WebBrowserLoader.java
│ │ └── BaseLoader.java
│ └── managers
│ │ ├── AppSettingManager.java
│ │ ├── WebBrowserManager.java
│ │ └── AccountManager.java
│ ├── common
│ ├── AppConstants.java
│ └── StringUtils.java
│ ├── selenium
│ ├── models
│ │ ├── LocatorType.java
│ │ ├── ILocator.java
│ │ ├── IXpathLocator.java
│ │ ├── BaseLocator.java
│ │ ├── Locator.java
│ │ └── XpathLocator.java
│ └── drivers
│ │ ├── WebDriverBase.java
│ │ ├── SafariWebDriver.java
│ │ ├── ChromeWebDriver.java
│ │ ├── FirefoxWebDriver.java
│ │ ├── WebDriverFactory.java
│ │ └── SeleniumGrid.java
│ └── library
│ ├── random
│ ├── RandomNumber.java
│ └── RandomString.java
│ ├── file
│ ├── TextFile.java
│ ├── FileUtils.java
│ └── excels
│ │ └── ReadExcelUtils.java
│ └── system
│ └── Sleep.java
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── README.md
├── .gitignore
├── gradlew.bat
├── gradlew
└── LICENSE
/.idea/.name:
--------------------------------------------------------------------------------
1 | SeleniumFramework
--------------------------------------------------------------------------------
/src/test/resources/configuration/accounts.qa.json:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/test/resources/configuration/app-settings.qa.json:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/test/resources/configuration/browsers.qa.json:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'SeleniumFramework'
2 |
3 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/src/test/resources/data/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "sample": "data value",
3 | "age": 10
4 | }
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luuquangict/selenium-framework/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/src/main/java/testng/annotations/Name.java:
--------------------------------------------------------------------------------
1 | package testng.annotations;
2 |
3 | public @interface Name {
4 | public String value() default "";
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/testng/annotations/Description.java:
--------------------------------------------------------------------------------
1 | package testng.annotations;
2 |
3 | public @interface Description {
4 | public String value() default "";
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/testng/annotations/Precondition.java:
--------------------------------------------------------------------------------
1 | package testng.annotations;
2 |
3 | public @interface Precondition {
4 | public String value() default "";
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/OsPlatform.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | public enum OsPlatform {
4 | Linux,
5 | Mac,
6 | Windows,
7 | Unknown,
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/common/AppConstants.java:
--------------------------------------------------------------------------------
1 | package common;
2 |
3 | public class AppConstants {
4 | public static final String ENVIRONMENT_VARIABLE_NAME = "SELENIUM_FRAMEWORK_ENVIRONMENT";
5 | }
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/main/java/common/StringUtils.java:
--------------------------------------------------------------------------------
1 | package common;
2 |
3 | public class StringUtils {
4 | public static boolean isNullOrEmpty(String str) {
5 | return (str == null || str.isEmpty());
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/selenium/models/LocatorType.java:
--------------------------------------------------------------------------------
1 | package selenium.models;
2 |
3 | public enum LocatorType {
4 | Id,
5 | ClassName,
6 | TagName,
7 | Name,
8 | CssSelector,
9 | Xpath,
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/WebBrowserType.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | public enum WebBrowserType {
4 | Unknown,
5 | Chrome,
6 | Firefox,
7 | Safari,
8 | Edge,
9 | IE,
10 | }
11 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/messages/CommonAssertMessage.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.messages;
2 |
3 | public class CommonAssertMessage {
4 | public static final String NOT_FOUND_ELEMENT = "Not found element: %s";
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/selenium/models/ILocator.java:
--------------------------------------------------------------------------------
1 | package selenium.models;
2 |
3 | import org.openqa.selenium.By;
4 |
5 | public interface ILocator {
6 | By getBy();
7 |
8 | String getValue();
9 |
10 | LocatorType getType();
11 | }
12 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/src/main/java/testng/annotations/Id.java:
--------------------------------------------------------------------------------
1 | package testng.annotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Target;
5 |
6 | @Target(ElementType.TYPE)
7 | public @interface Id {
8 | public String value() default "";
9 | }
10 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/locators/PageTestLesson7Locator.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.locators;
2 |
3 | import selenium.models.Locator;
4 |
5 | public class PageTestLesson7Locator {
6 | public static final Locator lbStatusButton = Locator.byId("lbStatusButton");
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/WebDriverBase.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import org.openqa.selenium.WebDriver;
4 |
5 | public abstract class WebDriverBase {
6 | public WebDriver webDriver;
7 |
8 | public WebDriver getDriver() {
9 | return webDriver;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/WebUrl.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class WebUrl {
6 |
7 | @SerializedName("url")
8 | public String url;
9 |
10 | @SerializedName("enable")
11 | public boolean enable;
12 | }
13 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # selenium-framework
2 | Automation Framework (Java) using Selenium, TestNG
3 |
4 | ### Author:
5 | #### Name: luuquangict
6 | #### Website: https://fresher.dev
7 | #### Group Facebook: https://www.facebook.com/groups/fresher.dev
8 | #### Youtube Chanel: https://www.youtube.com/channel/UCvD-34CtM3g2nNJd1CCB6Kg]
9 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/TimeOut.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class TimeOut {
6 | @SerializedName("pageLoaded")
7 | public int pageLoaded;
8 |
9 | @SerializedName("findElement")
10 | public int findElement;
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/selenium/models/IXpathLocator.java:
--------------------------------------------------------------------------------
1 | package selenium.models;
2 |
3 | public interface IXpathLocator extends ILocator {
4 | XpathLocator addParams(Object... objects);
5 | XpathLocator add(IXpathLocator child);
6 | XpathLocator addParent(IXpathLocator parent);
7 | XpathLocator addIndex(int index);
8 | }
9 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/texts/MenuItem.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.texts;
2 |
3 | public class MenuItem {
4 | public static final String HOME_PAGE = "Home Page";
5 | public static final String REGISTER = "Register";
6 | public static final String ABOUT = "About";
7 | public static final String CONTACT = "Contact";
8 | }
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /build/
3 |
4 | # Ignore Gradle GUI config
5 | gradle-app.setting
6 |
7 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
8 | !gradle-wrapper.jar
9 |
10 | # Cache of project
11 | .gradletasknamecache
12 |
13 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
14 | # gradle/wrapper/gradle-wrapper.properties
15 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/locators/PageHomeLocator.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.locators;
2 |
3 | import selenium.models.Locator;
4 | import selenium.models.XpathLocator;
5 |
6 | public class PageHomeLocator {
7 | public static final XpathLocator locator1 = XpathLocator.create("YOUR_XPATH");
8 | public static final Locator locator2 = Locator.byId("YOUR_ID");
9 | }
--------------------------------------------------------------------------------
/src/test/resources/suites/example.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/TimeSleep.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class TimeSleep {
6 |
7 | @SerializedName("refresh")
8 | public int refreshTime;
9 |
10 | @SerializedName("default")
11 | public int defaultTime;
12 |
13 | @SerializedName("long")
14 | public int longTime;
15 | }
16 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/texts/ButtonName.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.texts;
2 |
3 | public class ButtonName {
4 | public static final String CANCEL = "Cancel";
5 | public static final String YES = "Yes";
6 | public static final String NO = "No";
7 | public static final String REGISTER = "Register";
8 |
9 | public static final String BUTTON1 = "Button 1";
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/Options.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class Options {
6 |
7 | @SerializedName("quitDriver")
8 | public boolean quitDriver;
9 |
10 | @SerializedName("usingCache")
11 | public boolean usingCache;
12 |
13 | @SerializedName("writeLog")
14 | public boolean writeLog;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/configuration/loaders/AccountLoader.java:
--------------------------------------------------------------------------------
1 | package configuration.loaders;
2 |
3 | import configuration.models.Account;
4 |
5 | public class AccountLoader extends BaseLoader {
6 |
7 | public AccountLoader(Class typeOfT) {
8 | super(typeOfT);
9 | }
10 |
11 | @Override
12 | protected String getFileName() {
13 | return "configuration/accounts.%s.json";
14 | }
15 | }
--------------------------------------------------------------------------------
/src/main/java/configuration/loaders/AppSettingLoader.java:
--------------------------------------------------------------------------------
1 | package configuration.loaders;
2 |
3 | import configuration.models.AppSetting;
4 |
5 | public final class AppSettingLoader extends BaseLoader {
6 |
7 | public AppSettingLoader(Class typeOfT) {
8 | super(typeOfT);
9 | }
10 |
11 | @Override
12 | protected String getFileName() {
13 | return "configuration/app-settings.%s.json";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/configuration/loaders/WebBrowserLoader.java:
--------------------------------------------------------------------------------
1 | package configuration.loaders;
2 |
3 | import configuration.models.WebBrowserSetting;
4 |
5 | public class WebBrowserLoader extends BaseLoader {
6 |
7 | public WebBrowserLoader(Class typeOfT) {
8 | super(typeOfT);
9 | }
10 |
11 | @Override
12 | protected String getFileName() {
13 | return "configuration/browsers.%s.json";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/library/random/RandomNumber.java:
--------------------------------------------------------------------------------
1 | package library.random;
2 |
3 | public class RandomNumber {
4 |
5 | public static int random(int min, int max) {
6 | return (int) Math.floor(Math.random() * (max - min + 1) + min);
7 | }
8 |
9 | public static int random(int length) {
10 | int min = (int) Math.pow(10, length);
11 | int max = (int) Math.pow(10, length + 1) - 1;
12 |
13 | return RandomNumber.random(min, max);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/test/resources/configuration/accounts.dev.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "default",
4 | "username": "default",
5 | "password": "123456"
6 | },
7 | {
8 | "name": "admin",
9 | "username": "admin",
10 | "password": "123456"
11 | },
12 | {
13 | "name": "user",
14 | "username": "user",
15 | "password": "123456"
16 | },
17 | {
18 | "name": "invalid",
19 | "username": "invalidusername",
20 | "password": "xxxxxxxx"
21 | }
22 | ]
23 |
--------------------------------------------------------------------------------
/src/main/java/library/file/TextFile.java:
--------------------------------------------------------------------------------
1 | package library.file;
2 |
3 | import com.google.common.base.Charsets;
4 | import com.google.common.io.Files;
5 |
6 | import java.io.File;
7 | import java.io.IOException;
8 |
9 | public class TextFile {
10 | public static String readFile(String filename) {
11 | // TODO: Your code
12 | return null;
13 | }
14 |
15 | public static void appendLine(String filename, String line) {
16 | // TODO: Your code
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/constants/locators/PageCommonLocator.java:
--------------------------------------------------------------------------------
1 | package pageObjects.constants.locators;
2 |
3 | import selenium.models.Locator;
4 | import selenium.models.XpathLocator;
5 |
6 | public class PageCommonLocator {
7 | public static final XpathLocator locator1 = XpathLocator.create("YOUR_XPATH");
8 | public static final Locator locator2 = Locator.byId("YOUR_ID");
9 |
10 | public static final XpathLocator buttonByLabel = XpathLocator.create("//*[contains(@class, 'btn') and text() = '%s']");
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/configuration/managers/AppSettingManager.java:
--------------------------------------------------------------------------------
1 | package configuration.managers;
2 |
3 | import configuration.loaders.AppSettingLoader;
4 | import configuration.models.AppSetting;
5 |
6 | public class AppSettingManager {
7 | private static AppSetting instance;
8 |
9 | public static AppSetting getInstance() {
10 | if (instance == null) {
11 | AppSettingLoader loader = new AppSettingLoader(AppSetting.class);
12 | instance = loader.load();
13 | }
14 | return instance;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/SafariWebDriver.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import org.openqa.selenium.safari.SafariDriver;
4 | import org.openqa.selenium.safari.SafariOptions;
5 |
6 | public class SafariWebDriver extends WebDriverBase {
7 | private SafariOptions options;
8 |
9 | public SafariWebDriver() {
10 | options = new SafariOptions();
11 | super.webDriver = new SafariDriver(options);
12 | }
13 |
14 | public static SafariWebDriver getNewInstance() {
15 | return new SafariWebDriver();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/pages/PageHome.java:
--------------------------------------------------------------------------------
1 | package pageObjects.pages;
2 |
3 | import configuration.models.WebBrowser;
4 | import pageObjects.base.PageObjectBase;
5 | import org.openqa.selenium.WebDriver;
6 |
7 | public class PageHome extends PageObjectBase {
8 |
9 | public PageHome(WebDriver webDriver, WebBrowser currentBrowser) {
10 | super(webDriver, currentBrowser);
11 | }
12 |
13 | public PageHome(WebDriver webDriver, WebBrowser currentBrowser, PageCommon pageCommon) {
14 | super(webDriver, currentBrowser, pageCommon);
15 | }
16 | }
--------------------------------------------------------------------------------
/src/main/java/configuration/managers/WebBrowserManager.java:
--------------------------------------------------------------------------------
1 | package configuration.managers;
2 |
3 | import configuration.loaders.WebBrowserLoader;
4 | import configuration.models.WebBrowserSetting;
5 |
6 | public class WebBrowserManager {
7 | private static WebBrowserSetting instance;
8 |
9 | public static WebBrowserSetting getInstance() {
10 | if (instance == null) {
11 | WebBrowserLoader loader = new WebBrowserLoader(WebBrowserSetting.class);
12 | instance = loader.load();
13 | }
14 |
15 | return instance;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/Account.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class Account {
6 | @SerializedName("name")
7 | private String name;
8 |
9 | @SerializedName("username")
10 | private String username;
11 |
12 | @SerializedName("password")
13 | private String password;
14 |
15 | public String getName() {
16 | return name;
17 | }
18 |
19 | public String getUsername() {
20 | return username;
21 | }
22 |
23 | public String getPassword() {
24 | return password;
25 | }
26 | }
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
16 |
17 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/ChromeWebDriver.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import io.github.bonigarcia.wdm.WebDriverManager;
4 | import org.openqa.selenium.chrome.ChromeDriver;
5 | import org.openqa.selenium.chrome.ChromeOptions;
6 |
7 | public class ChromeWebDriver extends WebDriverBase {
8 | private ChromeOptions options;
9 |
10 | public ChromeWebDriver() {
11 | options = new ChromeOptions();
12 | WebDriverManager.chromedriver().setup();
13 | super.webDriver = new ChromeDriver(options);
14 | }
15 |
16 | public static ChromeWebDriver getNewInstance() {
17 | return new ChromeWebDriver();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/FirefoxWebDriver.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import io.github.bonigarcia.wdm.WebDriverManager;
4 | import org.openqa.selenium.firefox.FirefoxDriver;
5 | import org.openqa.selenium.firefox.FirefoxOptions;
6 |
7 | public class FirefoxWebDriver extends WebDriverBase {
8 | private FirefoxOptions options;
9 |
10 | public FirefoxWebDriver() {
11 | options = new FirefoxOptions();
12 | WebDriverManager.firefoxdriver().setup();
13 | super.webDriver = new FirefoxDriver(options);
14 | }
15 |
16 | public static FirefoxWebDriver getNewInstance() {
17 | return new FirefoxWebDriver();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/library/system/Sleep.java:
--------------------------------------------------------------------------------
1 | package library.system;
2 |
3 | import configuration.managers.AppSettingManager;
4 |
5 | public class Sleep {
6 |
7 | public static void defaultTime() {
8 | sleep(AppSettingManager.getInstance().getTimeSleep().defaultTime);
9 | }
10 |
11 | public static void refreshTime() {
12 | sleep(AppSettingManager.getInstance().getTimeSleep().refreshTime);
13 | }
14 |
15 | public static void longTime() {
16 | sleep(AppSettingManager.getInstance().getTimeSleep().longTime);
17 | }
18 |
19 | private static void sleep(int time) {
20 | try {
21 | Thread.sleep(time);
22 | } catch (Exception e) {
23 | e.printStackTrace();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/library/file/FileUtils.java:
--------------------------------------------------------------------------------
1 | package library.file;
2 |
3 | import configuration.loaders.BaseLoader;
4 |
5 | import java.io.File;
6 | import java.net.URISyntaxException;
7 | import java.net.URL;
8 | import java.util.Objects;
9 |
10 | public class FileUtils {
11 | public static String getResourcePath(String filename) {
12 | try {
13 | ClassLoader classLoader = BaseLoader.class.getClassLoader();
14 | URL url = classLoader.getResource(filename);
15 |
16 | File file = new File(Objects.requireNonNull(url).toURI());
17 | return file.getPath();
18 |
19 | } catch (URISyntaxException ex) {
20 | System.out.println("Could not found filename");
21 | return "";
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/library/random/RandomString.java:
--------------------------------------------------------------------------------
1 | package library.random;
2 |
3 | import org.apache.commons.lang3.RandomStringUtils;
4 |
5 | public class RandomString {
6 | public static String randomAlphabetic(int length) {
7 | return RandomStringUtils.randomAlphabetic(length);
8 | }
9 |
10 | public static String randomNumeric(int length) {
11 | return RandomStringUtils.randomNumeric(length);
12 | }
13 |
14 | public static String randomAlphanumeric(int length) {
15 | return RandomStringUtils.randomAlphanumeric(length / 2)
16 | + RandomStringUtils.randomNumeric(length - length / 2);
17 | }
18 |
19 | public static String getSpecialString(int length) {
20 | return RandomStringUtils.randomGraph(length);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/selenium/models/BaseLocator.java:
--------------------------------------------------------------------------------
1 | package selenium.models;
2 |
3 | import org.openqa.selenium.By;
4 |
5 | public abstract class BaseLocator implements ILocator {
6 | protected LocatorType type;
7 | protected String value;
8 |
9 | @Override
10 | public LocatorType getType() {
11 | return this.type;
12 | }
13 |
14 | @Override
15 | public String getValue() {
16 | return this.value;
17 | }
18 |
19 | @Override
20 | public By getBy() {
21 | switch (this.type) {
22 | case Id:
23 | return By.id(this.value);
24 | case ClassName:
25 | return By.className(this.value);
26 |
27 | default:
28 | return By.xpath(this.value);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/test/resources/configuration/browsers.dev.json:
--------------------------------------------------------------------------------
1 | {
2 | "windows": [
3 | {
4 | "enable": true,
5 | "name": "Chrome"
6 | },
7 | {
8 | "enable": false,
9 | "name": "Firefox"
10 | },
11 | {
12 | "enable": false,
13 | "name": "Edge"
14 | },
15 | {
16 | "enable": false,
17 | "name": "IE"
18 | }
19 | ],
20 | "mac": [
21 | {
22 | "enable": false,
23 | "name": "Chrome"
24 | },
25 | {
26 | "enable": false,
27 | "name": "Firefox"
28 | },
29 | {
30 | "enable": false,
31 | "name": "Safari"
32 | }
33 | ],
34 | "linux": [
35 | {
36 | "enable": false,
37 | "name": "Chrome"
38 | },
39 | {
40 | "enable": false,
41 | "name": "Firefox"
42 | }
43 | ]
44 | }
--------------------------------------------------------------------------------
/src/test/resources/configuration/app-settings.dev.json:
--------------------------------------------------------------------------------
1 | {
2 | "webUrl": [
3 | {
4 | "url": "https://google.com?q=xinchao",
5 | "enable": false
6 | },
7 | {
8 | "url": "https://auto.fresher.dev/lessons/lession7/index.html",
9 | "enable": true
10 | }
11 | ],
12 | "seleniumGrid": {
13 | "enable": false,
14 | "hub": "http://127.0.0.1:4444/wd/hub"
15 | },
16 | "report": {
17 | "text": true,
18 | "csv": true,
19 | "captureScreen": true,
20 | "path": "selenium-reports"
21 | },
22 | "options": {
23 | "quitDriver": true,
24 | "usingCache": false,
25 | "writeLog": true
26 | },
27 | "timeSleep": {
28 | "refresh": 100,
29 | "default": 500,
30 | "long": 5000
31 | },
32 | "timeOut": {
33 | "pageLoaded": 30,
34 | "findElement": 10
35 | }
36 | }
--------------------------------------------------------------------------------
/src/test/java/pageObjects/pages/PageCommon.java:
--------------------------------------------------------------------------------
1 | package pageObjects.pages;
2 |
3 | import configuration.models.WebBrowser;
4 | import pageObjects.base.PageObjectBase;
5 | import library.system.Sleep;
6 | import org.openqa.selenium.WebDriver;
7 | import pageObjects.constants.locators.PageCommonLocator;
8 |
9 | public class PageCommon extends PageObjectBase {
10 |
11 | public PageCommon(WebDriver webDriver, WebBrowser currentBrowser) {
12 | super(webDriver, currentBrowser);
13 | }
14 |
15 | public PageCommon(WebDriver webDriver, WebBrowser currentBrowser, PageCommon pageCommon) {
16 | super(webDriver, currentBrowser, pageCommon);
17 | }
18 |
19 | public void ClickButtonByName(String name) {
20 | Sleep.refreshTime();
21 | clickElement(PageCommonLocator.buttonByLabel.addParams(name));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/WebDriverFactory.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import configuration.models.WebBrowser;
4 | import org.openqa.selenium.WebDriver;
5 | import org.testng.Assert;
6 |
7 | public class WebDriverFactory {
8 |
9 | public static WebDriver initialize(WebBrowser browser) {
10 |
11 | // TODO: Implement selenium grid here
12 |
13 | switch (browser.getType()) {
14 | case Chrome:
15 | return ChromeWebDriver.getNewInstance().getDriver();
16 | case Firefox:
17 | return FirefoxWebDriver.getNewInstance().getDriver();
18 | case Safari:
19 | return SafariWebDriver.getNewInstance().getDriver();
20 |
21 | default: {
22 | Assert.fail("Unknown web browser");
23 | return null;
24 | }
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/selenium/drivers/SeleniumGrid.java:
--------------------------------------------------------------------------------
1 | package selenium.drivers;
2 |
3 | import org.openqa.selenium.WebDriver;
4 | import org.openqa.selenium.remote.Augmenter;
5 | import org.openqa.selenium.remote.DesiredCapabilities;
6 | import org.openqa.selenium.remote.RemoteWebDriver;
7 |
8 | import java.net.MalformedURLException;
9 | import java.net.URL;
10 |
11 | public class SeleniumGrid {
12 | public static WebDriver start(String gridHubUrl, DesiredCapabilities capabilities) {
13 | try {
14 | WebDriver driver = new RemoteWebDriver(new URL(gridHubUrl), capabilities);
15 | return new Augmenter().augment(driver);
16 |
17 | } catch (MalformedURLException e) {
18 | e.printStackTrace();
19 | return null;
20 | } catch (Exception e) {
21 | e.printStackTrace();
22 | return null;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/test/java/scripts/base/TestScriptBase.java:
--------------------------------------------------------------------------------
1 | package scripts.base;
2 |
3 | import configuration.models.WebBrowser;
4 | import pageObjects.pages.PageLogin;
5 | import testng.TestRunner;
6 | import org.openqa.selenium.WebDriver;
7 | import pageObjects.pages.PageCommon;
8 | import pageObjects.pages.PageTestLesson7;
9 |
10 | public abstract class TestScriptBase extends TestRunner {
11 | public TestScriptBase(String name, String version, String osPlatform) {
12 | super(name, version, osPlatform);
13 | }
14 |
15 | protected PageCommon pageCommon;
16 | protected PageTestLesson7 pageTestLesson7;
17 | protected PageLogin pageLogin;
18 |
19 | @Override
20 | protected final void beforeSetup(WebDriver webDriver, WebBrowser currentBrowser) {
21 | // Only create instance for page common here
22 | pageCommon = new PageCommon(webDriver, currentBrowser);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/selenium/models/Locator.java:
--------------------------------------------------------------------------------
1 | package selenium.models;
2 |
3 | public class Locator extends BaseLocator {
4 |
5 | public Locator(LocatorType type, String value) {
6 | this.type = type;
7 | this.value = value;
8 | }
9 |
10 | public static Locator byId(String value) {
11 | return new Locator(LocatorType.Id, value);
12 | }
13 |
14 | public static Locator byClassName(String value) {
15 | return new Locator(LocatorType.ClassName, value);
16 | }
17 |
18 | public static Locator byTagName(String value) {
19 | return new Locator(LocatorType.TagName, value);
20 | }
21 |
22 | public static Locator byName(String value) {
23 | return new Locator(LocatorType.Name, value);
24 | }
25 |
26 | public static Locator byCssSelector(String value) {
27 | return new Locator(LocatorType.CssSelector, value);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/test/java/pageObjects/pages/PageLogin.java:
--------------------------------------------------------------------------------
1 | package pageObjects.pages;
2 |
3 | import configuration.managers.AccountManager;
4 | import configuration.models.Account;
5 | import configuration.models.WebBrowser;
6 | import library.system.Sleep;
7 | import org.openqa.selenium.WebDriver;
8 | import org.testng.Assert;
9 | import pageObjects.base.PageObjectBase;
10 | import pageObjects.constants.locators.PageTestLesson7Locator;
11 | import pageObjects.constants.texts.ButtonName;
12 |
13 | public class PageLogin extends PageObjectBase {
14 | public PageLogin(WebDriver webDriver, WebBrowser currentBrowser) {
15 | super(webDriver, currentBrowser);
16 | }
17 |
18 | public PageLogin(WebDriver webDriver, WebBrowser currentBrowser, PageCommon pageCommon) {
19 | super(webDriver, currentBrowser, pageCommon);
20 | }
21 |
22 |
23 | public void enterUsername(String username) {
24 |
25 | }
26 |
27 | public void enterUsername(Account account) {
28 |
29 | }
30 | }
--------------------------------------------------------------------------------
/src/main/java/configuration/models/AppSetting.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.Arrays;
6 |
7 | public class AppSetting {
8 |
9 | @SerializedName("webUrl")
10 | private WebUrl[] webUrls;
11 |
12 | @SerializedName("timeSleep")
13 | private TimeSleep timeSleep;
14 |
15 | @SerializedName("timeOut")
16 | private TimeOut timeOut;
17 |
18 | @SerializedName("options")
19 | private Options options;
20 |
21 | public String getWebUrl() {
22 | WebUrl webUrl = Arrays.stream(this.webUrls).filter(x -> x.enable).findFirst().orElse(null);
23 | if (webUrl == null)
24 | throw new RuntimeException("Could not found any URL is enabled. Please check app setting file again");
25 |
26 | return webUrl.url;
27 | }
28 |
29 | public TimeSleep getTimeSleep() {
30 | return timeSleep;
31 | }
32 |
33 | public TimeOut getTimeOut() {
34 | return timeOut;
35 | }
36 |
37 | public Options getOptions() {
38 | return options;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/test/java/scripts/features/TemplateScript.java:
--------------------------------------------------------------------------------
1 | package scripts.features;
2 |
3 | import configuration.models.WebBrowser;
4 | import testng.annotations.Description;
5 | import testng.annotations.Id;
6 | import testng.annotations.Name;
7 | import testng.annotations.Precondition;
8 | import org.openqa.selenium.WebDriver;
9 | import org.testng.annotations.Factory;
10 | import scripts.base.TestScriptBase;
11 |
12 | @Id(value = "FD-")
13 | @Name(value = "")
14 | @Description(value = "")
15 | @Precondition(value = "")
16 | public class TemplateScript extends TestScriptBase {
17 | @Factory(dataProvider = "dataProvider")
18 | public TemplateScript(String name, String version, String osPlatform) {
19 | super(name, version, osPlatform);
20 | }
21 |
22 | @Override
23 | protected void setup(WebDriver webDriver, WebBrowser currentBrowser) {
24 | // TODO: Precondition of test script
25 | }
26 |
27 | @Override
28 | protected void run() {
29 | // TODO: Body of test script
30 | }
31 |
32 | @Override
33 | protected void cleanUp() {
34 | // TODO: clean up after run test script
35 | }
36 | }
--------------------------------------------------------------------------------
/src/test/java/pageObjects/pages/PageTestLesson7.java:
--------------------------------------------------------------------------------
1 | package pageObjects.pages;
2 |
3 | import configuration.models.WebBrowser;
4 | import pageObjects.base.PageObjectBase;
5 | import library.system.Sleep;
6 | import org.openqa.selenium.WebDriver;
7 | import org.testng.Assert;
8 | import pageObjects.constants.locators.PageTestLesson7Locator;
9 | import pageObjects.constants.texts.ButtonName;
10 |
11 | public class PageTestLesson7 extends PageObjectBase {
12 | public PageTestLesson7(WebDriver webDriver, WebBrowser currentBrowser) {
13 | super(webDriver, currentBrowser);
14 | }
15 |
16 | public PageTestLesson7(WebDriver webDriver, WebBrowser currentBrowser, PageCommon pageCommon) {
17 | super(webDriver, currentBrowser, pageCommon);
18 | }
19 |
20 | public void clickOnButton1() {
21 | Sleep.refreshTime();
22 | pageCommon.ClickButtonByName(ButtonName.BUTTON1);
23 | Sleep.longTime();
24 | }
25 |
26 | public void verifyTextAfterClickButton1() {
27 | Sleep.refreshTime();
28 | String value = getText(PageTestLesson7Locator.lbStatusButton);
29 | Assert.assertEquals(value, "Click on Button 1");
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/java/configuration/models/WebBrowserSetting.java:
--------------------------------------------------------------------------------
1 | package configuration.models;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 | import java.util.stream.Collectors;
8 |
9 | public class WebBrowserSetting {
10 |
11 | @SerializedName("windows")
12 | private List windows;
13 |
14 | @SerializedName("linux")
15 | private List linux;
16 |
17 | @SerializedName("mac")
18 | private List mac;
19 |
20 | public List