├── .github └── workflows │ └── maven.yml ├── .gitignore ├── .gitmodules ├── CHANGELOG.txt ├── README.md ├── docs ├── allclasses-index.html ├── allpackages-index.html ├── com │ └── anhtester │ │ ├── annotations │ │ ├── FrameworkAnnotation.html │ │ ├── class-use │ │ │ └── FrameworkAnnotation.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── common │ │ ├── BaseTest.html │ │ ├── class-use │ │ │ └── BaseTest.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── config │ │ ├── ConfigFactory.html │ │ ├── Configuration.html │ │ ├── class-use │ │ │ ├── ConfigFactory.html │ │ │ └── Configuration.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── constants │ │ ├── FrameworkConstants.html │ │ ├── class-use │ │ │ └── FrameworkConstants.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── dataprovider │ │ ├── DataProviderAddProduct.html │ │ ├── DataProviderManager.html │ │ ├── class-use │ │ │ ├── DataProviderAddProduct.html │ │ │ └── DataProviderManager.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── driver │ │ ├── BrowserFactory.html │ │ ├── DriverManager.html │ │ ├── TargetFactory.html │ │ ├── class-use │ │ │ ├── BrowserFactory.html │ │ │ ├── DriverManager.html │ │ │ └── TargetFactory.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── enums │ │ ├── AuthorType.html │ │ ├── Browser.html │ │ ├── CategoryType.html │ │ ├── FailureHandling.html │ │ ├── Platform.html │ │ ├── Project.html │ │ ├── Target.html │ │ ├── class-use │ │ │ ├── AuthorType.html │ │ │ ├── Browser.html │ │ │ ├── CategoryType.html │ │ │ ├── FailureHandling.html │ │ │ ├── Platform.html │ │ │ ├── Project.html │ │ │ └── Target.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── exceptions │ │ ├── FrameworkException.html │ │ ├── HeadlessNotSupportedException.html │ │ ├── InvalidPathForExcelException.html │ │ ├── InvalidPathForExtentReportFileException.html │ │ ├── InvalidPathForFilesException.html │ │ ├── InvalidRemoteWebDriverURLException.html │ │ ├── TargetNotValidException.html │ │ ├── class-use │ │ │ ├── FrameworkException.html │ │ │ ├── HeadlessNotSupportedException.html │ │ │ ├── InvalidPathForExcelException.html │ │ │ ├── InvalidPathForExtentReportFileException.html │ │ │ ├── InvalidPathForFilesException.html │ │ │ ├── InvalidRemoteWebDriverURLException.html │ │ │ └── TargetNotValidException.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── helpers │ │ ├── CaptureHelpers.html │ │ ├── DatabaseHelpers.html │ │ ├── ExcelHelpers.html │ │ ├── FileHelpers.html │ │ ├── Helpers.html │ │ ├── JsonHelpers.html │ │ ├── PropertiesHelpers.html │ │ ├── ScreenRecorderHelpers.html │ │ ├── class-use │ │ │ ├── CaptureHelpers.html │ │ │ ├── DatabaseHelpers.html │ │ │ ├── ExcelHelpers.html │ │ │ ├── FileHelpers.html │ │ │ ├── Helpers.html │ │ │ ├── JsonHelpers.html │ │ │ ├── PropertiesHelpers.html │ │ │ └── ScreenRecorderHelpers.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── keywords │ │ ├── WebUI.html │ │ ├── class-use │ │ │ └── WebUI.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── listeners │ │ ├── AllureListener.html │ │ ├── AnnotationTransformer.html │ │ ├── Retry.html │ │ ├── TestListener.html │ │ ├── class-use │ │ │ ├── AllureListener.html │ │ │ ├── AnnotationTransformer.html │ │ │ ├── Retry.html │ │ │ └── TestListener.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── mail │ │ ├── EmailAttachmentsSender.html │ │ ├── EmailConfig.html │ │ ├── class-use │ │ │ ├── EmailAttachmentsSender.html │ │ │ └── EmailConfig.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── projects │ │ ├── App.html │ │ ├── class-use │ │ │ └── App.html │ │ ├── cms │ │ │ ├── CommonPageCMS.html │ │ │ ├── admin │ │ │ │ └── pages │ │ │ │ │ ├── brands │ │ │ │ │ ├── BrandPage.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── BrandPage.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ │ ├── category │ │ │ │ │ ├── CategoryPage.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── CategoryPage.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ │ ├── logins │ │ │ │ │ ├── LoginPageCMS.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── LoginPageCMS.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ │ └── products │ │ │ │ │ ├── AddProductPage.html │ │ │ │ │ ├── class-use │ │ │ │ │ └── AddProductPage.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ ├── class-use │ │ │ │ └── CommonPageCMS.html │ │ │ ├── package-summary.html │ │ │ ├── package-tree.html │ │ │ ├── package-use.html │ │ │ ├── testcases │ │ │ │ ├── AddProductTest.html │ │ │ │ ├── CategoryTest.html │ │ │ │ ├── LoginTest.html │ │ │ │ ├── OrderTest.html │ │ │ │ ├── ProductInfoTest.html │ │ │ │ ├── ProfileTest.html │ │ │ │ ├── class-use │ │ │ │ │ ├── AddProductTest.html │ │ │ │ │ ├── CategoryTest.html │ │ │ │ │ ├── LoginTest.html │ │ │ │ │ ├── OrderTest.html │ │ │ │ │ ├── ProductInfoTest.html │ │ │ │ │ └── ProfileTest.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ └── users │ │ │ │ └── pages │ │ │ │ ├── dashboard │ │ │ │ ├── DashboardPage.html │ │ │ │ ├── class-use │ │ │ │ │ └── DashboardPage.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ ├── order │ │ │ │ ├── OrderPage.html │ │ │ │ ├── class-use │ │ │ │ │ └── OrderPage.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ ├── products │ │ │ │ ├── ProductInfoPageCMS.html │ │ │ │ ├── class-use │ │ │ │ │ └── ProductInfoPageCMS.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ │ └── profiles │ │ │ │ ├── ProfilePage.html │ │ │ │ ├── class-use │ │ │ │ └── ProfilePage.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ ├── crm │ │ │ ├── models │ │ │ │ ├── ClientModel.html │ │ │ │ ├── SignInModel.html │ │ │ │ ├── class-use │ │ │ │ │ ├── ClientModel.html │ │ │ │ │ └── SignInModel.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ ├── pages │ │ │ │ ├── Clients │ │ │ │ │ ├── ClientPageCRM.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── ClientPageCRM.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── CommonPageCRM.html │ │ │ │ ├── Dashboard │ │ │ │ │ ├── DashboardPageCRM.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── DashboardPageCRM.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── Projects │ │ │ │ │ ├── ProjectPageCRM.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── ProjectPageCRM.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── SignIn │ │ │ │ │ ├── SignInPageCRM.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── SignInPageCRM.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── Tasks │ │ │ │ │ ├── TaskPage.html │ │ │ │ │ ├── class-use │ │ │ │ │ │ └── TaskPage.html │ │ │ │ │ ├── package-summary.html │ │ │ │ │ ├── package-tree.html │ │ │ │ │ └── package-use.html │ │ │ │ ├── class-use │ │ │ │ │ └── CommonPageCRM.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ │ └── testcases │ │ │ │ ├── ClientTest.html │ │ │ │ ├── SignInTest.html │ │ │ │ ├── TestHandle.html │ │ │ │ ├── TestSimpleCode.html │ │ │ │ ├── class-use │ │ │ │ ├── ClientTest.html │ │ │ │ ├── SignInTest.html │ │ │ │ ├── TestHandle.html │ │ │ │ └── TestSimpleCode.html │ │ │ │ ├── package-summary.html │ │ │ │ ├── package-tree.html │ │ │ │ └── package-use.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ ├── report │ │ ├── AllureManager.html │ │ ├── ExtentReportManager.html │ │ ├── ExtentTestManager.html │ │ ├── TelegramManager.html │ │ ├── class-use │ │ │ ├── AllureManager.html │ │ │ ├── ExtentReportManager.html │ │ │ ├── ExtentTestManager.html │ │ │ └── TelegramManager.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html │ │ └── utils │ │ ├── BrowserInfoUtils.html │ │ ├── DataFakerUtils.html │ │ ├── DataGenerateUtils.html │ │ ├── DateUtils.html │ │ ├── DecodeUtils.html │ │ ├── EmailSendUtils.html │ │ ├── IconUtils.html │ │ ├── JsonUtils.html │ │ ├── LanguageUtils.html │ │ ├── LocalStorageUtils.html │ │ ├── LogUtils.html │ │ ├── ObjectUtils.html │ │ ├── ReportUtils.html │ │ ├── ZipUtils.html │ │ ├── class-use │ │ ├── BrowserInfoUtils.html │ │ ├── DataFakerUtils.html │ │ ├── DataGenerateUtils.html │ │ ├── DateUtils.html │ │ ├── DecodeUtils.html │ │ ├── EmailSendUtils.html │ │ ├── IconUtils.html │ │ ├── JsonUtils.html │ │ ├── LanguageUtils.html │ │ ├── LocalStorageUtils.html │ │ ├── LogUtils.html │ │ ├── ObjectUtils.html │ │ ├── ReportUtils.html │ │ └── ZipUtils.html │ │ ├── package-summary.html │ │ ├── package-tree.html │ │ └── package-use.html ├── constant-values.html ├── element-list ├── help-doc.html ├── index-files │ ├── index-1.html │ ├── index-10.html │ ├── index-11.html │ ├── index-12.html │ ├── index-13.html │ ├── index-14.html │ ├── index-15.html │ ├── index-16.html │ ├── index-17.html │ ├── index-18.html │ ├── index-19.html │ ├── index-2.html │ ├── index-20.html │ ├── index-21.html │ ├── index-22.html │ ├── index-23.html │ ├── index-24.html │ ├── index-3.html │ ├── index-4.html │ ├── index-5.html │ ├── index-6.html │ ├── index-7.html │ ├── index-8.html │ └── index-9.html ├── index.html ├── jquery-ui.overrides.css ├── legal │ ├── ADDITIONAL_LICENSE_INFO │ ├── ASSEMBLY_EXCEPTION │ ├── LICENSE │ ├── jquery.md │ └── jqueryUI.md ├── member-search-index.js ├── module-search-index.js ├── overview-summary.html ├── overview-tree.html ├── package-search-index.js ├── resources │ ├── glass.png │ └── x.png ├── script-dir │ ├── jquery-3.6.1.min.js │ ├── jquery-ui.min.css │ └── jquery-ui.min.js ├── script.js ├── search.js ├── serialized-form.html ├── stylesheet.css ├── tag-search-index.js └── type-search-index.js ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── anhtester │ │ ├── annotations │ │ └── FrameworkAnnotation.java │ │ ├── config │ │ ├── ConfigFactory.java │ │ └── Configuration.java │ │ ├── constants │ │ └── FrameworkConstants.java │ │ ├── driver │ │ ├── BrowserFactory.java │ │ ├── DriverManager.java │ │ └── TargetFactory.java │ │ ├── enums │ │ ├── AuthorType.java │ │ ├── Browser.java │ │ ├── CategoryType.java │ │ ├── FailureHandling.java │ │ ├── Platform.java │ │ ├── Project.java │ │ └── Target.java │ │ ├── exceptions │ │ ├── FrameworkException.java │ │ ├── HeadlessNotSupportedException.java │ │ ├── InvalidPathForExcelException.java │ │ ├── InvalidPathForExtentReportFileException.java │ │ ├── InvalidPathForFilesException.java │ │ ├── InvalidRemoteWebDriverURLException.java │ │ └── TargetNotValidException.java │ │ ├── helpers │ │ ├── CaptureHelpers.java │ │ ├── DatabaseHelpers.java │ │ ├── ExcelHelpers.java │ │ ├── FileHelpers.java │ │ ├── JsonHelpers.java │ │ ├── PropertiesHelpers.java │ │ ├── ScreenRecorderHelpers.java │ │ └── SystemHelpers.java │ │ ├── mail │ │ ├── EmailAttachmentsSender.java │ │ └── EmailConfig.java │ │ ├── reports │ │ ├── AllureManager.java │ │ ├── ExtentReportManager.java │ │ ├── ExtentTestManager.java │ │ └── TelegramManager.java │ │ └── utils │ │ ├── BrowserInfoUtils.java │ │ ├── DataFakerUtils.java │ │ ├── DataGenerateUtils.java │ │ ├── DateUtils.java │ │ ├── DecodeUtils.java │ │ ├── EmailSendUtils.java │ │ ├── IconUtils.java │ │ ├── JsonUtils.java │ │ ├── LanguageUtils.java │ │ ├── LocalStorageUtils.java │ │ ├── LogUtils.java │ │ ├── ObjectUtils.java │ │ ├── ReportUtils.java │ │ └── ZipUtils.java └── resources │ ├── META-INF │ └── services │ │ └── io.qameta.allure.listener.TestLifecycleListener │ └── log4j2.properties └── test ├── java └── com │ └── anhtester │ ├── common │ └── BaseTest.java │ ├── dataprovider │ ├── DataProviderAddProduct.java │ └── DataProviderManager.java │ ├── listeners │ ├── AllureListener.java │ ├── AnnotationTransformer.java │ ├── Retry.java │ └── TestListener.java │ └── projects │ ├── App.java │ ├── cms │ ├── CommonPageCMS.java │ ├── admin │ │ └── pages │ │ │ ├── brands │ │ │ └── BrandPage.java │ │ │ ├── category │ │ │ └── CategoryPage.java │ │ │ ├── logins │ │ │ └── LoginPageCMS.java │ │ │ └── products │ │ │ └── AddProductPage.java │ ├── testcases │ │ ├── AddProductTest.java │ │ ├── CategoryTest.java │ │ ├── LoginTest.java │ │ ├── OrderTest.java │ │ ├── ProductInfoTest.java │ │ └── ProfileTest.java │ └── users │ │ └── pages │ │ ├── dashboard │ │ └── DashboardPage.java │ │ ├── order │ │ └── OrderPage.java │ │ ├── products │ │ └── ProductInfoPageCMS.java │ │ └── profiles │ │ └── ProfilePage.java │ └── crm │ ├── models │ ├── ClientModel.java │ └── SignInModel.java │ ├── pages │ ├── Clients │ │ └── ClientPageCRM.java │ ├── CommonPageCRM.java │ ├── Dashboard │ │ └── DashboardPageCRM.java │ ├── Projects │ │ └── ProjectPageCRM.java │ ├── SignIn │ │ └── SignInPageCRM.java │ └── Tasks │ │ └── TaskPage.java │ └── testcases │ ├── ClientTest.java │ ├── SignInTest.java │ ├── TestHandle.java │ └── TestSimpleCode.java └── resources ├── config ├── allure.properties ├── allure │ ├── categories.json │ ├── environment.xml │ └── executor.json ├── config.json ├── config.properties └── data.properties ├── datajson ├── arraysample.json ├── book.json ├── store.json └── tools.json ├── objects └── crm_locators.properties ├── pdf-config.json ├── suites ├── BuildApp.xml ├── CMS │ ├── AddProductCMS.xml │ ├── LoginTestCMS.xml │ ├── OrderProductCMS.xml │ ├── ProductInfoCMS.xml │ └── ProfileCMS.xml ├── CRM │ ├── Clients-parallel.xml │ ├── Clients-simple.xml │ ├── Clients-testAddClient.xml │ ├── Clients-testSearch.xml │ ├── SignIn-parallel-methods.xml │ ├── SignIn-parallel-multi-browser.xml │ └── SignIn-simple.xml └── SuiteAll.xml ├── testdataCMS ├── Book1.xlsx ├── CMS_DATA.xlsx ├── Cosy.png ├── GetProductInfo.xlsx ├── Login.xlsx ├── gio-qua-1.jpg ├── gio-qua-2.jpg ├── gio-qua-3.jpg └── gio-qua-4.jpg └── testdataCRM ├── ClientsDataExcel.xlsx ├── DOCX_File_01.docx ├── LoginCSV.csv └── TxtFileData.txt /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Run Maven with GitHub CI 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | pull_request: 10 | branches: [ "main" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: windows-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v4 19 | with: 20 | submodules: recursive 21 | fetch-depth: 0 22 | - name: Set up JDK 17 23 | uses: actions/setup-java@v4 24 | with: 25 | distribution: 'corretto' 26 | java-version: '17' 27 | cache: maven 28 | - name: Run test with Maven 29 | run: mvn clean test allure:report --file pom.xml 30 | 31 | - name: Upload Extent Report 32 | if: always() 33 | uses: actions/upload-artifact@v4 34 | with: 35 | name: extent-report 36 | path: exports/ExtentReports/ExtentReports.html 37 | 38 | - name: Upload Allure Report 39 | if: always() 40 | uses: actions/upload-artifact@v4 41 | with: 42 | name: allure-report 43 | path: target/site/allure-maven-plugin/ 44 | 45 | - name: Upload videos for tests 46 | if: always() 47 | uses: actions/upload-artifact@v4 48 | with: 49 | name: test-videos 50 | path: exports/ExportData/Videos 51 | 52 | - name: Upload screenshots for tests 53 | if: always() 54 | uses: actions/upload-artifact@v4 55 | with: 56 | name: test-screenshots 57 | path: exports/ExportData/Images -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | out/ 3 | .idea/ 4 | .allure/ 5 | allure-results/ 6 | ExportData/ 7 | ExtentReports/ 8 | logs/ 9 | target/ 10 | test-output/ 11 | *.mp4 12 | *.avi 13 | allure-report/ 14 | .allure/ -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/main/java/com/anhtester/keywords"] 2 | path = src/main/java/com/anhtester/keywords 3 | url = https://github.com/anhtester/keywords.git 4 | -------------------------------------------------------------------------------- /docs/com/anhtester/config/class-use/ConfigFactory.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.config.ConfigFactory 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.config.ConfigFactory

53 |
54 | No usage of com.anhtester.config.ConfigFactory
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/constants/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.constants 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.constants

53 |
54 | No usage of com.anhtester.constants
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/dataprovider/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.dataprovider 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.dataprovider

53 |
54 | No usage of com.anhtester.dataprovider
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/driver/class-use/DriverManager.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.driver.DriverManager 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.driver.DriverManager

53 |
54 | No usage of com.anhtester.driver.DriverManager
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/driver/class-use/TargetFactory.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.driver.TargetFactory 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.driver.TargetFactory

53 |
54 | No usage of com.anhtester.driver.TargetFactory
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/CaptureHelpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.CaptureHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.CaptureHelpers

53 |
54 | No usage of com.anhtester.helpers.CaptureHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/DatabaseHelpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.DatabaseHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.DatabaseHelpers

53 |
54 | No usage of com.anhtester.helpers.DatabaseHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/ExcelHelpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.ExcelHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.ExcelHelpers

53 |
54 | No usage of com.anhtester.helpers.ExcelHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/FileHelpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.FileHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.FileHelpers

53 |
54 | No usage of com.anhtester.helpers.FileHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/Helpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.SystemHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.SystemHelpers

53 |
54 | No usage of com.anhtester.helpers.SystemHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/class-use/JsonHelpers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.helpers.JsonHelpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.helpers.JsonHelpers

53 |
54 | No usage of com.anhtester.helpers.JsonHelpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/helpers/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.helpers 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.helpers

53 |
54 | No usage of com.anhtester.helpers
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/keywords/class-use/WebUI.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.keywords.WebUI 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.keywords.WebUI

53 |
54 | No usage of com.anhtester.keywords.WebUI
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/keywords/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.keywords 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.keywords

53 |
54 | No usage of com.anhtester.keywords
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/listeners/class-use/Retry.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.listeners.Retry 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.listeners.Retry

53 |
54 | No usage of com.anhtester.listeners.Retry
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/listeners/class-use/TestListener.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.listeners.TestListener 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.listeners.TestListener

53 |
54 | No usage of com.anhtester.listeners.TestListener
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/listeners/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.listeners 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.listeners

53 |
54 | No usage of com.anhtester.listeners
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/mail/class-use/EmailConfig.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.mail.EmailConfig 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.mail.EmailConfig

53 |
54 | No usage of com.anhtester.mail.EmailConfig
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/mail/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.mail 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.mail

53 |
54 | No usage of com.anhtester.mail
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/projects/class-use/App.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.projects.App 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.projects.App

53 |
54 | No usage of com.anhtester.projects.App
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/projects/cms/testcases/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.projects.cms.testcases 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.projects.cms.testcases

53 |
54 | No usage of com.anhtester.projects.cms.testcases
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/projects/crm/models/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.projects.crm.models 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.projects.crm.models

53 |
54 | No usage of com.anhtester.projects.crm.models
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/projects/crm/testcases/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.projects.crm.testcases 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.projects.crm.testcases

53 |
54 | No usage of com.anhtester.projects.crm.testcases
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/projects/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.projects 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.projects

53 |
54 | No usage of com.anhtester.projects
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/report/class-use/AllureManager.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.reports.AllureManager 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.reports.AllureManager

53 |
54 | No usage of com.anhtester.reports.AllureManager
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/report/class-use/TelegramManager.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.reports.TelegramManager 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.reports.TelegramManager

53 |
54 | No usage of com.anhtester.reports.TelegramManager
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/report/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.reports 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.reports

53 |
54 | No usage of com.anhtester.reports
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/BrowserInfoUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.BrowserInfoUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.BrowserInfoUtils

53 |
54 | No usage of com.anhtester.utils.BrowserInfoUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/DataFakerUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.DataFakerUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.DataFakerUtils

53 |
54 | No usage of com.anhtester.utils.DataFakerUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/DataGenerateUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.DataGenerateUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.DataGenerateUtils

53 |
54 | No usage of com.anhtester.utils.DataGenerateUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/DateUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.DateUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.DateUtils

53 |
54 | No usage of com.anhtester.utils.DateUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/DecodeUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.DecodeUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.DecodeUtils

53 |
54 | No usage of com.anhtester.utils.DecodeUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/EmailSendUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.EmailSendUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.EmailSendUtils

53 |
54 | No usage of com.anhtester.utils.EmailSendUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/IconUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.IconUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.IconUtils

53 |
54 | No usage of com.anhtester.utils.IconUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/JsonUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.JsonUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.JsonUtils

53 |
54 | No usage of com.anhtester.utils.JsonUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/LanguageUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.LanguageUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.LanguageUtils

53 |
54 | No usage of com.anhtester.utils.LanguageUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/LogUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.LogUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.LogUtils

53 |
54 | No usage of com.anhtester.utils.LogUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/ObjectUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.ObjectUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.ObjectUtils

53 |
54 | No usage of com.anhtester.utils.ObjectUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/ReportUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.ReportUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.ReportUtils

53 |
54 | No usage of com.anhtester.utils.ReportUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/class-use/ZipUtils.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Class com.anhtester.utils.ZipUtils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Class
com.anhtester.utils.ZipUtils

53 |
54 | No usage of com.anhtester.utils.ZipUtils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/com/anhtester/utils/package-use.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Uses of Package com.anhtester.utils 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Uses of Package
com.anhtester.utils

53 |
54 | No usage of com.anhtester.utils
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /docs/element-list: -------------------------------------------------------------------------------- 1 | com.anhtester.annotations 2 | com.anhtester.common 3 | com.anhtester.config 4 | com.anhtester.constants 5 | com.anhtester.dataprovider 6 | com.anhtester.driver 7 | com.anhtester.enums 8 | com.anhtester.exceptions 9 | com.anhtester.helpers 10 | com.anhtester.keywords 11 | com.anhtester.listeners 12 | com.anhtester.mail 13 | com.anhtester.projects 14 | com.anhtester.projects.cms 15 | com.anhtester.projects.cms.admin.pages.brands 16 | com.anhtester.projects.cms.admin.pages.category 17 | com.anhtester.projects.cms.admin.pages.logins 18 | com.anhtester.projects.cms.admin.pages.products 19 | com.anhtester.projects.cms.testcases 20 | com.anhtester.projects.cms.users.pages.dashboard 21 | com.anhtester.projects.cms.users.pages.order 22 | com.anhtester.projects.cms.users.pages.products 23 | com.anhtester.projects.cms.users.pages.profiles 24 | com.anhtester.projects.crm.models 25 | com.anhtester.projects.crm.pages 26 | com.anhtester.projects.crm.pages.Clients 27 | com.anhtester.projects.crm.pages.Dashboard 28 | com.anhtester.projects.crm.pages.Projects 29 | com.anhtester.projects.crm.pages.SignIn 30 | com.anhtester.projects.crm.pages.Tasks 31 | com.anhtester.projects.crm.testcases 32 | com.anhtester.reports 33 | com.anhtester.utils 34 | -------------------------------------------------------------------------------- /docs/jquery-ui.overrides.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | .ui-state-active, 27 | .ui-widget-content .ui-state-active, 28 | .ui-widget-header .ui-state-active, 29 | a.ui-button:active, 30 | .ui-button:active, 31 | .ui-button.ui-state-active:hover { 32 | /* Overrides the color of selection used in jQuery UI */ 33 | background: #F8981D; 34 | border: 1px solid #F8981D; 35 | } 36 | -------------------------------------------------------------------------------- /docs/legal/ADDITIONAL_LICENSE_INFO: -------------------------------------------------------------------------------- 1 | Please see ..\java.base\ADDITIONAL_LICENSE_INFO 2 | -------------------------------------------------------------------------------- /docs/legal/ASSEMBLY_EXCEPTION: -------------------------------------------------------------------------------- 1 | Please see ..\java.base\ASSEMBLY_EXCEPTION 2 | -------------------------------------------------------------------------------- /docs/legal/LICENSE: -------------------------------------------------------------------------------- 1 | Please see ..\java.base\LICENSE 2 | -------------------------------------------------------------------------------- /docs/legal/jqueryUI.md: -------------------------------------------------------------------------------- 1 | ## jQuery UI v1.13.2 2 | 3 | ### jQuery UI License 4 | ``` 5 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 6 | 7 | This software consists of voluntary contributions made by many 8 | individuals. For exact contribution history, see the revision history 9 | available at https://github.com/jquery/jquery-ui 10 | 11 | The following license applies to all parts of this software except as 12 | documented below: 13 | 14 | ==== 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining 17 | a copy of this software and associated documentation files (the 18 | "Software"), to deal in the Software without restriction, including 19 | without limitation the rights to use, copy, modify, merge, publish, 20 | distribute, sublicense, and/or sell copies of the Software, and to 21 | permit persons to whom the Software is furnished to do so, subject to 22 | the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be 25 | included in all copies or substantial portions of the Software. 26 | 27 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 28 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 29 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 30 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 31 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 32 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 33 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 34 | 35 | ==== 36 | 37 | Copyright and related rights for sample code are waived via CC0. Sample 38 | code is defined as all source code contained within the demos directory. 39 | 40 | CC0: http://creativecommons.org/publicdomain/zero/1.0/ 41 | 42 | ==== 43 | 44 | All files located in the node_modules and external directories are 45 | externally maintained libraries used by this software which have their 46 | own licenses; we recommend you read them, as their terms may differ from 47 | the terms above. 48 | 49 | ``` 50 | -------------------------------------------------------------------------------- /docs/module-search-index.js: -------------------------------------------------------------------------------- 1 | moduleSearchIndex = [];updateSearchResults(); -------------------------------------------------------------------------------- /docs/overview-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Generated Documentation (Untitled) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 |
20 | 23 |

index.html

24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/package-search-index.js: -------------------------------------------------------------------------------- 1 | packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"com.anhtester.annotations"},{"l":"com.anhtester.common"},{"l":"com.anhtester.config"},{"l":"com.anhtester.constants"},{"l":"com.anhtester.dataprovider"},{"l":"com.anhtester.driver"},{"l":"com.anhtester.enums"},{"l":"com.anhtester.exceptions"},{"l":"com.anhtester.helpers"},{"l":"com.anhtester.keywords"},{"l":"com.anhtester.listeners"},{"l":"com.anhtester.mail"},{"l":"com.anhtester.projects"},{"l":"com.anhtester.projects.cms"},{"l":"com.anhtester.projects.cms.admin.pages.brands"},{"l":"com.anhtester.projects.cms.admin.pages.category"},{"l":"com.anhtester.projects.cms.admin.pages.logins"},{"l":"com.anhtester.projects.cms.admin.pages.products"},{"l":"com.anhtester.projects.cms.testcases"},{"l":"com.anhtester.projects.cms.users.pages.dashboard"},{"l":"com.anhtester.projects.cms.users.pages.order"},{"l":"com.anhtester.projects.cms.users.pages.products"},{"l":"com.anhtester.projects.cms.users.pages.profiles"},{"l":"com.anhtester.projects.crm.models"},{"l":"com.anhtester.projects.crm.pages"},{"l":"com.anhtester.projects.crm.pages.Clients"},{"l":"com.anhtester.projects.crm.pages.Dashboard"},{"l":"com.anhtester.projects.crm.pages.Projects"},{"l":"com.anhtester.projects.crm.pages.SignIn"},{"l":"com.anhtester.projects.crm.pages.Tasks"},{"l":"com.anhtester.projects.crm.testcases"},{"l":"com.anhtester.report"},{"l":"com.anhtester.utils"}];updateSearchResults(); -------------------------------------------------------------------------------- /docs/resources/glass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/docs/resources/glass.png -------------------------------------------------------------------------------- /docs/resources/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/docs/resources/x.png -------------------------------------------------------------------------------- /docs/script-dir/jquery-ui.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.13.2 - 2023-02-27 2 | * http://jqueryui.com 3 | * Includes: core.css, autocomplete.css, menu.css 4 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 5 | 6 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} -------------------------------------------------------------------------------- /docs/tag-search-index.js: -------------------------------------------------------------------------------- 1 | tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"},{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults(); -------------------------------------------------------------------------------- /src/main/java/com/anhtester/annotations/FrameworkAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.annotations; 2 | 3 | import com.anhtester.enums.AuthorType; 4 | import com.anhtester.enums.CategoryType; 5 | 6 | import java.lang.annotation.ElementType; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | 11 | //This is an Custom Annotation 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Target(ElementType.METHOD) 14 | public @interface FrameworkAnnotation { 15 | 16 | // This is not a method 17 | public AuthorType[] author(); 18 | 19 | // public String[] category(); 20 | public CategoryType[] category(); 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/config/ConfigFactory.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.config; 2 | 3 | import org.aeonbits.owner.ConfigCache; 4 | 5 | public class ConfigFactory { 6 | 7 | private ConfigFactory() { 8 | } 9 | 10 | public static Configuration getConfigs() { 11 | return ConfigCache.getOrCreate(Configuration.class); 12 | 13 | } 14 | 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/config/Configuration.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.config; 2 | 3 | import org.aeonbits.owner.Config; 4 | import org.aeonbits.owner.Config.Sources; 5 | import org.aeonbits.owner.Config.LoadPolicy; 6 | import org.aeonbits.owner.Config.LoadType; 7 | 8 | @LoadPolicy(LoadType.MERGE) 9 | @Sources({"system:properties", 10 | "system:env", 11 | "file:./src/test/resources/config/config.properties", 12 | "file:./src/test/resources/config/data.properties"}) 13 | 14 | public interface Configuration extends Config { 15 | 16 | @Key("TARGET") 17 | String TARGET(); 18 | 19 | @Key("BROWSER") 20 | String BROWSER(); 21 | 22 | @Key("HEADLESS") 23 | Boolean HEADLESS(); 24 | 25 | @Key("URL_CRM") 26 | String URL_CRM(); 27 | 28 | @Key("REMOTE_URL") 29 | String REMOTE_URL(); 30 | 31 | @Key("REMOTE_PORT") 32 | String REMOTE_PORT(); 33 | 34 | @Key("EXCEL_DATA_FILE_PATH") 35 | String EXCEL_DATA_FILE_PATH(); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/driver/DriverManager.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.driver; 2 | 3 | import org.openqa.selenium.WebDriver; 4 | 5 | public class DriverManager { 6 | 7 | private static final ThreadLocal driver = new ThreadLocal<>(); 8 | 9 | private DriverManager() { 10 | super(); 11 | } 12 | 13 | public static WebDriver getDriver() { 14 | return driver.get(); 15 | } 16 | 17 | public static void setDriver(WebDriver driver) { 18 | DriverManager.driver.set(driver); 19 | } 20 | 21 | public static void quit() { 22 | if (DriverManager.getDriver() != null){ 23 | DriverManager.getDriver().quit(); 24 | } 25 | } 26 | 27 | // public static String getInfo() { 28 | // Capabilities cap = ((RemoteWebDriver) DriverManager.getDriver()).getCapabilities(); 29 | // String browserName = cap.getBrowserName(); 30 | // String platform = cap.getPlatformName().toString(); 31 | // String version = cap.getBrowserVersion(); 32 | // return String.format("browser: %s v: %s platform: %s", browserName, version, platform); 33 | // } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/AuthorType.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | /** 4 | * A Java Enum is a special Java type used to define collections of constants. 5 | */ 6 | public enum AuthorType { 7 | AnhTester, James, AnVo 8 | } -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/Browser.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | /** 4 | * 5 | */ 6 | public enum Browser { 7 | /** 8 | * 9 | */ 10 | CHROME, EDGE, FIREFOX 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/CategoryType.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | /**A Java Enum is a special Java type used to define collections of constants.*/ 4 | public enum CategoryType { 5 | REGRESSION, 6 | SMOKE, 7 | SANITY 8 | } -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/FailureHandling.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.enums; 7 | 8 | public enum FailureHandling { 9 | STOP_ON_FAILURE, CONTINUE_ON_FAILURE, OPTIONAL 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/Platform.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | public enum Platform { 4 | WEB, MOBILE, DESKTOP 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/Project.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | public enum Project { 4 | CRM, HRM, ECOMMERCE 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/enums/Target.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.enums; 2 | 3 | public enum Target { 4 | LOCAL, REMOTE 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/FrameworkException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022. 3 | * Automation Framework Selenium - Anh Tester 4 | */ 5 | 6 | package com.anhtester.exceptions; 7 | 8 | /** 9 | * FrameworkException extends RuntimeException - because I want to terminate the program when the Exception 10 | * comes 11 | */ 12 | @SuppressWarnings("serial") 13 | public class FrameworkException extends RuntimeException { 14 | 15 | public FrameworkException(String message) { 16 | super(message); 17 | } 18 | 19 | public FrameworkException(String message, Throwable cause) { 20 | super(message, cause); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/HeadlessNotSupportedException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | public class HeadlessNotSupportedException extends IllegalStateException { 4 | 5 | public HeadlessNotSupportedException(String browser) { 6 | super(String.format("Headless not supported for %s browser", browser)); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/InvalidPathForExcelException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | public class InvalidPathForExcelException extends InvalidPathForFilesException{ 4 | 5 | /** 6 | * Pass the message that needs to be appended to the stacktrace 7 | * @param message Details about the exception or custom message 8 | */ 9 | public InvalidPathForExcelException(String message) { 10 | super(message); 11 | } 12 | 13 | /** 14 | * 15 | * @param message Details about the exception or custom message 16 | * @param cause Pass the enriched stacktrace or customised stacktrace 17 | */ 18 | public InvalidPathForExcelException(String message, Throwable cause) { 19 | super(message,cause); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/InvalidPathForExtentReportFileException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | @SuppressWarnings("serial") 4 | public class InvalidPathForExtentReportFileException extends InvalidPathForFilesException { 5 | 6 | public InvalidPathForExtentReportFileException(String message) { 7 | super(message); 8 | } 9 | 10 | public InvalidPathForExtentReportFileException(String message, Throwable cause) { 11 | super(message, cause); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/InvalidPathForFilesException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | @SuppressWarnings("serial") 4 | public class InvalidPathForFilesException extends FrameworkException { 5 | 6 | public InvalidPathForFilesException(String message) { 7 | super(message); 8 | } 9 | 10 | public InvalidPathForFilesException(String message, Throwable cause) { 11 | super(message, cause); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/InvalidRemoteWebDriverURLException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | @SuppressWarnings("serial") 4 | public class InvalidRemoteWebDriverURLException extends FrameworkException { 5 | 6 | public InvalidRemoteWebDriverURLException(String message) { 7 | super(message); 8 | } 9 | 10 | public InvalidRemoteWebDriverURLException(String message, Throwable cause) { 11 | super(message, cause); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/exceptions/TargetNotValidException.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.exceptions; 2 | 3 | public class TargetNotValidException extends IllegalStateException { 4 | 5 | public TargetNotValidException(String target) { 6 | super(String.format("Target %s not supported. Use either local or gird", target)); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/helpers/DatabaseHelpers.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.helpers; 7 | 8 | import java.sql.Connection; 9 | import java.sql.DriverManager; 10 | import java.sql.SQLException; 11 | 12 | public class DatabaseHelpers { 13 | 14 | public DatabaseHelpers() { 15 | super(); 16 | } 17 | 18 | public static Connection getMySQLConnection(String hostName, String dbName, String userName, String password) throws SQLException { 19 | 20 | // Ví dụ: jdbc:mysql://localhost:3306/saleserp 21 | String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName; 22 | 23 | Connection conn = DriverManager.getConnection(connectionURL, userName, password); 24 | 25 | return conn; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/helpers/JsonHelpers.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.helpers; 2 | 3 | import com.jayway.jsonpath.DocumentContext; 4 | import com.jayway.jsonpath.JsonPath; 5 | 6 | import java.io.BufferedReader; 7 | import java.io.FileNotFoundException; 8 | import java.io.FileReader; 9 | import java.io.IOException; 10 | 11 | public class JsonHelpers { 12 | //Json Path 13 | private BufferedReader bufferedReader; 14 | private StringBuffer stringBuffer; 15 | private DocumentContext jsonContext; 16 | private String lines; 17 | private String jsonFilePathDefault = SystemHelpers.getCurrentDir() + "src/test/resources/datajson/store.json"; 18 | 19 | public void setJsonFile(String jsonPath) { 20 | try { 21 | bufferedReader = new BufferedReader(new FileReader(SystemHelpers.getCurrentDir() + jsonPath)); 22 | stringBuffer = new StringBuffer(); 23 | while ((lines = bufferedReader.readLine()) != null) { 24 | stringBuffer.append(lines); 25 | } 26 | jsonContext = JsonPath.parse(stringBuffer.toString()); 27 | } catch (FileNotFoundException e) { 28 | e.printStackTrace(); 29 | } catch (IOException e) { 30 | e.printStackTrace(); 31 | } 32 | } 33 | 34 | public Object getData(String key) { 35 | //JsonPath.read(getJsonDataSourceString(), key); 36 | return jsonContext.read(key); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/mail/EmailConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022. 3 | * Automation Framework Selenium - Anh Tester 4 | */ 5 | 6 | package com.anhtester.mail; 7 | 8 | import static com.anhtester.constants.FrameworkConstants.REPORT_TITLE; 9 | 10 | /** 11 | * Data for Sending email after execution 12 | */ 13 | public class EmailConfig { 14 | 15 | //Remember to create an app password (App Password) for Gmail before sending 16 | //If you use Hosting's email, it's normal 17 | //Enable Override Report and Send mail in config file => src/test/resources/config/config.properties 18 | //OVERRIDE_REPORTS=yes 19 | //send_email_to_users=yes 20 | 21 | public static final String SERVER = "smtp.gmail.com"; 22 | public static final String PORT = "587"; 23 | 24 | public static final String FROM = "anhtester@email.com"; 25 | public static final String PASSWORD = "******"; 26 | 27 | public static final String[] TO = {"anhtester@mailinator.com"}; 28 | public static final String SUBJECT = REPORT_TITLE; 29 | } -------------------------------------------------------------------------------- /src/main/java/com/anhtester/reports/ExtentTestManager.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.reports; 2 | 3 | import com.aventstack.extentreports.ExtentTest; 4 | 5 | public class ExtentTestManager { 6 | 7 | private static ThreadLocal extentTest = new ThreadLocal<>(); 8 | 9 | public static ExtentTest getExtentTest() { 10 | //System.out.println("ExtentTestManager class: " + extentTest.get()); 11 | return extentTest.get(); 12 | } 13 | 14 | public static void setExtentTest(ExtentTest test) { 15 | extentTest.set(test); 16 | } 17 | 18 | public static void unload() { 19 | extentTest.remove(); 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/BrowserInfoUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import org.testng.Reporter; 9 | 10 | import static com.anhtester.constants.FrameworkConstants.BROWSER; 11 | 12 | public final class BrowserInfoUtils { 13 | 14 | private BrowserInfoUtils() { 15 | super(); 16 | } 17 | 18 | private static final String OS = System.getProperty("os.name").toLowerCase(); 19 | 20 | public static String getBrowserInfo() { 21 | String browser = ""; 22 | if (Reporter.getCurrentTestResult().getTestContext().getCurrentXmlTest().getParameter("BROWSER") == null) { 23 | browser = BROWSER.toUpperCase(); 24 | } else { 25 | browser = Reporter.getCurrentTestResult().getTestContext().getCurrentXmlTest().getParameter("BROWSER").trim().toUpperCase(); 26 | } 27 | return browser; 28 | } 29 | 30 | public static String getOSInfo() { 31 | return System.getProperty("os.name"); 32 | } 33 | 34 | public static boolean isWindows() { 35 | return (OS.contains("win")); 36 | } 37 | 38 | public static boolean isMac() { 39 | return (OS.contains("mac")); 40 | } 41 | 42 | public static boolean isUnix() { 43 | return (OS.contains("nix") || OS.contains("nux") || OS.contains("aix")); 44 | } 45 | 46 | public static boolean isSolaris() { 47 | return (OS.contains("sunos")); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/DataFakerUtils.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.utils; 2 | 3 | import com.anhtester.constants.FrameworkConstants; 4 | import net.datafaker.Faker; 5 | 6 | import java.util.Locale; 7 | 8 | public class DataFakerUtils { 9 | //Java Locale List: https://www.viralpatel.net/java-locale-list-tutorial/ 10 | //private static Faker faker = new Faker(new Locale("vi")); //Vietnam 11 | private static Faker faker = null; //English US 12 | 13 | public static Faker getFaker() { 14 | if (faker == null) { 15 | faker = new Faker(new Locale(FrameworkConstants.LOCATE)); 16 | } 17 | return faker; 18 | } 19 | 20 | public static void setFaker(Faker faker) { 21 | DataFakerUtils.faker = faker; 22 | } 23 | 24 | public static void setLocate(String LocateName) { 25 | faker = new Faker(new Locale(LocateName)); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/DateUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import java.text.SimpleDateFormat; 9 | import java.util.Date; 10 | 11 | //final -> We do not want any class to extend this class 12 | public final class DateUtils { 13 | 14 | private DateUtils() { 15 | super(); 16 | } 17 | 18 | /** 19 | * @return lấy ra ngày tháng năm hiện tại của máy theo cấu trúc mặc định 20 | */ 21 | public static String getCurrentDate() { 22 | Date date = new Date(); 23 | return date.toString().replace(":", "_").replace(" ", "_"); 24 | } 25 | 26 | /** 27 | * @return lấy ra ngày tháng năm và giờ phút giây hiện tại của máy theo cấu trúc dd/MM/yyyy HH:mm:ss 28 | */ 29 | public static String getCurrentDateTime() { 30 | Date now = new Date(); 31 | SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 32 | return formatter.format(now); 33 | } 34 | 35 | public static String getCurrentDateTimeCustom(String separator_Character) { 36 | Date now = new Date(); 37 | SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 38 | String timeStamp = formatter.format(now).replace("/", separator_Character); 39 | timeStamp = timeStamp.replace(" ", separator_Character); 40 | timeStamp = timeStamp.replace(":", separator_Character); 41 | return timeStamp; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/DecodeUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import org.apache.commons.codec.binary.Base64; 9 | 10 | import javax.crypto.Cipher; 11 | import javax.crypto.SecretKey; 12 | import javax.crypto.spec.SecretKeySpec; 13 | 14 | public final class DecodeUtils { 15 | 16 | private DecodeUtils() { 17 | super(); 18 | } 19 | 20 | //Encrypt and Decrypt data 21 | 22 | private static final String key1 = "AES"; 23 | private static final String key2 = "AES/ECB/PKCS5Padding"; 24 | 25 | private static String encryptionKeyString = "autotestselenium"; 26 | private static final byte[] encryptionKeyBytes = encryptionKeyString.getBytes(); 27 | 28 | private static SecretKey generateKey() { 29 | SecretKey key = new SecretKeySpec(encryptionKeyBytes, key1); 30 | return key; 31 | } 32 | 33 | public static String encrypt(String Data) { 34 | String encryptedValue = null; 35 | try { 36 | SecretKey key = generateKey(); 37 | Cipher c = Cipher.getInstance(key2); 38 | c.init(Cipher.ENCRYPT_MODE, key); 39 | byte[] encVal = c.doFinal(Data.getBytes()); 40 | encryptedValue = Base64.encodeBase64String(encVal); 41 | } catch (Exception e) { 42 | e.printStackTrace(); 43 | } 44 | return encryptedValue; 45 | } 46 | 47 | public static String decrypt(String encryptedData) { 48 | String decryptedValue = null; 49 | try { 50 | SecretKey key = generateKey(); 51 | Cipher c = Cipher.getInstance(key2); 52 | c.init(Cipher.DECRYPT_MODE, key); 53 | byte[] decordedValue = Base64.decodeBase64(encryptedData); 54 | byte[] decValue = c.doFinal(decordedValue); 55 | decryptedValue = new String(decValue); 56 | } catch (Exception e) { 57 | e.printStackTrace(); 58 | } 59 | return decryptedValue; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/IconUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import com.anhtester.enums.Browser; 9 | 10 | import static com.anhtester.constants.FrameworkConstants.*; 11 | 12 | public final class IconUtils { 13 | 14 | private IconUtils() { 15 | super(); 16 | } 17 | 18 | public static String getBrowserIcon() { 19 | if (BrowserInfoUtils.getBrowserInfo().contains(Browser.CHROME.toString())) { 20 | return ICON_BROWSER_CHROME; 21 | } else if (BrowserInfoUtils.getBrowserInfo().contains(Browser.EDGE.toString())) { 22 | return ICON_BROWSER_EDGE; 23 | } else if (BrowserInfoUtils.getBrowserInfo().contains(Browser.FIREFOX.toString())) { 24 | return ICON_BROWSER_FIREFOX; 25 | } else { 26 | return BrowserInfoUtils.getBrowserInfo(); 27 | } 28 | } 29 | 30 | public static String getOSIcon() { 31 | 32 | String operationSystem = BrowserInfoUtils.getOSInfo().toLowerCase(); 33 | if (operationSystem.contains("win")) { 34 | return ICON_OS_WINDOWS; 35 | } else if (operationSystem.contains("nix") || operationSystem.contains("nux") || operationSystem.contains("aix")) { 36 | return ICON_OS_LINUX; 37 | } else if (operationSystem.contains("mac")) { 38 | return ICON_OS_MAC; 39 | } 40 | return operationSystem; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/LocalStorageUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import com.anhtester.driver.DriverManager; 9 | import org.openqa.selenium.html5.LocalStorage; 10 | import org.openqa.selenium.html5.WebStorage; 11 | 12 | public class LocalStorageUtils { 13 | 14 | private LocalStorageUtils() { 15 | super(); 16 | } 17 | 18 | public static String getItem(String key) { 19 | LocalStorage localStorage = ((WebStorage) DriverManager.getDriver()).getLocalStorage(); 20 | return localStorage.getItem(key); 21 | } 22 | 23 | public static void setItem(String key, String value) { 24 | LocalStorage localStorage = ((WebStorage) DriverManager.getDriver()).getLocalStorage(); 25 | localStorage.setItem(key, value); 26 | } 27 | 28 | public static void removeItem(String key) { 29 | LocalStorage localStorage = ((WebStorage) DriverManager.getDriver()).getLocalStorage(); 30 | localStorage.removeItem(key); 31 | } 32 | 33 | public static void clear() { 34 | LocalStorage localStorage = ((WebStorage) DriverManager.getDriver()).getLocalStorage(); 35 | localStorage.clear(); 36 | } 37 | 38 | public static int size() { 39 | LocalStorage localStorage = ((WebStorage) DriverManager.getDriver()).getLocalStorage(); 40 | return localStorage.size(); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/LogUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import org.apache.logging.log4j.LogManager; 9 | import org.apache.logging.log4j.Logger; 10 | 11 | public class LogUtils { 12 | //Initialize Log4j2 instance 13 | private static final Logger LOGGER = LogManager.getLogger(LogUtils.class); 14 | 15 | //Info Level Logs 16 | public static void info(String message) { 17 | LOGGER.info(message); 18 | } 19 | 20 | public static void info(Object message) { 21 | LOGGER.info(message); 22 | } 23 | 24 | public static void info(String message, Throwable throwable) { 25 | LOGGER.info(message); 26 | } 27 | 28 | //Warn Level Logs 29 | public static void warn(String message) { 30 | LOGGER.warn(message); 31 | } 32 | 33 | public static void warn(Object message) { 34 | LOGGER.warn(message); 35 | } 36 | 37 | //Error Level Logs 38 | public static void error(String message) { 39 | LOGGER.error(message); 40 | } 41 | 42 | public static void error(String message, Throwable throwable) { 43 | LOGGER.error(message); 44 | } 45 | 46 | public static void error(Object message) { 47 | LOGGER.error(message); 48 | } 49 | 50 | public static void error(Object message, Throwable throwable) { 51 | LOGGER.error(message); 52 | } 53 | 54 | //Fatal Level Logs 55 | public static void fatal(String message) { 56 | LOGGER.fatal(message); 57 | } 58 | 59 | public static void fatal(Object message) { 60 | LOGGER.fatal(message); 61 | } 62 | 63 | //Debug Level Logs 64 | public static void debug(String message) { 65 | LOGGER.debug(message); 66 | } 67 | 68 | public static void debug(Object message) { 69 | LOGGER.debug(message); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/anhtester/utils/ReportUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.utils; 7 | 8 | import com.anhtester.exceptions.FrameworkException; 9 | import com.anhtester.exceptions.InvalidPathForExtentReportFileException; 10 | 11 | import java.awt.*; 12 | import java.io.File; 13 | import java.io.FileNotFoundException; 14 | import java.io.IOException; 15 | 16 | import static com.anhtester.constants.FrameworkConstants.*; 17 | 18 | public class ReportUtils { 19 | 20 | private ReportUtils() { 21 | 22 | } 23 | 24 | public static String createExtentReportPath() { 25 | String link = ""; 26 | if (OVERRIDE_REPORTS.trim().equals(NO)) { 27 | System.out.println("OVERRIDE_REPORTS = " + OVERRIDE_REPORTS); 28 | link = EXTENT_REPORT_FOLDER_PATH + File.separator + DateUtils.getCurrentDate() + "_" 29 | + EXTENT_REPORT_FILE_NAME; 30 | System.out.println("Created link reports: " + link); 31 | return link; 32 | } else { 33 | System.out.println("OVERRIDE_REPORTS = " + OVERRIDE_REPORTS); 34 | link = EXTENT_REPORT_FOLDER_PATH + File.separator + EXTENT_REPORT_FILE_NAME; 35 | System.out.println("Created link reports: " + link); 36 | return link; 37 | } 38 | } 39 | 40 | public static void openReports(String linkReport) { 41 | if (OPEN_REPORTS_AFTER_EXECUTION.trim().equalsIgnoreCase(YES)) { 42 | try { 43 | Desktop.getDesktop().browse(new File(linkReport).toURI()); 44 | } catch (FileNotFoundException fileNotFoundException) { 45 | throw new InvalidPathForExtentReportFileException("Extent Report file you are trying to reach is not found", fileNotFoundException.fillInStackTrace()); 46 | } catch (IOException ioException) { 47 | throw new FrameworkException("Extent Report file you are trying to reach got IOException while reading the file", ioException.fillInStackTrace()); 48 | } 49 | } 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/services/io.qameta.allure.listener.TestLifecycleListener: -------------------------------------------------------------------------------- 1 | com.anhtester.listeners.AllureListener -------------------------------------------------------------------------------- /src/main/resources/log4j2.properties: -------------------------------------------------------------------------------- 1 | #Declare loggers 2 | status=info 3 | name=Log4j2PropertiesConfig 4 | appenders=a_console, a_rolling 5 | rootLogger.level=info 6 | rootLogger.appenderRefs=ar_console,ar_rolling 7 | rootLogger.appenderRef.ar_console.ref=StdoutAppender 8 | rootLogger.appenderRef.ar_rolling.ref=RollingAppender 9 | #Console Logger 10 | appender.a_console.type=Console 11 | appender.a_console.name=StdoutAppender 12 | appender.a_console.layout.type=PatternLayout 13 | appender.a_console.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%c{1}] - %msg%n 14 | #Rolling Logger 15 | appender.a_rolling.type=RollingFile 16 | appender.a_rolling.name=RollingAppender 17 | appender.a_rolling.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%t] [%c{1}] - %msg%n 18 | appender.a_rolling.fileName=exports/logs/applog.log 19 | appender.a_rolling.filePattern=exports/logs/applog-%d{dd-MM-yyyy}.log 20 | appender.a_rolling.layout.type=PatternLayout 21 | appender.a_rolling.policies.type=Policies 22 | appender.a_rolling.policies.time.type=TimeBasedTriggeringPolicy 23 | appender.a_rolling.policies.time.interval=1 24 | # To change log file every day 25 | appender.a_rolling.policies.time.modulate=true 26 | # To change log file after 10MB size 27 | appender.a_rolling.policies.size.type=SizeBasedTriggeringPolicy 28 | appender.a_rolling.policies.size.size=10MB 29 | appender.a_rolling.strategy.type=DefaultRolloverStrategy 30 | appender.a_rolling.strategy.max=20 -------------------------------------------------------------------------------- /src/test/java/com/anhtester/common/BaseTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.common; 2 | 3 | import com.anhtester.driver.DriverManager; 4 | import com.anhtester.driver.TargetFactory; 5 | import com.anhtester.helpers.PropertiesHelpers; 6 | import com.anhtester.keywords.WebUI; 7 | import com.anhtester.listeners.AllureListener; 8 | import com.anhtester.listeners.TestListener; 9 | import com.anhtester.projects.cms.CommonPageCMS; 10 | import org.openqa.selenium.WebDriver; 11 | import org.openqa.selenium.support.ThreadGuard; 12 | import org.testng.annotations.*; 13 | 14 | @Listeners({TestListener.class}) 15 | public class BaseTest extends CommonPageCMS { 16 | 17 | @Parameters("BROWSER") 18 | @BeforeMethod 19 | public void createDriver(@Optional("chrome") String browser) { 20 | WebDriver driver = ThreadGuard.protect(new TargetFactory().createInstance(browser)); 21 | DriverManager.setDriver(driver); 22 | driver.manage().window().maximize(); 23 | } 24 | 25 | @AfterMethod(alwaysRun = true) 26 | public void closeDriver() { 27 | WebUI.stopSoftAssertAll(); 28 | DriverManager.quit(); 29 | } 30 | 31 | public WebDriver createBrowser(@Optional("chrome") String browser) { 32 | PropertiesHelpers.loadAllFiles(); 33 | WebDriver driver = ThreadGuard.protect(new TargetFactory().createInstance(browser)); 34 | driver.manage().window().maximize(); 35 | DriverManager.setDriver(driver); 36 | return DriverManager.getDriver(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/dataprovider/DataProviderAddProduct.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.dataprovider; 2 | 3 | import com.anhtester.constants.FrameworkConstants; 4 | import com.anhtester.helpers.ExcelHelpers; 5 | import com.anhtester.helpers.SystemHelpers; 6 | import org.testng.annotations.DataProvider; 7 | 8 | public class DataProviderAddProduct { 9 | @DataProvider(name = "data_provider_add_product") 10 | public Object[][] dataAddProduct() { 11 | ExcelHelpers excelHelpers = new ExcelHelpers(); 12 | Object[][] data = excelHelpers.getDataHashTable(SystemHelpers.getCurrentDir() + FrameworkConstants.EXCEL_CMS_DATA, "AddProduct", 2, 2); 13 | return data; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/listeners/AllureListener.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.listeners; 2 | 3 | import com.anhtester.driver.DriverManager; 4 | import io.qameta.allure.Allure; 5 | import io.qameta.allure.listener.TestLifecycleListener; 6 | import io.qameta.allure.model.Status; 7 | import io.qameta.allure.model.TestResult; 8 | import org.openqa.selenium.OutputType; 9 | import org.openqa.selenium.TakesScreenshot; 10 | 11 | import java.io.ByteArrayInputStream; 12 | 13 | import static com.anhtester.constants.FrameworkConstants.*; 14 | 15 | public class AllureListener implements TestLifecycleListener { 16 | 17 | @Override 18 | public void beforeTestSchedule(TestResult result) { 19 | } 20 | 21 | @Override 22 | public void afterTestSchedule(TestResult result) { 23 | } 24 | 25 | @Override 26 | public void beforeTestUpdate(TestResult result) { 27 | } 28 | 29 | @Override 30 | public void afterTestUpdate(TestResult result) { 31 | } 32 | 33 | @Override 34 | public void beforeTestStart(TestResult result) { 35 | } 36 | 37 | @Override 38 | public void afterTestStart(TestResult result) { 39 | } 40 | 41 | @Override 42 | public void beforeTestStop(TestResult result) { 43 | if (SCREENSHOT_PASSED_TCS.equals(YES) && result.getStatus().equals(Status.PASSED)) { 44 | if (DriverManager.getDriver() != null) { 45 | Allure.addAttachment(result.getName() + "_Passed_Screenshot", new ByteArrayInputStream(((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.BYTES))); 46 | } 47 | } 48 | if (SCREENSHOT_FAILED_TCS.equals(YES) && result.getStatus().equals(Status.FAILED)) { 49 | if (DriverManager.getDriver() != null) { 50 | Allure.addAttachment(result.getName() + "_Failed_Screenshot", new ByteArrayInputStream(((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.BYTES))); 51 | } 52 | } 53 | 54 | //AllureManager.addAttachmentVideoMP4(); 55 | } 56 | 57 | @Override 58 | public void afterTestStop(TestResult result) { 59 | } 60 | 61 | @Override 62 | public void beforeTestWrite(TestResult result) { 63 | } 64 | 65 | @Override 66 | public void afterTestWrite(TestResult result) { 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/listeners/AnnotationTransformer.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.listeners; 2 | 3 | import org.testng.IAnnotationTransformer; 4 | import org.testng.annotations.ITestAnnotation; 5 | 6 | import java.lang.reflect.Constructor; 7 | import java.lang.reflect.Method; 8 | 9 | public class AnnotationTransformer implements IAnnotationTransformer { 10 | @Override 11 | public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 12 | annotation.setRetryAnalyzer(Retry.class); 13 | } 14 | } -------------------------------------------------------------------------------- /src/test/java/com/anhtester/listeners/Retry.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.listeners; 2 | 3 | import com.anhtester.constants.FrameworkConstants; 4 | import org.testng.IRetryAnalyzer; 5 | import org.testng.ITestResult; 6 | 7 | public class Retry implements IRetryAnalyzer { 8 | private int count = 0; 9 | private static int maxTry = Integer.parseInt(FrameworkConstants.RETRY_TEST_FAIL); 10 | 11 | @Override 12 | public boolean retry(ITestResult iTestResult) { 13 | if (!iTestResult.isSuccess()) { //Check if test not succeed 14 | if (count < maxTry) { //Check if maxTry count is reached 15 | count++; //Increase the maxTry count by 1 16 | iTestResult.setStatus(ITestResult.FAILURE); //Mark test as failed 17 | return true; //Tells TestNG to re-run the test 18 | } else { 19 | iTestResult.setStatus(ITestResult.FAILURE); //If maxCount reached,test marked as failed 20 | } 21 | } else { 22 | iTestResult.setStatus(ITestResult.SUCCESS); //If test passes, TestNG marks it as passed 23 | } 24 | return false; 25 | } 26 | } -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/App.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects; 2 | 3 | import com.anhtester.helpers.SystemHelpers; 4 | import com.anhtester.utils.LogUtils; 5 | import org.testng.annotations.Test; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.IOException; 9 | import java.io.InputStreamReader; 10 | 11 | public class App { 12 | public static void main(String[] args) throws IOException, InterruptedException { 13 | LogUtils.info("Build success !!"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/admin/pages/brands/BrandPage.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.admin.pages.brands; 2 | 3 | public class BrandPage { 4 | } 5 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/admin/pages/category/CategoryPage.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.admin.pages.category; 2 | 3 | import org.openqa.selenium.By; 4 | import org.openqa.selenium.Keys; 5 | 6 | import static com.anhtester.keywords.WebUI.*; 7 | 8 | public class CategoryPage { 9 | 10 | private By buttonAddNewCategory = By.xpath("//span[normalize-space()='Add New category']"); 11 | private By inputCategoryName = By.xpath("//input[@id='name']"); 12 | private By inputOrderingNumber = By.xpath("//input[@id='order_level']"); 13 | private By inputMetaTitle = By.xpath("//input[@placeholder='Meta Title']"); 14 | private By inputMetaDescription = By.xpath("//textarea[@name='meta_description']"); 15 | private By buttonSave = By.xpath("//button[normalize-space()='Save']"); 16 | private By messageAlert = By.xpath("//span[@data-notify='message']"); 17 | private By inputSearch = By.xpath("//input[@id='search']"); 18 | private By categoryNameFirstRow = By.xpath("//tbody/tr[1]/td[2]"); 19 | 20 | public CategoryPage clickAddNewButton() { 21 | clickElement(buttonAddNewCategory); 22 | return this; 23 | } 24 | 25 | public CategoryPage searchCategory(String categoryName) { 26 | waitForPageLoaded(); 27 | setText(inputSearch, categoryName, Keys.ENTER); 28 | return this; 29 | } 30 | 31 | public CategoryPage checkCategoryDisplayed(String categoryName) { 32 | searchCategory(categoryName); 33 | verifyElementVisible(categoryNameFirstRow, "The new category not found."); 34 | verifyEquals(getTextElement(categoryNameFirstRow), categoryName, "The new category name not match."); 35 | return this; 36 | } 37 | 38 | public CategoryPage inputDataCategory(String categoryName, String orderNumber, String metaTitle, String description) { 39 | waitForPageLoaded(); 40 | setText(inputCategoryName, categoryName); 41 | setText(inputOrderingNumber, orderNumber); 42 | setText(inputMetaTitle, metaTitle); 43 | setText(inputMetaDescription, description); 44 | return this; 45 | } 46 | 47 | public CategoryPage clickSaveButton() { 48 | clickElement(buttonSave); 49 | return this; 50 | } 51 | 52 | public void verifyAlertSuccessDisplayed() { 53 | verifyElementVisible(messageAlert, "The alert message success not visible."); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/AddProductTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.dataprovider.DataProviderAddProduct; 6 | import com.anhtester.helpers.ExcelHelpers; 7 | import io.qameta.allure.Epic; 8 | import io.qameta.allure.Feature; 9 | import org.testng.annotations.Test; 10 | 11 | import java.util.Hashtable; 12 | 13 | @Epic("Regression Test CMS") 14 | @Feature("Add Product Test") 15 | public class AddProductTest extends BaseTest { 16 | 17 | @Test(dataProvider = "data_provider_add_product", dataProviderClass = DataProviderAddProduct.class) 18 | public void TC_AddNewProductAdmin(Hashtable data) { 19 | ExcelHelpers excelLogin = new ExcelHelpers(); 20 | ExcelHelpers excelAddProduct = new ExcelHelpers(); 21 | excelLogin.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 22 | excelAddProduct.setExcelFile(FrameworkConstants.EXCEL_CMS_DATA, "AddProduct"); 23 | getLoginPageCMS().loginSuccessAdminPage(excelLogin.getCellData(5, "email"), excelLogin.getCellData(5, "password")); 24 | getAddProductPage().addProduct(data.get("productName"), data.get("category"), data.get("unit"), data.get("weight"), data.get("tags"), data.get("unitPrice"), data.get("discountDate"), data.get("quantity"), data.get("description"), data.get("discount"), data.get("image")); 25 | getAddProductPage().verifyNewProduct(data.get("category"), data.get("unit"), Double.valueOf(data.get("unitPrice")), data.get("description")); 26 | 27 | } 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/CategoryTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.helpers.ExcelHelpers; 6 | import com.anhtester.projects.cms.CommonPageCMS; 7 | import com.anhtester.projects.cms.admin.pages.category.CategoryPage; 8 | import com.anhtester.projects.cms.admin.pages.logins.LoginPageCMS; 9 | import org.testng.annotations.Test; 10 | 11 | public class CategoryTest extends BaseTest { 12 | 13 | LoginPageCMS loginPageCMS; 14 | CategoryPage categoryPage; 15 | CommonPageCMS commonPageCMS; 16 | ExcelHelpers excelHelpers; 17 | 18 | public CategoryTest() { 19 | commonPageCMS = new CommonPageCMS(); 20 | loginPageCMS = new LoginPageCMS(); 21 | excelHelpers = new ExcelHelpers(); 22 | } 23 | 24 | @Test 25 | public void TC_AddCategory() { 26 | loginPageCMS.loginSuccessAdminPage(); 27 | categoryPage = commonPageCMS.clickMenuProducts().clickMenuCategory(); 28 | excelHelpers.setExcelFile(FrameworkConstants.EXCEL_CMS_DATA, "Category"); 29 | //category_name order_number meta_title description 30 | categoryPage.clickAddNewButton() 31 | .inputDataCategory( 32 | excelHelpers.getCellData("category_name", 1), 33 | excelHelpers.getCellData("order_number", 1), 34 | excelHelpers.getCellData("meta_title", 1), 35 | excelHelpers.getCellData("description", 1) 36 | ) 37 | .clickSaveButton() 38 | .checkCategoryDisplayed(excelHelpers.getCellData("category_name", 1)); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/LoginTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.helpers.ExcelHelpers; 6 | import io.qameta.allure.Epic; 7 | import io.qameta.allure.Feature; 8 | import org.testng.annotations.Test; 9 | 10 | @Epic("Regression Test CMS") 11 | @Feature("Login Test") 12 | public class LoginTest extends BaseTest { 13 | 14 | @Test(priority = 1) 15 | public void TC_LoginFailWithEmailNull() { 16 | getLoginPageCMS().loginFailWithEmailNull(); 17 | } 18 | 19 | @Test(priority = 2) 20 | public void TC_LoginFailWithEmailDoesNotExist() { 21 | ExcelHelpers excel = new ExcelHelpers(); 22 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 23 | getLoginPageCMS().loginFailWithEmailDoesNotExist(excel.getCellData(1, "email"), excel.getCellData(1, "password")); 24 | } 25 | 26 | @Test(priority = 3) 27 | public void TC_LoginFailWithNullPassword() { 28 | ExcelHelpers excel = new ExcelHelpers(); 29 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 30 | getLoginPageCMS().loginFailWithNullPassword(excel.getCellData(2, "email")); 31 | } 32 | 33 | @Test(priority = 4) 34 | public void TC_LoginFailWithIncorrectPassword() { 35 | ExcelHelpers excel = new ExcelHelpers(); 36 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 37 | getLoginPageCMS().loginFailWithIncorrectPassword(excel.getCellData(3, "email"), excel.getCellData(3, "password")); 38 | } 39 | 40 | @Test(priority = 5) 41 | public void TC_LoginSuccessWithCustomerAccount() { 42 | ExcelHelpers excel = new ExcelHelpers(); 43 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 44 | getLoginPageCMS().loginSuccessWithCustomerAccount(excel.getCellData(4, "email"), excel.getCellData(4, "password")); 45 | } 46 | 47 | // @Test(priority = 6) 48 | // public void TC_LoginSuccessAdminPage() { 49 | // excel = new ExcelHelpers(); 50 | // excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 51 | // getLoginPageCMS().loginSuccessAdminPage(excel.getCellData(5, "email"), excel.getCellData(5, "password")); 52 | // } 53 | } 54 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/OrderTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.helpers.ExcelHelpers; 6 | import io.qameta.allure.Epic; 7 | import io.qameta.allure.Feature; 8 | import org.testng.annotations.Test; 9 | 10 | @Epic("Regression Test CMS") 11 | @Feature("Order Product Test") 12 | public class OrderTest extends BaseTest { 13 | 14 | @Test 15 | public void TC_OrderProduct() { 16 | ExcelHelpers excel = new ExcelHelpers(); 17 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 18 | getLoginPageCMS().loginSuccessWithCustomerAccount(excel.getCellData(4, "email"), excel.getCellData(4, "password")); 19 | getOrderPage().order("Delivery as soon as possible"); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/ProductInfoTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.helpers.ExcelHelpers; 6 | import com.anhtester.helpers.PropertiesHelpers; 7 | import org.testng.annotations.Test; 8 | 9 | import java.util.ArrayList; 10 | 11 | public class ProductInfoTest extends BaseTest { 12 | 13 | @Test 14 | public void TC_GetProductInfo() { 15 | ExcelHelpers excel = new ExcelHelpers(); 16 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_PRODUCTS_USER, "ProductInfo"); 17 | ExcelHelpers excel2 = new ExcelHelpers(); 18 | excel2.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 19 | getLoginPageCMS().loginSuccessWithCustomerAccount(excel2.getCellData(4, "email"), excel2.getCellData(4, "password")); 20 | ArrayList productInfo = getProductInfoPage().productInfo(PropertiesHelpers.getValue("product_P01")); 21 | int lastRow = excel.getRows(); 22 | int newRow = lastRow + 1; 23 | excel.setCellData(String.valueOf(newRow), newRow, 0); 24 | for (int i = 0; i < productInfo.size(); i++) { 25 | if (String.valueOf(newRow) != null) { 26 | excel.setCellData((String) productInfo.get(i), newRow, i + 1); 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/testcases/ProfileTest.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.testcases; 2 | 3 | import com.anhtester.common.BaseTest; 4 | import com.anhtester.constants.FrameworkConstants; 5 | import com.anhtester.helpers.ExcelHelpers; 6 | import org.testng.annotations.Test; 7 | 8 | public class ProfileTest extends BaseTest { 9 | 10 | @Test(priority = 1) 11 | public void TC_UpdateProfile() { 12 | ExcelHelpers excel = new ExcelHelpers(); 13 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 14 | getLoginPageCMS().loginSuccessWithCustomerAccount(excel.getCellData(4, "email"), excel.getCellData(4, "password")); 15 | getProfilePage().updateProfile(); 16 | } 17 | 18 | // @Test(priority = 2) 19 | // public void updateEmail() { 20 | // excel = new ExcelHelpers(); 21 | // excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 22 | // getLoginPageCMS().loginSuccessWithCustomerAccount(excel.getCellData(4, "email"), excel.getCellData(4, "password")); 23 | // getProfilePage().updateEmail(); 24 | // } 25 | 26 | @Test(priority = 3) 27 | public void TC_AddNewAddress() { 28 | ExcelHelpers excel = new ExcelHelpers(); 29 | excel.setExcelFile(FrameworkConstants.EXCEL_CMS_LOGIN, "Login"); 30 | getLoginPageCMS().loginSuccessWithCustomerAccount(excel.getCellData(4, "email"), excel.getCellData(4, "password")); 31 | getProfilePage().addNewAddress(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/users/pages/dashboard/DashboardPage.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.users.pages.dashboard; 2 | 3 | import org.openqa.selenium.By; 4 | 5 | public class DashboardPage { 6 | public static By titleDashboard = By.xpath("//h1[normalize-space()='Dashboard']"); 7 | public static By menuHome = By.xpath("//a[contains(text(),'Home')]"); 8 | public static By inputSearchProduct = By.xpath("//input[@id='search']"); 9 | public static By buttonSubmitSearch = By.xpath("//div[@class='input-group-append d-none d-lg-block']//button[@type='submit']"); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/cms/users/pages/products/ProductInfoPageCMS.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.cms.users.pages.products; 2 | 3 | import com.anhtester.projects.cms.CommonPageCMS; 4 | import com.anhtester.keywords.WebUI; 5 | import com.anhtester.projects.cms.users.pages.dashboard.DashboardPage; 6 | import org.openqa.selenium.By; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class ProductInfoPageCMS extends CommonPageCMS { 12 | private By productName = By.xpath("//h1"); 13 | public static By productPrice = By.xpath("(//div[text()='Discount Price:']/parent::div)/following-sibling::div//strong"); 14 | private By productUnit = By.xpath("//span[@class='opacity-70']"); 15 | private By productDescription = By.xpath("//div[@class = 'mw-100 overflow-auto text-left aiz-editor-data']/p"); 16 | private By selectProductName = By.xpath("(//div[contains(@class,'product-name')])[1]"); 17 | 18 | public ArrayList productInfo(String product) { 19 | WebUI.waitForPageLoaded(); 20 | WebUI.setText(DashboardPage.inputSearchProduct, product); 21 | WebUI.waitForJQueryLoad(); 22 | WebUI.clickElement(selectProductName); 23 | WebUI.waitForPageLoaded(); 24 | WebUI.sleep(2); 25 | String name = WebUI.getTextElement(By.xpath("//h1[contains(.,'" + product + "')]")); 26 | String price = WebUI.getTextElement(productPrice); 27 | String unit = WebUI.getTextElement(productUnit); 28 | String unitProduct = unit.substring(1); 29 | String description = WebUI.getTextElement(productDescription); 30 | List arrayList = new ArrayList(); 31 | arrayList.add(name); 32 | arrayList.add(price); 33 | arrayList.add(unitProduct); 34 | arrayList.add(description); 35 | System.out.println("Array" + arrayList); 36 | System.out.println("Array" + arrayList.get(0)); 37 | return (ArrayList) arrayList; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/models/ClientModel.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.models; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ClientModel { 7 | 8 | public static int row; 9 | 10 | public static String testCaseName = "TESTCASENAME"; 11 | 12 | public static String companyName = "COMPANY_NAME"; 13 | 14 | public static String owner = "OWNER"; 15 | 16 | public static String address = "ADDRESS"; 17 | 18 | public static String city = "CITY"; 19 | 20 | public static String state = "STATE"; 21 | 22 | public static String zip = "ZIP"; 23 | 24 | public static String country = "COUNTRY"; 25 | 26 | public static String phone = "PHONE"; 27 | 28 | public static String website = "WEBSITE"; 29 | 30 | public static String vat = "VAT"; 31 | 32 | public static String clientGroup = "CLIENT_GROUP"; 33 | 34 | public static String status = "STATUS"; 35 | 36 | public static String application = "APPLICATION"; 37 | 38 | public static String getApplication() { 39 | return application; 40 | } 41 | 42 | public static int getRow() { 43 | return row; 44 | } 45 | 46 | public static String getTestCaseName() { 47 | return testCaseName; 48 | } 49 | 50 | public static String getCompanyName() { 51 | return companyName; 52 | } 53 | 54 | public static String getOwner() { 55 | return owner; 56 | } 57 | 58 | public static String getAddress() { 59 | return address; 60 | } 61 | 62 | public static String getCity() { 63 | return city; 64 | } 65 | 66 | public static String getState() { 67 | return state; 68 | } 69 | 70 | public static String getZip() { 71 | return zip; 72 | } 73 | 74 | public static String getCountry() { 75 | return country; 76 | } 77 | 78 | public static String getPhone() { 79 | return phone; 80 | } 81 | 82 | public static String getWebsite() { 83 | return website; 84 | } 85 | 86 | public static String getVat() { 87 | return vat; 88 | } 89 | 90 | public static String getClientGroup() { 91 | return clientGroup; 92 | } 93 | 94 | public static String getStatus() { 95 | return status; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/models/SignInModel.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.models; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SignInModel { 7 | 8 | public static int row; 9 | 10 | public static String testCaseName = "TESTCASENAME"; 11 | 12 | public static String email = "EMAIL"; 13 | 14 | public static String password = "PASSWORD"; 15 | 16 | public static String expectedTitle = "EXPECTED_TITLE"; 17 | 18 | public static String expectedError = "EXPECTED_ERROR"; 19 | 20 | public static String expectedUrl = "EXPECTED_URL"; 21 | 22 | public static int getRow() { 23 | return row; 24 | } 25 | 26 | public static String getTestCaseName() { 27 | return testCaseName; 28 | } 29 | 30 | public static String getEmail() { 31 | return email; 32 | } 33 | 34 | public static String getPassword() { 35 | return password; 36 | } 37 | 38 | public static String getExpectedTitle() { 39 | return expectedTitle; 40 | } 41 | 42 | public static String getExpectedError() { 43 | return expectedError; 44 | } 45 | 46 | public static String getExpectedUrl() { 47 | return expectedUrl; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/pages/CommonPageCRM.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.pages; 2 | 3 | import com.anhtester.keywords.WebUI; 4 | import com.anhtester.projects.crm.pages.Clients.ClientPageCRM; 5 | import com.anhtester.projects.crm.pages.Dashboard.DashboardPageCRM; 6 | import com.anhtester.projects.crm.pages.Projects.ProjectPageCRM; 7 | import com.anhtester.projects.crm.pages.SignIn.SignInPageCRM; 8 | import org.openqa.selenium.By; 9 | 10 | public class CommonPageCRM { 11 | 12 | public SignInPageCRM signInPage; 13 | public DashboardPageCRM dashboardPage; 14 | public ClientPageCRM clientPage; 15 | public ProjectPageCRM projectPage; 16 | 17 | public By dropdownAccount = By.xpath("//a[@id='user-dropdown']//span[2]"); 18 | public By buttonSignOut = By.xpath("//a[normalize-space()='Sign Out']"); 19 | 20 | 21 | public SignInPageCRM signOut() { 22 | WebUI.clickElement(dropdownAccount); 23 | WebUI.clickElement(buttonSignOut); 24 | return new SignInPageCRM(); 25 | } 26 | 27 | public SignInPageCRM getSignInPage() { 28 | if (signInPage == null) { 29 | signInPage = new SignInPageCRM(); 30 | } 31 | return signInPage; 32 | } 33 | 34 | public DashboardPageCRM getDashboardPage() { 35 | if (dashboardPage == null) { 36 | dashboardPage = new DashboardPageCRM(); 37 | } 38 | return dashboardPage; 39 | } 40 | 41 | public ClientPageCRM getClientPage() { 42 | if (clientPage == null) { 43 | clientPage = new ClientPageCRM(); 44 | } 45 | return clientPage; 46 | } 47 | 48 | public ProjectPageCRM getProjectPage() { 49 | if (projectPage == null) { 50 | projectPage = new ProjectPageCRM(); 51 | } 52 | return projectPage; 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/pages/Dashboard/DashboardPageCRM.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.pages.Dashboard; 2 | 3 | import static com.anhtester.keywords.WebUI.*; 4 | 5 | import com.anhtester.projects.crm.pages.Clients.ClientPageCRM; 6 | import com.anhtester.projects.crm.pages.CommonPageCRM; 7 | import com.anhtester.projects.crm.pages.Projects.ProjectPageCRM; 8 | import com.anhtester.projects.crm.pages.Tasks.TaskPage; 9 | import org.openqa.selenium.By; 10 | 11 | public class DashboardPageCRM extends CommonPageCRM { 12 | 13 | public DashboardPageCRM() { 14 | super(); 15 | } 16 | 17 | public String pageText = "Dashboard"; 18 | public String pageUrl = "/dashboard"; 19 | 20 | public By menuDashboard = By.xpath("//span[normalize-space()='Dashboard']"); 21 | public By menuClients = By.xpath("//span[normalize-space()='Clients']"); 22 | public By menuProjects = By.xpath("//span[normalize-space()='Projects']"); 23 | public By menuTasks = By.xpath("//span[normalize-space()='Tasks']"); 24 | 25 | public DashboardPageCRM openDashboardPage() { 26 | clickElement(menuDashboard); 27 | return this; 28 | } 29 | 30 | public ClientPageCRM openClientPage() { 31 | clickElement(menuClients); 32 | return new ClientPageCRM(); 33 | } 34 | 35 | public ProjectPageCRM openProjectPage() { 36 | clickElement(menuProjects); 37 | return new ProjectPageCRM(); 38 | } 39 | 40 | public TaskPage openTaskPage() { 41 | clickElement(menuTasks); 42 | return new TaskPage(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/pages/Projects/ProjectPageCRM.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.pages.Projects; 2 | 3 | import com.anhtester.keywords.WebUI; 4 | import com.anhtester.projects.crm.pages.CommonPageCRM; 5 | import org.openqa.selenium.By; 6 | 7 | public class ProjectPageCRM extends CommonPageCRM { 8 | 9 | public ProjectPageCRM() { 10 | } 11 | 12 | private String pageText = "Projects"; 13 | 14 | //Project Page Element 15 | private By projectMenu = By.xpath("//span[normalize-space()='Projects']"); 16 | private By searchInput = By.xpath("//input[@type='search']"); 17 | 18 | public void searchByValue(String value) { 19 | WebUI.clearText(searchInput); 20 | WebUI.setText(searchInput, value); 21 | WebUI.sleep(1); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/pages/Tasks/TaskPage.java: -------------------------------------------------------------------------------- 1 | package com.anhtester.projects.crm.pages.Tasks; 2 | 3 | public class TaskPage { 4 | 5 | public TaskPage() { 6 | 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/testcases/ClientTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.projects.crm.testcases; 7 | 8 | import com.anhtester.annotations.FrameworkAnnotation; 9 | import com.anhtester.common.BaseTest; 10 | import com.anhtester.dataprovider.DataProviderManager; 11 | import com.anhtester.enums.AuthorType; 12 | import com.anhtester.enums.CategoryType; 13 | 14 | import static com.anhtester.keywords.WebUI.*; 15 | 16 | import com.anhtester.projects.crm.pages.Clients.ClientPageCRM; 17 | import com.anhtester.projects.crm.pages.Dashboard.DashboardPageCRM; 18 | import com.anhtester.projects.crm.pages.SignIn.SignInPageCRM; 19 | import io.qameta.allure.Epic; 20 | import io.qameta.allure.Feature; 21 | import org.testng.annotations.Test; 22 | 23 | import java.util.Hashtable; 24 | 25 | @Epic("Regression Test CRM") 26 | @Feature("Client Test") 27 | public class ClientTest extends BaseTest { 28 | 29 | private SignInPageCRM signInPageCRM; 30 | private DashboardPageCRM dashboardPageCRM; 31 | private ClientPageCRM clientPageCRM; 32 | 33 | public ClientTest() { 34 | signInPageCRM = new SignInPageCRM(); 35 | } 36 | 37 | @FrameworkAnnotation(author = {AuthorType.AnhTester, AuthorType.AnVo}, category = {CategoryType.REGRESSION}) 38 | @Test(priority = 1, description = "Test Add New Client", dataProvider = "getClientDataHashTable", dataProviderClass = DataProviderManager.class) 39 | public void testAddClient(Hashtable data) { 40 | dashboardPageCRM = signInPageCRM.signInWithAdminRole(); 41 | clientPageCRM = dashboardPageCRM.openClientPage(); 42 | clientPageCRM.openClientTabPage(); 43 | clientPageCRM.addClient(data); 44 | clientPageCRM.verifyClientDetail(data); 45 | } 46 | 47 | @FrameworkAnnotation(author = {AuthorType.James}, category = {CategoryType.SANITY, CategoryType.REGRESSION}) 48 | @Test(priority = 2, description = "TC06_testSearchClient") 49 | public void testSearchClient() { 50 | dashboardPageCRM = signInPageCRM.signInWithAdminRole(); 51 | clientPageCRM = dashboardPageCRM.openClientPage(); 52 | clientPageCRM.openClientTabPage(); 53 | // Search the first 54 | clientPageCRM.enterDataSearchClient("Adrain Ondricka"); 55 | checkContainsValueOnTableByColumn(2, "Adrain Ondricka"); 56 | // Search the second 57 | clientPageCRM.enterDataSearchClient("Birdie Erdman"); 58 | checkContainsValueOnTableByColumn(2, "Birdie Erdman"); 59 | 60 | } 61 | 62 | } -------------------------------------------------------------------------------- /src/test/java/com/anhtester/projects/crm/testcases/SignInTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2022 Anh Tester 3 | * Automation Framework Selenium 4 | */ 5 | 6 | package com.anhtester.projects.crm.testcases; 7 | 8 | import com.anhtester.common.BaseTest; 9 | import com.anhtester.dataprovider.DataProviderManager; 10 | import com.anhtester.projects.crm.pages.Dashboard.DashboardPageCRM; 11 | import com.anhtester.projects.crm.pages.SignIn.SignInPageCRM; 12 | import io.qameta.allure.Epic; 13 | import io.qameta.allure.Feature; 14 | import org.openqa.selenium.By; 15 | import org.testng.annotations.Test; 16 | 17 | import java.util.Hashtable; 18 | 19 | import static com.anhtester.keywords.WebUI.*; 20 | 21 | @Epic("Regression Test CRM") 22 | @Feature("Sign In Test") 23 | public class SignInTest extends BaseTest { 24 | 25 | SignInPageCRM signInPageCRM; 26 | DashboardPageCRM dashboardPageCRM; 27 | 28 | public SignInTest() { 29 | signInPageCRM = new SignInPageCRM(); 30 | } 31 | 32 | //Using library DataProvider with read Hashtable 33 | @Test(priority = 1, description = "TC01_signInWithDataProvider", dataProvider = "getSignInDataHashTable", dataProviderClass = DataProviderManager.class) 34 | public void signInWithDataProvider(Hashtable data) { 35 | signInPageCRM.signIn(data); 36 | 37 | } 38 | 39 | @Test(priority = 2, description = "TC02_signInWithAdminRole") 40 | public void signInWithAdminRole() { 41 | dashboardPageCRM = signInPageCRM.signInWithAdminRole(); 42 | verifyElementPresent(dashboardPageCRM.menuDashboard, 5, "The menu Dashboard does not exist."); 43 | 44 | } 45 | 46 | @Test(priority = 3, description = "TC03_signInWithClientRole") 47 | public void signInWithClientRole() { 48 | signInPageCRM.signInWithClientRole(); 49 | verifyContains(getPageTitle(), "Dashboard | RISE CRM"); 50 | 51 | } 52 | 53 | @Test(priority = 4, description = "TC04_loginPerfexCRM") 54 | public void loginPerfexCRM() { 55 | openWebsite("https://crm.anhtester.com/admin/authentication"); 56 | clearAndFillText(By.xpath("//input[@id='email']"), "admin@example.com"); 57 | clearAndFillText(By.xpath("//input[@id='password']"), "123456"); 58 | clickElement(By.xpath("//button[normalize-space()='Login']")); 59 | verifyEquals(getPageTitle(), "Dashboard"); 60 | 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/test/resources/config/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=target/allure-results -------------------------------------------------------------------------------- /src/test/resources/config/allure/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Ignored tests", 4 | "matchedStatuses": [ 5 | "skipped" 6 | ] 7 | }, 8 | { 9 | "name": "Infrastructure problems", 10 | "matchedStatuses": [ 11 | "broken", 12 | "failed" 13 | ], 14 | "messageRegex": ".*bye-bye.*" 15 | }, 16 | { 17 | "name": "Outdated tests", 18 | "matchedStatuses": [ 19 | "broken" 20 | ], 21 | "traceRegex": ".*FileNotFoundException.*" 22 | }, 23 | { 24 | "name": "Product defects", 25 | "matchedStatuses": [ 26 | "failed" 27 | ] 28 | }, 29 | { 30 | "name": "Test defects", 31 | "matchedStatuses": [ 32 | "broken" 33 | ] 34 | } 35 | ] -------------------------------------------------------------------------------- /src/test/resources/config/allure/environment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Browser 4 | Chrome 5 | 6 | 7 | Browser.Version 8 | 113.0 9 | 10 | 11 | Stand 12 | Production 13 | 14 | -------------------------------------------------------------------------------- /src/test/resources/config/allure/executor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Jenkins", 3 | "type": "jenkins", 4 | "url": "https://anhtester.com", 5 | "buildOrder": 1, 6 | "buildName": "Allure Report Customize | Anh Tester", 7 | "buildUrl": "https://anhtester.com", 8 | "reportUrl": "https://anhtester.com", 9 | "reportName": "Allure Report Customize | Anh Tester" 10 | } -------------------------------------------------------------------------------- /src/test/resources/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "url": "https://crm.anhtester.com/signin", 3 | "browser": "chrome", 4 | "button": "//a[contains(text(),'Đăng Nhập')]" 5 | } 6 | -------------------------------------------------------------------------------- /src/test/resources/config/config.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2022 Anh Tester 3 | # Automation Framework Selenium 4 | # 5 | # Config system 6 | AUTHOR = Anh Tester 7 | WAIT_DEFAULT = 5 8 | WAIT_IMPLICIT = 10 9 | WAIT_EXPLICIT = 10 10 | WAIT_PAGE_LOADED = 40 11 | # Smart Wait all steps 12 | # ACTIVE_PAGE_LOADED=true shall wait for the page to load for every step 13 | ACTIVE_PAGE_LOADED = true 14 | # WAIT_SLEEP_STEP is the delay time for every step - Second 15 | WAIT_SLEEP_STEP = 0 16 | # Browser default chrome, edge, firefox, safari 17 | BROWSER = 18 | # headless mode only for chrome or firefox and local execution 19 | HEADLESS = true 20 | # Website demo information 21 | URL_CRM = https://rise.anhtester.com/signin 22 | URL_CMS_ADMIN = https://cms.anhtester.com/login 23 | URL_CMS_USER = https://cms.anhtester.com 24 | # target execution: local or remote 25 | TARGET = local 26 | # grid url and port 27 | REMOTE_URL = localhost 28 | REMOTE_PORT = 4444 29 | # Report information 30 | PROJECT_NAME = Automation Framework Selenium | Anh Tester 31 | REPORT_TITLE = Report | Automation Framework Selenium | Anh Tester 32 | EXTENT_REPORT_NAME = ExtentReports 33 | EXTENT_REPORT_FOLDER = exports/ExtentReports 34 | EXPORT_VIDEO_PATH = exports/ExportData/Videos 35 | EXPORT_CAPTURE_PATH = exports/ExportData/Images 36 | # Send reports to Telegram Bot --> yes or no 37 | # If yes, please input TELEGRAM_TOKEN and TELEGRAM_CHATID 38 | SEND_REPORT_TO_TELEGRAM = no 39 | TELEGRAM_TOKEN = 40 | TELEGRAM_CHATID = 41 | # Zip folder reports after run test --> yes or no 42 | ZIP_FOLDER = no 43 | ZIP_FOLDER_PATH = exports/ExtentReports 44 | ZIP_FOLDER_NAME = ExtentReports.zip 45 | # Video Record 46 | VIDEO_RECORD = no 47 | # override_reports --> yes or no 48 | # If no -> Report name will be like 49 | # - Windows_10_Tue_Oct_05_02_30_46_IST_2022_ExtentReports.html 50 | # - Mac_OS_X_Tue_Feb_22_16_10_47_IST_2022_ExtentReports.html 51 | # If yes -> Report name will be ExtentReports.html 52 | OVERRIDE_REPORTS = yes 53 | # open_reports_after_execution--> yes or no 54 | OPEN_REPORTS_AFTER_EXECUTION = no 55 | # send_email_to_users --> yes or no 56 | # If yes -> then, provide your mail credentials -> src/main/java -> package mail.com.anhtester.EmailConfig; 57 | # This Email will be sent using Java mail API 58 | SEND_EMAIL_TO_USERS = no 59 | # Passed Steps Screenshot 60 | SCREENSHOT_PASSED_TCS = yes 61 | # Failed Steps Screenshot 62 | SCREENSHOT_FAILED_TCS = yes 63 | # Skipped Steps Screenshot 64 | SCREENSHOT_SKIPPED_TCS = no 65 | # All Steps Screenshot 66 | SCREENSHOT_ALL_STEPS = no 67 | # Locate in DataFaker/JavaFaker 68 | # Java Locale List: https://www.viralpatel.net/java-locale-list-tutorial/ 69 | LOCATE = vi 70 | RETRY_TEST_FAIL = 1 -------------------------------------------------------------------------------- /src/test/resources/config/data.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2022 Anh Tester 3 | # Automation Framework Selenium 4 | # 5 | #DATA FILE 6 | TXT_FILE_PATH = src/test/resources/testdataCRM/TxtFileData.txt 7 | EXCEL_DATA_FILE_PATH = src/test/resources/testdataCRM/ClientsDataExcel.xlsx 8 | JSON_DATA_FILE_PATH = src/test/resources/config/config.json 9 | EXCEL_CMS_LOGIN = src/test/resources/testdataCMS/Login.xlsx 10 | EXCEL_CMS_DATA = src/test/resources/testdataCMS/CMS_DATA.xlsx 11 | EXCEL_CMS_PRODUCTS_USER = src/test/resources/testdataCMS/GetProductInfo.xlsx 12 | email=admin@example.com 13 | password=123456 14 | product_P01=Gio qua Tet hquHA 15 | product_P02=Adobe Premiere Elements 2022 -------------------------------------------------------------------------------- /src/test/resources/datajson/arraysample.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Casino Royale", 5 | "director": "Martin Campbell", 6 | "starring": [ 7 | "Daniel Craig", 8 | "Eva Green" 9 | ], 10 | "desc": "Twenty-first James Bond movie", 11 | "release date": 1163466000000, 12 | "box office": 594275385 13 | }, 14 | { 15 | "id": 2, 16 | "title": "Quantum of Solace", 17 | "director": "Marc Forster", 18 | "starring": [ 19 | "Daniel Craig", 20 | "Olga Kurylenko" 21 | ], 22 | "desc": "Twenty-second James Bond movie", 23 | "release date": 1225242000000, 24 | "box office": 591692078 25 | }, 26 | { 27 | "id": 3, 28 | "title": "Skyfall", 29 | "director": "Sam Mendes", 30 | "starring": [ 31 | "Daniel Craig", 32 | "Naomie Harris" 33 | ], 34 | "desc": "Twenty-third James Bond movie", 35 | "release date": 1350954000000, 36 | "box office": 1110526981 37 | }, 38 | { 39 | "id": 4, 40 | "title": "Spectre", 41 | "director": "Sam Mendes", 42 | "starring": [ 43 | "Daniel Craig", 44 | "Lea Seydoux" 45 | ], 46 | "desc": "Twenty-fourth James Bond movie", 47 | "release date": 1445821200000, 48 | "box office": 879376275 49 | } 50 | ] -------------------------------------------------------------------------------- /src/test/resources/datajson/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "book": [ 3 | { 4 | "title": "Beginning JSON", 5 | "author": "Ben Smith", 6 | "price": 49.99 7 | }, 8 | { 9 | "title": "JSON at Work", 10 | "author": "Tom Marrs", 11 | "price": 29.99 12 | }, 13 | { 14 | "title": "Learn JSON in a DAY", 15 | "author": "Acodemy", 16 | "price": 8.99 17 | }, 18 | { 19 | "title": "JSON: Questions and Answers", 20 | "author": "George Duckett", 21 | "price": 6.00 22 | } 23 | ], 24 | "price range": { 25 | "cheap": 10.00, 26 | "medium": 20.00 27 | } 28 | } -------------------------------------------------------------------------------- /src/test/resources/datajson/store.json: -------------------------------------------------------------------------------- 1 | { 2 | "store": { 3 | "book": [ 4 | { 5 | "category": "reference", 6 | "author": "Nigel Rees", 7 | "title": "Sayings of the Century", 8 | "price": 8.95 9 | }, 10 | { 11 | "category": "fiction", 12 | "author": "Evelyn Waugh", 13 | "title": "Sword of Honour", 14 | "price": 12.99 15 | }, 16 | { 17 | "category": "fiction", 18 | "author": "Herman Melville", 19 | "title": "Moby Dick", 20 | "isbn": "0-553-21311-3", 21 | "price": 8.99 22 | }, 23 | { 24 | "category": "fiction", 25 | "author": "J. R. R. Tolkien", 26 | "title": "The Lord of the Rings", 27 | "isbn": "0-395-19395-8", 28 | "price": 22.99 29 | } 30 | ], 31 | "bicycle": { 32 | "color": "red", 33 | "price": 19.95 34 | } 35 | }, 36 | "expensive": 10 37 | } -------------------------------------------------------------------------------- /src/test/resources/datajson/tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "tool": { 3 | "jsonpath": { 4 | "creator": { 5 | "name": "Jayway Inc.", 6 | "location": [ 7 | "Malmo", 8 | "San Francisco", 9 | "Helsingborg" 10 | ] 11 | } 12 | } 13 | }, 14 | "book": [ 15 | { 16 | "title": "Beginning JSON", 17 | "price": 49.99 18 | }, 19 | { 20 | "title": "JSON at Work", 21 | "price": 29.99 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /src/test/resources/objects/crm_locators.properties: -------------------------------------------------------------------------------- 1 | #SignInPageCRM 2 | inputEmailID=id&&email 3 | inputEmail=xpath&&//input[@id='email'] 4 | inputPassword=xpath&&//input[@id='password'] 5 | buttonSignIn=xpath&&//button[normalize-space()='Sign in'] 6 | #-------------------------------------------------- 7 | #DashboardPageCRM 8 | menuProjects=xpath&&//span[normalize-space()='Projects'] 9 | menuClients=xpath&&//span[normalize-space()='Clients'] 10 | #-------------------------------------------------- 11 | #ClientPageCRM 12 | labelOnClientPage=xpath&&//span[normalize-space()='Total clients'] 13 | tabClient=xpath&&//ul[@id='client-tabs']//li[2] 14 | buttonAddClient=xpath&&//a[normalize-space()='Add client'] 15 | inputCompanyName=xpath&&//input[@id='company_name'] 16 | selectOwner=xpath&&//div[@id='s2id_created_by'] 17 | inputSearchOwner=xpath&&//div[@id='select2-drop']//input 18 | selectFirstItemOwner=xpath&&(//div[contains(@id,'select2-result-label')])[1] 19 | inputAddress=xpath&&//textarea[@id='address'] 20 | inputCity=xpath&&//input[@id='city'] 21 | inputState=xpath&&//input[@id='state'] 22 | inputZip=xpath&&//input[@id='zip'] 23 | inputCountry=xpath&&//input[@id='country'] 24 | inputPhone=xpath&&//input[@id='phone'] 25 | inputWebsite=xpath&&//input[@id='website'] 26 | inputVat=xpath&&//input[@id='vat_number'] 27 | spanFirstItemClientGroups=xpath&&//span[@class='select2-match'] 28 | labelClientGroups=xpath&&//li[@class='select2-search-choice']/div 29 | inputClientGroups=xpath&&(//label[normalize-space()='Client groups']/following-sibling::div//input)[1] 30 | buttonSaveOnDialog=xpath&&//div[@id='ajaxModalContent']//button[normalize-space()='Save'] 31 | inputSearch=xpath&&//input[@placeholder='Search'] 32 | itemClientFirstRow=xpath&&//table[@id='client-table']//tbody/tr[1]/td[2]/a 33 | tabClientInfo=xpath&&//a[normalize-space()='Client info'] 34 | headerPageClientInfo=xpath&&//form[@id='company-form']//h4 35 | ownerDetail=xpath&&//div[@id='s2id_created_by']//a[@class='select2-choice']/span[1] 36 | radioOrganization=xpath&&//input[@id='type_organization'] 37 | #-------------------------------------------------- 38 | #-------------------------------------------------- 39 | #TestObject 40 | buttonDynamicXpath=xpath&&//button[normalize-space()='%s'] -------------------------------------------------------------------------------- /src/test/resources/pdf-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "displayAttributeSummary": true, 3 | "displayAttributeDetails": true, 4 | "displayTestDetails": true, 5 | "displayExpandedMedia": false, 6 | "displayAttachedMedia": true, 7 | "title": "Extent Report PDF", 8 | "titleColor": "964B00", 9 | "startTimesColor": "33A532", 10 | "finishTimesColor": "FF69B4", 11 | "durationColor": "00FFFF", 12 | "passCountColor": "C0C0C0", 13 | "failCountColor": "A9A9A9", 14 | "passColor": "0b8c47", 15 | "failColor": "720000", 16 | "skipColor": "b17750", 17 | "warnColor": "ffc100", 18 | "infoColor": "114444", 19 | "categoryTitleColor": "990000", 20 | "categoryNameColor": "bd8275", 21 | "authorTitleColor": "002288", 22 | "authorNameColor": "3ac5b6", 23 | "deviceTitleColor": "228800", 24 | "deviceNameColor": "cd17bf", 25 | "systemTitleColor": "bb1144", 26 | "systemNameColor": "990000", 27 | "systemValueColor": "daa520", 28 | "exceptionTitleColor": "000000", 29 | "attributeTestStatusColor": "660066", 30 | "testNameColor": "d62d20", 31 | "testTimesColor": "ffa700", 32 | "testTimeStampColor": "08080", 33 | "testExceptionColor": "990000" 34 | } -------------------------------------------------------------------------------- /src/test/resources/suites/BuildApp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/test/resources/suites/CMS/AddProductCMS.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CMS/LoginTestCMS.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CMS/OrderProductCMS.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CMS/ProductInfoCMS.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CMS/ProfileCMS.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/Clients-parallel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/Clients-simple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/Clients-testAddClient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/Clients-testSearch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/SignIn-parallel-methods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/SignIn-parallel-multi-browser.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/test/resources/suites/CRM/SignIn-simple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/test/resources/suites/SuiteAll.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/Book1.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/Book1.xlsx -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/CMS_DATA.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/CMS_DATA.xlsx -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/Cosy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/Cosy.png -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/GetProductInfo.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/GetProductInfo.xlsx -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/Login.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/Login.xlsx -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/gio-qua-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/gio-qua-1.jpg -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/gio-qua-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/gio-qua-2.jpg -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/gio-qua-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/gio-qua-3.jpg -------------------------------------------------------------------------------- /src/test/resources/testdataCMS/gio-qua-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCMS/gio-qua-4.jpg -------------------------------------------------------------------------------- /src/test/resources/testdataCRM/ClientsDataExcel.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCRM/ClientsDataExcel.xlsx -------------------------------------------------------------------------------- /src/test/resources/testdataCRM/DOCX_File_01.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anhtester/AutomationFrameworkSelenium/60fa9e30a8b60ee014deeda44c7ec8fa7d2025f2/src/test/resources/testdataCRM/DOCX_File_01.docx -------------------------------------------------------------------------------- /src/test/resources/testdataCRM/LoginCSV.csv: -------------------------------------------------------------------------------- 1 | email,password 2 | admin02@mailinator.com,123456 3 | tld01@mailinator.com,123456 4 | -------------------------------------------------------------------------------- /src/test/resources/testdataCRM/TxtFileData.txt: -------------------------------------------------------------------------------- 1 | Hương 2 | Thủy --------------------------------------------------------------------------------