From 6f57e5d5666a5aa23a42f55db665d135301f60e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 20:33:37 +0300 Subject: [PATCH 1/7] Bump io.appium:java-client from 9.2.3 to 9.3.0 (#1673) Bumps [io.appium:java-client](https://github.com/appium/java-client) from 9.2.3 to 9.3.0. - [Release notes](https://github.com/appium/java-client/releases) - [Changelog](https://github.com/appium/java-client/blob/master/CHANGELOG.md) - [Commits](https://github.com/appium/java-client/compare/v9.2.3...v9.3.0) --- updated-dependencies: - dependency-name: io.appium:java-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8326c8ab63..55fdbbe363 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ io.appium java-client - 9.2.3 + 9.3.0 org.seleniumhq.selenium From 94126b3ebd99e09ef517670e6af2de4614f095ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 20:37:16 +0300 Subject: [PATCH 2/7] Bump io.qameta.allure:allure-bom from 2.28.0 to 2.28.1 (#1674) * Bump io.qameta.allure:allure-bom from 2.28.0 to 2.28.1 Bumps [io.qameta.allure:allure-bom](https://github.com/allure-framework/allure-java) from 2.28.0 to 2.28.1. - [Release notes](https://github.com/allure-framework/allure-java/releases) - [Commits](https://github.com/allure-framework/allure-java/compare/2.28.0...2.28.1) --- updated-dependencies: - dependency-name: io.qameta.allure:allure-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update Internal.java Signed-off-by: Mohab Mohie --------- Signed-off-by: dependabot[bot] Signed-off-by: Mohab Mohie Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mohab Mohie --- pom.xml | 2 +- src/main/java/com/shaft/properties/internal/Internal.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 55fdbbe363..6bf8828449 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ io.qameta.allure allure-bom - 2.28.0 + 2.28.1 pom import diff --git a/src/main/java/com/shaft/properties/internal/Internal.java b/src/main/java/com/shaft/properties/internal/Internal.java index 405d0c8c12..390de5afb8 100644 --- a/src/main/java/com/shaft/properties/internal/Internal.java +++ b/src/main/java/com/shaft/properties/internal/Internal.java @@ -18,6 +18,6 @@ public interface Internal extends EngineProperties { String watermarkImagePath(); @Key("allureVersion") - @DefaultValue("2.27.0") + @DefaultValue("2.28.1") String allureVersion(); } From cb09a6328e0a6671c22540f702040c3731ccf0be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 20:37:41 +0300 Subject: [PATCH 3/7] Bump com.microsoft.sqlserver:mssql-jdbc from 12.7.1.jre11-preview to 12.8.0.jre11 (#1675) Bump com.microsoft.sqlserver:mssql-jdbc Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 12.7.1.jre11-preview to 12.8.0.jre11. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6bf8828449..7d3584af0d 100644 --- a/pom.xml +++ b/pom.xml @@ -480,7 +480,7 @@ com.microsoft.sqlserver mssql-jdbc - 12.7.1.jre11-preview + 12.8.0.jre11 org.postgresql From eb5e8c85c8ef839c521eeedfa8dcd64240f7fe41 Mon Sep 17 00:00:00 2001 From: Mohab Mohie Date: Sat, 3 Aug 2024 12:13:47 +0300 Subject: [PATCH 4/7] Update e2eTests.yml (#1677) * Update e2eTests.yml Upgrade to docker compose v2 Signed-off-by: Mohab Mohie * Update e2eTests.yml Missing upgrade and job rename Signed-off-by: Mohab Mohie --------- Signed-off-by: Mohab Mohie --- .github/workflows/e2eTests.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2eTests.yml b/.github/workflows/e2eTests.yml index 7d39bad7be..66fe7f1b01 100644 --- a/.github/workflows/e2eTests.yml +++ b/.github/workflows/e2eTests.yml @@ -168,7 +168,7 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - name: Set up Native Selenium Grid - run: docker-compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=0 --scale edge=0 --scale firefox=10 -d + run: docker compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=0 --scale edge=0 --scale firefox=10 -d - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -209,7 +209,7 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - name: Set up Native Selenium Grid - run: docker-compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=10 --scale edge=0 --scale firefox=0 -d + run: docker compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=10 --scale edge=0 --scale firefox=0 -d - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -250,7 +250,7 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - name: Set up Native Selenium Grid - run: docker-compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=0 --scale edge=10 --scale firefox=0 -d + run: docker compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=0 --scale edge=10 --scale firefox=0 -d - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -557,7 +557,7 @@ jobs: node-version: '16' - name: Set up Native Selenium Grid if: runner.os == 'Linux' - run: docker-compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=10 --scale edge=0 --scale firefox=0 -d + run: docker compose -f src/main/resources/docker-compose/selenium4.yml up --scale chrome=10 --scale edge=0 --scale firefox=0 -d - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -593,7 +593,7 @@ jobs: with: paths: "target/surefire-reports/junitreports/TEST-*.xml" if: always() - Windows_Edge_Cucumber: + Windows_Edge_Cucumber_Local: needs: [ Ubuntu_APIs ] runs-on: windows-latest steps: @@ -633,7 +633,7 @@ jobs: if: always() uses: actions/upload-artifact@v4 with: - name: Windows_Edge_Cucumber_Allure + name: Windows_Edge_Cucumber_Local_Allure path: "allure-report/*.html" - name: Test Summary uses: test-summary/action@v2 From bbcb27df46a1aaa27fd9922be749133e1b5f7712 Mon Sep 17 00:00:00 2001 From: Mohab Mohie Date: Sat, 3 Aug 2024 20:57:26 +0300 Subject: [PATCH 5/7] 1676-bug-nullpointerexception-in-shaftapi-initialization (#1678) - introduce self-healing logic to API test first run - upgrade allure binaries version - add virtual thread synchronization point to ensure allure binaries are downloaded before attempting to generate the report (this caused an issue if the test is faster than the binaries download process) - optimize session management for AllureManager - add a basic test to reproduce the buggy case --- src/main/java/com/shaft/api/RestActions.java | 3 ++ .../com/shaft/listeners/TestNGListener.java | 9 +++- .../shaft/properties/internal/Internal.java | 2 +- .../tools/io/internal/AllureManager.java | 43 ++++++++++--------- .../testPackage/legacy/BasicAPITests.java | 15 +++++++ 5 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 src/test/java/testPackage/legacy/BasicAPITests.java diff --git a/src/main/java/com/shaft/api/RestActions.java b/src/main/java/com/shaft/api/RestActions.java index 0996d6a567..d208eed5a0 100755 --- a/src/main/java/com/shaft/api/RestActions.java +++ b/src/main/java/com/shaft/api/RestActions.java @@ -10,6 +10,7 @@ import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.spi.json.JsonOrgJsonProvider; +import com.shaft.driver.DriverFactory; import com.shaft.driver.SHAFT; import com.shaft.tools.internal.support.JavaHelper; import com.shaft.tools.io.ReportManager; @@ -693,6 +694,8 @@ private static String prettyFormatXML(String input) { } private static void initializeSystemProperties() { + if (SHAFT.Properties.timeouts == null) + DriverFactory.reloadProperties(); HTTP_SOCKET_TIMEOUT = SHAFT.Properties.timeouts.apiSocketTimeout(); // timeout between two consecutive data packets in seconds HTTP_CONNECTION_TIMEOUT = SHAFT.Properties.timeouts.apiConnectionTimeout(); diff --git a/src/main/java/com/shaft/listeners/TestNGListener.java b/src/main/java/com/shaft/listeners/TestNGListener.java index 15fe3b6b3a..d41255fc64 100644 --- a/src/main/java/com/shaft/listeners/TestNGListener.java +++ b/src/main/java/com/shaft/listeners/TestNGListener.java @@ -35,6 +35,8 @@ public class TestNGListener implements IAlterSuiteListener, IAnnotationTransform @Getter private static XmlTest xmlTest; + private static Thread allureEnvironmentSetup; + public static ProjectStructureManager.RunType identifyRunType() { Supplier> stacktraceSupplier = () -> Arrays.stream((new Throwable()).getStackTrace()).map(StackTraceElement::getClassName); var isUsingJunitDiscovery = stacktraceSupplier.get().anyMatch(org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.class.getCanonicalName()::equals); @@ -76,7 +78,7 @@ public static void engineSetup(ProjectStructureManager.RunType runType) { ReportManagerHelper.logEngineVersion(); Thread.ofVirtual().start(UpdateChecker::check); Thread.ofVirtual().start(ImageProcessingActions::loadOpenCV); - Thread.ofVirtual().start(AllureManager::initializeAllureReportingEnvironment); + allureEnvironmentSetup = Thread.ofVirtual().start(AllureManager::initializeAllureReportingEnvironment); Thread.ofVirtual().start(ReportManagerHelper::cleanExecutionSummaryReportDirectory); ReportManagerHelper.setDiscreteLogging(SHAFT.Properties.reporting.alwaysLogDiscreetly()); ReportManagerHelper.setDebugMode(SHAFT.Properties.reporting.debugMode()); @@ -202,6 +204,11 @@ public void onExecutionFinish() { Thread.ofVirtual().start(JiraHelper::reportExecutionStatusToJira); Thread.ofVirtual().start(GoogleTink::encrypt); ReportManagerHelper.logEngineClosure(); + try { + allureEnvironmentSetup.join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } AllureManager.openAllureReportAfterExecution(); AllureManager.generateAllureReportArchive(); } diff --git a/src/main/java/com/shaft/properties/internal/Internal.java b/src/main/java/com/shaft/properties/internal/Internal.java index 390de5afb8..9715d3f09f 100644 --- a/src/main/java/com/shaft/properties/internal/Internal.java +++ b/src/main/java/com/shaft/properties/internal/Internal.java @@ -18,6 +18,6 @@ public interface Internal extends EngineProperties { String watermarkImagePath(); @Key("allureVersion") - @DefaultValue("2.28.1") + @DefaultValue("2.30.0") //https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ String allureVersion(); } diff --git a/src/main/java/com/shaft/tools/io/internal/AllureManager.java b/src/main/java/com/shaft/tools/io/internal/AllureManager.java index 87ad9f48a3..d1bb25f4fa 100644 --- a/src/main/java/com/shaft/tools/io/internal/AllureManager.java +++ b/src/main/java/com/shaft/tools/io/internal/AllureManager.java @@ -22,6 +22,9 @@ public class AllureManager { private static String allureBinaryPath = ""; private static String allureOutPutDirectory = ""; + private static final TerminalActions internalTerminalSession = TerminalActions.getInstance(false,false,true); + private static final FileActions internalFileSession = FileActions.getInstance(true); + public static void initializeAllureReportingEnvironment() { ReportManager.logDiscrete("Initializing Allure Reporting Environment..."); /* @@ -42,24 +45,24 @@ public static void openAllureReportAfterExecution() { } private static void copyAndOpenAllure() { - FileActions.getInstance(true).copyFolder(allureOutPutDirectory, allureReportPath); - FileActions.getInstance(true).deleteFile(allureOutPutDirectory); + internalFileSession.copyFolder(allureOutPutDirectory, allureReportPath); + internalFileSession.deleteFile(allureOutPutDirectory); String newFileName = renameAllureReport(); openAllureReport(newFileName); } private static String renameAllureReport() { String newFileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss-SSS")) + "_AllureReport.html"; - FileActions.getInstance(true).renameFile(System.getProperty("user.dir") + File.separator + allureReportPath + File.separator + "index.html", newFileName); + internalFileSession.renameFile(System.getProperty("user.dir") + File.separator + allureReportPath + File.separator + "index.html", newFileName); return newFileName; } private static void openAllureReport(String newFileName) { if (SHAFT.Properties.reporting.openAllureReportAfterExecution()) { if (SystemUtils.IS_OS_WINDOWS) { - SHAFT.CLI.terminal().performTerminalCommand(".\\" + allureReportPath + File.separator + newFileName); + internalTerminalSession.performTerminalCommand(".\\" + allureReportPath + File.separator + newFileName); } else { - SHAFT.CLI.terminal().performTerminalCommand("open ./" + allureReportPath + File.separator + newFileName); + internalTerminalSession.performTerminalCommand("open ./" + allureReportPath + File.separator + newFileName); } } } @@ -79,23 +82,23 @@ private static void downloadAndExtractAllureBinaries() { // already exist String allureVersion = SHAFT.Properties.internal.allureVersion(); allureBinaryPath = allureExtractionLocation + "allure-" + allureVersion + File.separator + "bin" + File.separator + "allure"; - if (!FileActions.getInstance(true).doesFileExist(allureBinaryPath)) { + if (!internalFileSession.doesFileExist(allureBinaryPath)) { try { - FileActions.getInstance(true).deleteFolder(allureExtractionLocation); + internalFileSession.deleteFolder(allureExtractionLocation); } catch (AssertionError e) { ReportManager.logDiscrete("Couldn't clear the allure extraction directory. Kindly terminate any running java process or restart your machine to fix this issue."); ReportManagerHelper.logDiscrete(e); } // download allure binary - URL allureArchive = FileActions.getInstance(true).downloadFile( + URL allureArchive = internalFileSession.downloadFile( "https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/" + allureVersion + "/allure-commandline-" + allureVersion + ".zip", "target" + File.separator + "allureBinary.zip"); - FileActions.getInstance(true).unpackArchive(allureArchive, allureExtractionLocation); + internalFileSession.unpackArchive(allureArchive, allureExtractionLocation); if (!SystemUtils.IS_OS_WINDOWS) { // make allure executable on Unix-based shells - TerminalActions.getInstance(false, false, true).performTerminalCommand("chmod u+x " + allureBinaryPath); + internalTerminalSession.performTerminalCommand("chmod u+x " + allureBinaryPath); } } } @@ -113,7 +116,7 @@ private static void writeGenerateReportShellFilesToProjectDirectory() { "set path=" + allureExtractionLocation + "allure-" + allureVersion + "\\bin;%path%", "allure serve " + allureResultsFolderPath.substring(0, allureResultsFolderPath.length() - 1) + " -h localhost", "pause", "exit"); - FileActions.getInstance(true).writeToFile("", "generate_allure_report.bat", commandsToServeAllureReport); + internalFileSession.writeToFile("", "generate_allure_report.bat", commandsToServeAllureReport); } else { // create Unix-based sh file commandsToServeAllureReport = Arrays @@ -124,9 +127,9 @@ private static void writeGenerateReportShellFilesToProjectDirectory() { "exit" ); - FileActions.getInstance(true).writeToFile("", "generate_allure_report.sh", commandsToServeAllureReport); + internalFileSession.writeToFile("", "generate_allure_report.sh", commandsToServeAllureReport); // make allure executable on Unix-based shells - TerminalActions.getInstance(false, false, true).performTerminalCommand("chmod u+x generate_allure_report.sh"); + internalTerminalSession.performTerminalCommand("chmod u+x generate_allure_report.sh"); } } @@ -134,7 +137,7 @@ private static void cleanAllureResultsDirectory() { // clean allure-results directory before execution if (SHAFT.Properties.reporting.cleanAllureResultsDirectoryBeforeExecution()) { try { - FileActions.getInstance(true).deleteFolder(allureResultsFolderPath.substring(0, allureResultsFolderPath.length() - 1)); + internalFileSession.deleteFolder(allureResultsFolderPath.substring(0, allureResultsFolderPath.length() - 1)); } catch (Exception t) { ReportManager.log("Failed to delete allure-results as it is currently open. Kindly restart your device to unlock the directory."); } @@ -145,10 +148,10 @@ private static void overrideAllurePluginConfiguration() { String allureVersion = SHAFT.Properties.internal.allureVersion(); // extract allure from SHAFT_Engine jar URL allureSHAFTConfigArchive = ReportManagerHelper.class.getResource("/resources/allure/allureBinary_SHAFTEngineConfigFiles.zip"); - FileActions.getInstance(true).unpackArchive(allureSHAFTConfigArchive, + internalFileSession.unpackArchive(allureSHAFTConfigArchive, allureExtractionLocation + "allure-" + allureVersion + File.separator); // deleting custom-logo.svg to avoid generating extra folder with report in single mode - FileActions.getInstance(true).deleteFile(allureExtractionLocation + "allure-" + allureVersion + File.separator + "plugins" + File.separator + "custom-logo-plugin" + File.separator + "static" + File.separator + "custom-logo.svg"); + internalFileSession.deleteFile(allureExtractionLocation + "allure-" + allureVersion + File.separator + "plugins" + File.separator + "custom-logo-plugin" + File.separator + "static" + File.separator + "custom-logo.svg"); } @@ -166,12 +169,12 @@ private static void writeAllureReport() { + allureResultsFolderPath.substring(0, allureResultsFolderPath.length() - 1) + " -o " + allureOutPutDirectory; } - FileActions.getInstance(true).createFolder(allureOutPutDirectory); - TerminalActions.getInstance(false, false, true).performTerminalCommand(commandToCreateAllureReport); + internalFileSession.createFolder(allureOutPutDirectory); + internalTerminalSession.performTerminalCommand(commandToCreateAllureReport); } private static void createAllureReportArchive() { - FileActions.getInstance(true).zipFiles(allureReportPath + "/", "generatedReport_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss-SSS")) + ".zip"); + internalFileSession.zipFiles(allureReportPath + "/", "generatedReport_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss-SSS")) + ".zip"); } private static void writeEnvironmentVariablesToAllureResultsDirectory() { @@ -205,7 +208,7 @@ private static void writeEnvironmentVariablesToAllureResultsDirectory() { } } propertiesFileBuilder.append(""); - FileActions.getInstance(true).writeToFile(SHAFT.Properties.paths.allureResults(), "environment.xml", + internalFileSession.writeToFile(SHAFT.Properties.paths.allureResults(), "environment.xml", RestActions.formatXML(propertiesFileBuilder.toString())); } } diff --git a/src/test/java/testPackage/legacy/BasicAPITests.java b/src/test/java/testPackage/legacy/BasicAPITests.java new file mode 100644 index 0000000000..c71d6e49e5 --- /dev/null +++ b/src/test/java/testPackage/legacy/BasicAPITests.java @@ -0,0 +1,15 @@ +package testPackage.legacy; + +import com.shaft.driver.SHAFT; +import org.testng.annotations.Test; + +public class BasicAPITests { + SHAFT.API api; + + @Test + public void apiTest(){ + api = new SHAFT.API("https://fakerestapi.azurewebsites.net"); + api.get("/api/v1/Authors") + .performRequest(); + } +} From 1a13016f3cc725e4c9ed6ab6a3f394750a3d0d48 Mon Sep 17 00:00:00 2001 From: Mohab Mohie Date: Sat, 3 Aug 2024 21:11:02 +0300 Subject: [PATCH 6/7] 8.3.20240803 (#1679) * Update pom.xml 8.3.20240803 Signed-off-by: Mohab Mohie * Update Internal.java Signed-off-by: Mohab Mohie --------- Signed-off-by: Mohab Mohie --- pom.xml | 2 +- src/main/java/com/shaft/properties/internal/Internal.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7d3584af0d..cdc37c1841 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.shafthq SHAFT_ENGINE - 8.2.20240624 + 8.3.20240803 ${project.groupId}:${project.artifactId} SHAFT is a unified test automation engine. Powered by best-in-class frameworks, SHAFT provides a wizard-like syntax to drive your automation efficiently, maximize your ROI, and minimize your learning curve. diff --git a/src/main/java/com/shaft/properties/internal/Internal.java b/src/main/java/com/shaft/properties/internal/Internal.java index 9715d3f09f..e49b6be872 100644 --- a/src/main/java/com/shaft/properties/internal/Internal.java +++ b/src/main/java/com/shaft/properties/internal/Internal.java @@ -10,7 +10,7 @@ }) public interface Internal extends EngineProperties { @Key("shaftEngineVersion") - @DefaultValue("8.2.20240624") + @DefaultValue("8.3.20240803") String shaftEngineVersion(); @Key("watermarkImagePath") From fd84020cbd92ce47b32b03cf2c125cdd5ec96548 Mon Sep 17 00:00:00 2001 From: Mohab Mohie Date: Sat, 3 Aug 2024 21:31:31 +0300 Subject: [PATCH 7/7] Update README.md Signed-off-by: Mohab Mohie --- README.md | 104 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 4deb6b1f0d..29b8d03b22 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -[![Ceasefire now](https://img.shields.io/badge/%F0%9F%87%B5%F0%9F%87%B8_Ceasefire_Now-techforpalestine.org-000000?labelColor=gray&color=D83838&style=for-the-badge)](https://techforpalestine.org/learn-more) - # SHAFT: Unified Test Automation Engine @@ -25,6 +23,8 @@
+
+ Tech for Palestine
License Contributors @@ -39,9 +39,59 @@
+

+ + +## 📚 Getting Started: +- Check out our comprehensive and friendly [user guide](https://shafthq.github.io/) to learn why SHAFT should be your solution of choice if you're aiming for successful test automation. +

+ +## 👨‍💻 Tech Stack: +Java +Maven +      IntelliJ IDEA +

+## 🦸 Powered by: +Selenium WebDriver +      Appium +      REST Assured +      TestNG +      Allure Reports +      Cucumber.io +      OpenCV +      Selenium Grid +      GitHub Actions +      Dependabot +      CodeQL +      Codacy +      JaCoCo +      CodeCov +      sonatype +

+ +## 🙏 Sponsored by: +BrowserStack +      Applitools +      LambdaTest +      JetBrains +

+ +## 🌍 Trusted solution of choice for: [^4] +_VOIS (Vodafone Intelligent Solution)      GET Group Holdings      MOMRA (Saudi Arabia's Ministry of Municipal and Rural Affairs)      Vodafone (Egypt)      Solutions by STC      GIZA Systems      Euronet      Terkwaz Business Solutions      Incorta      BayanTech      Adam.ai      ACT Global Soft      elmenus      IDEMIA      iHorizons      Robusta      Paymob Solutions      Jahez Group      Salt Bank + +[^4]: Company names are collected via anonymous surveys and provided freely by engineers who claimed to be using SHAFT_Engine within these companies. +

+ + +## 🤝 Support & Contributions: +- Join us via Slack & Facebook +
automatest-workspace Automatest +- And feel free to create PRs directly. [This lovely tutorial](https://dev.to/genicsblog/how-to-create-a-pull-request-in-github-correctly-20np) will help. +

-## 🏃 Quick Start Guide + +## 🏃 Quick Start Guide: ### Option 1: Maven Archetype (Recommended for new local sandbox projects) @@ -128,52 +178,6 @@ public void afterClass(){
`--plugin com.shaft.listeners.CucumberFeatureListener`
- After saving the changes, remember to delete any old runs you may have triggered by mistake before adding the needed config. - -## 📚 User Guide -- Check out our [comprehensive user guide](https://shafthq.github.io/) for details on the features we support. - -## 👨‍💻 Tech Stack -Java -Maven -      IntelliJ IDEA - - -## 🦸 Powered by -Selenium WebDriver -      Appium -      REST Assured -      TestNG -      Allure Reports -      Cucumber.io -      OpenCV -      Selenium Grid -      GitHub Actions -      Dependabot -      CodeQL -      Codacy -      JaCoCo -      CodeCov -      sonatype - - -## 🙏 Big thanks for the open source licenses and support -BrowserStack -      Applitools -      LambdaTest -      JetBrains - - - -## 🤝 Support & Contributions -- Join us via Slack & Facebook -
automatest-workspace Automatest -- And feel free to create PRs directly. [This lovely tutorial](https://dev.to/genicsblog/how-to-create-a-pull-request-in-github-correctly-20np) will help. - - -## 🌍 Who else is using SHAFT? [^4] -_VOIS (Vodafone Intelligent Solution)      GET Group Holdings      MOMRA (Saudi Arabia's Ministry of Municipal and Rural Affairs)      Vodafone (Egypt)      Solutions by STC      GIZA Systems      Euronet      Terkwaz Business Solutions      Incorta      BayanTech      Adam.ai      ACT Global Soft      elmenus      IDEMIA      iHorizons      Robusta      Paymob Solutions      Jahez Group      Salt Bank - - -[^4]: Company names are collected via anonymous surveys and provided freely by engineers who claimed to be using SHAFT_Engine within these companies. +

#### Stop Reinventing the wheel! Start using SHAFT!