diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..0ba12ae --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,72 @@ +name: Run Tests + +on: + workflow_dispatch: + inputs: + test_type: + description: 'Choose the type of test to run' + required: true + type: choice + options: + - Web Browser Automation (Single) + - Web Browser Automation (Parallel) + - Mobile Browser Automation (Single) + - Android App Automation (Single) + - Android App Automation (Parallel) + - iOS App Automation (Single) + - iOS App Automation (Parallel) + +jobs: + run_tests: + runs-on: ubuntu-latest + + env: + LT_USERNAME: ${{ secrets.LT_USERNAME}} + LT_ACCESS_KEY: ${{ secrets.LT_ACCESS_KEY}} + + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Java for Maven tests + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' # Use 'temurin' for Eclipse Temurin + cache: 'maven' # Enable caching for Maven dependencies + + - name: Set up Node.js for Playwright and Cypress + uses: actions/setup-node@v3 + with: + node-version: '16' + + - name: Run the selected test + run: | + case "${{ github.event.inputs.test_type }}" in + "Web Browser Automation (Single)") + mvn test -D suite=single.xml + ;; + "Web Browser Automation (Parallel)") + mvn test -D suite=parallel.xml + ;; + "Mobile Browser Automation (Single)") + mvn test -D suite=mobile.xml + ;; + "Android App Automation (Single)") + mvn test -D suite=android_single.xml + ;; + "Android App Automation (Parallel)") + mvn test -D suite=android_parallel.xml + ;; + "iOS App Automation (Single)") + mvn test -D suite=iOS_single.xml + ;; + "iOS App Automation (Parallel)") + mvn test -D suite=iOS_parallel.xml + ;; + *) + echo "Invalid option selected" + exit 1 + ;; + esac diff --git a/.gitignore b/.gitignore index f70e4d3..bd21d46 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,9 @@ .project .settings .theia +.DS_Store +node_modules/ +package-lock.json +log/ +cypress/screenshots/ +cypress/videos/ \ No newline at end of file diff --git a/.gitpod.yml b/.gitpod.yml index 2f1526e..cb958f8 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -5,5 +5,9 @@ ports: # List the start up tasks. You can start them in parallel in multiple terminals. See https://www.gitpod.io/docs/config-start-tasks/ tasks: - - init: mvn install -Dsuite=parallel.xml # runs during prebuild - command: echo 'Please check your test on https://automation.lambdatest.com/' + - before: npm install + init: mvn install + command: npm install + - name: Results + init: npm test + command: node /workspace/LambdaTest_Demo/node_modules/@lambdatest/node-fetch-sessions/index.js diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..626924a --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d5cd614 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fe3f751 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "standard.enable": false, + "eslint.enable": true, + "typescript.surveys.enabled": false, + "editor.formatOnSave": false +} diff --git a/README.md b/README.md index 3817122..0f0b3fc 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,58 @@ -# Java TestNG Selenium & Appium - -### Environment Setup - -1. Global Dependencies - * Install [Maven](https://maven.apache.org/install.html) - * Or Install Maven with [Homebrew](http://brew.sh/) (Easier) - ``` - $ mvn install - ``` -2. Project Dependencies - * checkout the repository - * Check that packages are available - ``` - $ cd Java_TestNG_Web-App - ``` - * You may also want to run the command below to check for outdated dependencies. Please be sure to verify and review updates before editing your pom.xml file as they may not be compatible with your code. - ``` - $ mvn versions:display-dependency-updates - ``` - -**LambdaTest Authentication Credentials:** Make sure you have your LambdaTest credentials with you to run test automation scripts with Jest on LambdaTest Selenium Grid. You can obtain these credentials from the [LambdaTest Automation Dashboard](https://automation.lambdatest.com/) or through [LambdaTest Profile](https://accounts.lambdatest.com/detail/profile). - -Set LambdaTest Username and Access Key in environment variables. - -* For Linux/macOS: -`export LT_USERNAME="YOUR_USERNAME" -export LT_ACCESS_KEY="YOUR ACCESS KEY"` - -* For Windows: -`set LT_USERNAME="YOUR_USERNAME" -set LT_ACCESS_KEY="YOUR ACCESS KEY"` - -### Running Tests - -``` -To run single test (Web Browser Automation) - $ mvn test -D suite=single.xml - -To run parallel test (Web Browser Automation) - $ mvn test -D suite=parallel.xml - -To run single test (Android App Automation) - $ mvn test -D suite=android_single.xml - -To run single test (Android App Automation) - $ mvn test -D suite=android_parallel.xml - -To run single test (iOS App Automation) - $ mvn test -D suite=iOS_single.xml - -To run single test (iOS App Automation) - $ mvn test -D suite=iOS_parallel.xml - -``` -## About LambdaTest - -[LambdaTest](https://www.lambdatest.com/) is a cloud based selenium grid infrastructure that can help you run automated cross browser compatibility tests on 2000+ different browser and operating system environments. LambdaTest supports all programming languages and frameworks that are supported with Selenium, and have easy integrations with all popular CI/CD platforms. It's a perfect solution to bring your [selenium automation testing](https://www.lambdatest.com/selenium-automation) to cloud based infrastructure that not only helps you increase your test coverage over multiple desktop and mobile browsers, but also allows you to cut down your test execution time by running tests on parallel. - + +``` +To run single test (Web Browser Automation) use below command + mvn test -D suite=single.xml + +To run single test (Mobile Browser Automation) use below command + mvn test -D suite=mobile.xml + +To run accesiility test (Web Browser Automation) use below command + mvn test -D suite=accessibility.xml + +To run parallel test (Web Browser Automation) use below command + mvn test -D suite=parallel.xml + +To run single test (Android App Automation) use below command + mvn test -D suite=android_single.xml + +To run single test (Android App Automation) use below command + mvn test -D suite=android_parallel.xml + +To run single test (iOS App Automation) use below command + mvn test -D suite=iOS_single.xml + +To run single test (iOS App Automation) use below command + mvn test -D suite=iOS_parallel.xml + +To run Cypress Test use below command + npm test + +To run playwright Test - Single Thread + node playwright_single.js + +To run playwright Test - Parallel 3 Thread's + node playwright_parallel.js + +``` + +### Visual UI Tests with Selenium + +Navigate to https://smartui.lambdatest.com/projects + +1. Run command ``` mvn test -D suite=visual_baseline.xml -Denv.project= ``` +2. run command ``` mvn test -D suite=visualchangebuild.xml -Denv.project= ``` + +Runs will be reflected in the smartUI dashboard with the same project name as passed in maven commands((NAME_OF_THE_CUSTOMER) ) above + +### Run test with Hyperexecute + + +1. Run function test ``` ./hyperexecute --config testng_hyperexecute_autosplit_sample.yaml --download-artifacts --force-clean-artifacts --user --key ``` +2. Run jmeter test ``` ./hyperexecute --config jmeter.yaml --download-artifacts --force-clean-artifacts --user --key ``` + +Runs will be reflected in the Hyperexecute dashboard here https://hyperexecute.lambdatest.com/hyperexecute/jobs + + + + + diff --git a/TestNGAccessibilty.java b/TestNGAccessibilty.java new file mode 100644 index 0000000..77003e9 --- /dev/null +++ b/TestNGAccessibilty.java @@ -0,0 +1,208 @@ +package com.lambdatest; + +import org.openqa.selenium.By; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; +import org.testng.ITestContext; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; + +public class TestNGAccessibilty { + + private RemoteWebDriver driver; + private String Status = "failed"; + + @BeforeMethod + public void setup(Method m, ITestContext ctx) throws MalformedURLException { + String username = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); + String authkey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); + ; + String hub = "@hub.lambdatest.com/wd/hub"; + + DesiredCapabilities caps = new DesiredCapabilities(); + caps.setCapability("browserName", "Chrome"); + caps.setCapability("version", "latest"); + caps.setCapability("build", "TestNG With Java"); + caps.setCapability("name", m.getName() + this.getClass().getName()); + caps.setCapability("plugin", "git-testng"); + caps.setCapability("performance",true); + caps.setCapability("network", true); + caps.setCapability("console", true); + caps.setCapability("video", true); + caps.setCapability("w3c", true); + caps.setCapability("accessibility", true); + //caps.setCapability("accessibility.wcagVersion", "wcag21a"); + caps.setCapability("accessibility.bestPractice", true); + caps.setCapability("accessibility.needsReview", true); + caps.setCapability("smartUI.project", "par"); + + + + + String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; + caps.setCapability("tags", Tags); + + driver = new RemoteWebDriver(new URL("http://" + username + ":" + authkey + hub), caps); + } + + + @Test + public void basicTest() throws InterruptedException { + String spanText; + System.out.println("Loading Url"); + + driver.get("https://www.google.com"); + + driver.executeScript("smartui.takeScreenshot({'screenshotName':'home-page'})"); + + Thread.sleep(2000); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + + // Let's also assert that the todo we added is present in the list. + + spanText = driver.findElement (By.xpath("/html/body/div/div/div/ul/li[9]/span")).getText(); + Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; + Thread.sleep(150); + + System.out.println("TestFinished"); + + } + + @AfterMethod + public void tearDown() { + driver.executeScript("lambda-status=" + Status); + driver.quit(); + } + +} diff --git a/accessibility.xml b/accessibility.xml new file mode 100644 index 0000000..6ed5f2e --- /dev/null +++ b/accessibility.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android_parallel.xml b/android_parallel.xml index fca9045..5a89570 100644 --- a/android_parallel.xml +++ b/android_parallel.xml @@ -1,10 +1,22 @@ - - + + + + + + - - + - - + + + + + + + + + + + \ No newline at end of file diff --git a/android_single.xml b/android_single.xml index 6bdfee3..6492f39 100644 --- a/android_single.xml +++ b/android_single.xml @@ -2,8 +2,11 @@ + + + - + diff --git a/apps/proverbial_android.apk b/apps/proverbial_android.apk new file mode 100644 index 0000000..0cebbd0 Binary files /dev/null and b/apps/proverbial_android.apk differ diff --git a/apps/proverbial_ios.ipa b/apps/proverbial_ios.ipa new file mode 100644 index 0000000..0d5ecdd Binary files /dev/null and b/apps/proverbial_ios.ipa differ diff --git a/azure-pipelines-1.yml b/azure-pipelines-1.yml new file mode 100644 index 0000000..44a9e1c --- /dev/null +++ b/azure-pipelines-1.yml @@ -0,0 +1,23 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: none + +resources: + webhooks: + - webhook: androidapp + connection: androidapp + +pool: + vmImage: ubuntu-latest + +steps: +- script: echo Hello, world! + displayName: 'Run a one-line script' + +- script: | + echo Add other tasks to build, test, and deploy your project. + echo See https://aka.ms/yaml + displayName: 'Run a multi-line script' diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000..e485106 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,23 @@ +# Maven +# Build your Java project and run tests with Apache Maven. +# Add steps that analyze code, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/java + +trigger: +- none + +resources: + webhooks: + - webhook: androidapp + connection: androidapp + +pool: + vmImage: ubuntu-latest + +steps: +- task: CmdLine@2 + inputs: + script: | + echo Write your commands here + + echo Hello world diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..43130e0 --- /dev/null +++ b/cypress.json @@ -0,0 +1,3 @@ +{ + "projectId": "4b7344" +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000..02e4254 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/integration/examples/login.spec.js b/cypress/integration/examples/login.spec.js new file mode 100644 index 0000000..ea24f58 --- /dev/null +++ b/cypress/integration/examples/login.spec.js @@ -0,0 +1,28 @@ +describe('E2E Tests - Login', () => { + it('I navigate to the login page', () => { + cy.visit('https://the-internet.herokuapp.com/login') + cy.get('h2').should('contain', 'Login Page') + }) + + it('I submit invalid login credentials', () => { + cy.get('#username').type('invalid_usr') + cy.get('#password').type('invalid_pass') + cy.get('button[type="submit"]').click() + cy.get('.flash.error').should('be.visible') + cy.screenshot({capture: 'fullPage'}) + }) + + it('I submit valid login credentials', () => { + cy.get('#username').type('tomsmith') + cy.get('#password').type('SuperSecretPassword!') + cy.get('button[type="submit"]').click() + cy.get('.flash.success').should('be.visible') + cy.screenshot({capture: 'fullPage'}) + }) + + it('I logout from the app', () => { + cy.get('.button.secondary.radius').click() + cy.get('h2').should('contain', 'Login Page') + cy.screenshot({capture: 'fullPage'}) + }) +}) diff --git a/cypress/integration/examples/login_two.spec.js b/cypress/integration/examples/login_two.spec.js new file mode 100644 index 0000000..21c1bdb --- /dev/null +++ b/cypress/integration/examples/login_two.spec.js @@ -0,0 +1,28 @@ +describe('E2E Tests - Login_two', () => { + it('I navigate to the login page', () => { + cy.visit('https://the-internet.herokuapp.com/login') + cy.get('h2').should('contain', 'Login Page') + }) + + it('I submit invalid login credentials', () => { + cy.get('#username').type('invalid_usr') + cy.get('#password').type('invalid_pass') + cy.get('button[type="submit"]').click() + cy.get('.flash.error').should('be.visible') + cy.screenshot({capture: 'fullPage'}) + }) + + it('I submit valid login credentials', () => { + cy.get('#username').type('tomsmith') + cy.get('#password').type('SuperSecretPassword!') + cy.get('button[type="submit"]').click() + cy.get('.flash.success').should('be.visible') + cy.screenshot({capture: 'fullPage'}) + }) + + it('I logout from the app', () => { + cy.get('.button.secondary.radius').click() + cy.get('h2').should('contain', 'Login Page') + cy.screenshot({capture: 'fullPage'}) + }) +}) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 0000000..59b2bab --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 0000000..119ab03 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 0000000..d68db96 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/hyperexecute b/hyperexecute new file mode 100755 index 0000000..2ea2c51 Binary files /dev/null and b/hyperexecute differ diff --git a/iOS_parallel.xml b/iOS_parallel.xml index 5b6876f..c2dc248 100644 --- a/iOS_parallel.xml +++ b/iOS_parallel.xml @@ -1,10 +1,22 @@ - - + + + + + + - - + - - + + + + + + + + + + + diff --git a/iOS_single.xml b/iOS_single.xml index 6ee3cc0..7f80f13 100644 --- a/iOS_single.xml +++ b/iOS_single.xml @@ -1,9 +1,14 @@ - - + + + + + + + - + - - + + diff --git a/jmeter.yaml b/jmeter.yaml new file mode 100644 index 0000000..c58f77c --- /dev/null +++ b/jmeter.yaml @@ -0,0 +1,73 @@ +--- +version: 0.1 +globalTimeout: 150 +testSuiteTimeout: 150 + +runson: linux + +autosplit: true +retryOnFailure: false + +maxRetries: 1 +concurrency: 4 + +scenarioCommandStatusOnly: true + +shell: bash + +performance: + type: jmeter + jmeter: + # - region: eastus + # users: 150 + # duration: 180 + # # iterations: 2 + # rampup: 5 + # url: "https://the-internet.herokuapp.com/" + + # - region: eastus + # users: 100 + # duration: 180 + # # iterations: 2 + # rampup: 5 + # url: "https://the-internet.herokuapp.com/" + + - region: "eastus" + users: 100 + rampup: 60 + duration: 120 + jmx: "./test.jmx" + + - region: "westus" + users: 100 + rampup: 60 + duration: 120 + jmx: "./test.jmx" + + # - region: eastus2 + # users: 5002 + # duration: 600 + # rampup: 5 + # url: "https://the-internet.herokuapp.com/" + + # - region: eastus2 + # users: 4998 + # duration: 600 + # rampup: 5 + # url: "https://the-internet.herokuapp.com/" + +report: true +partialReports: + type: html + location: ./ + frameworkName: jmeter + +jobLabel: + - sp-test + +project: + name: SP - sample JMeter project + # name: AG - sample JMeter project 1 + +differentialUpload: + enabled: true diff --git a/lambdatest-config.json b/lambdatest-config.json new file mode 100644 index 0000000..4f005dd --- /dev/null +++ b/lambdatest-config.json @@ -0,0 +1,41 @@ +{ + "lambdatest_auth": { + "username": "", + "access_key": "" + }, + "browsers": [ + { + "browser": "Chrome", + "platform": "Windows 10", + "versions": [ + "latest-1" + ] + }, + { + "browser": "Firefox", + "platform": "macOS Big Sur", + "versions": [ + "latest" + ] + } + ], + "run_settings": { + "cypress_config_file": "cypress.json", + "build_name": "Cypress-Demo", + "parallels": 4, + + "specs": "./cypress/integration/examples/*.spec.js", + "ignore_files": "", + "feature_file_suppport": false, + "network": true, + "headless": false, + "reporter_config_file": "", + "npm_dependencies": { + "cypress": "9.0.0" + } + }, + "tunnel_settings": { + "tunnel": false, + "tunnel_name": null + } +} \ No newline at end of file diff --git a/lambdatest_run.json b/lambdatest_run.json new file mode 100644 index 0000000..8e62551 --- /dev/null +++ b/lambdatest_run.json @@ -0,0 +1,4 @@ +{ + "build_id": "33034519", + "session_id": "87296375-b772-4ae4-a017-5d60cbdaf1b5" +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..1d65134 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "Cypress_Lambdatest_Demo", + "version": "0.0.0-development", + "description": "This is an example app used to showcase Cypress.io testing. For a full reference of our documentation, go to https://docs.cypress.io", + "main": "index.js", + "files": [ + "app", + "cypress" + ], + "scripts": { + "test": "npx lambdatest-cypress run" + }, + "author": "Mayank Maurya", + "dependencies": { + }, + "devDependencies": { + "cypress": "6.2.1", + "lambdatest-cypress-cli": "git+https://github.com/LambdaTest/lambdatest-cypress-cli.git", + "typescript": "3.7.4", + "@playwright/test": "1.20.2", + "playwright": "1.20.2", + "@cucumber/cucumber": "^7.3.2", + "@lambdatest/node-fetch-sessions": "^1.0.4" + } +} diff --git a/parallel.xml b/parallel.xml index 21cddc0..06c588a 100644 --- a/parallel.xml +++ b/parallel.xml @@ -6,6 +6,7 @@ + \ No newline at end of file diff --git a/playwright_parallel.js b/playwright_parallel.js new file mode 100644 index 0000000..5b5116c --- /dev/null +++ b/playwright_parallel.js @@ -0,0 +1,79 @@ +const { chromium } = require('playwright') +const { expect } = require('@playwright/test') + +const parallelTests = async (capability) => { + console.log('Initialising test:: ', capability['LT:Options']['name']) + + const browser = await chromium.connect({ + wsEndpoint: `wss://cdp.lambdatest.com/playwright?capabilities=${encodeURIComponent(JSON.stringify(capability))}` + }) + + const page = await browser.newPage() + + await page.goto('https://www.bing.com') + + const element = await page.$('[id="sb_form_q"]') + await element.click() + await element.type('LambdaTest') + await element.press('Enter') + const title = await page.title() + + try { + expect(title).toEqual('LambdaTest - Search') + // Mark the test as completed or failed + await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ action: 'setTestStatus', arguments: { status: 'passed', remark: 'Title matched' } })}`) + } catch { + await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ action: 'setTestStatus', arguments: { status: 'failed', remark: 'Title not matched' } })}`) + } + + await browser.close() +} + +// Capabilities array for with the respective configuration for the parallel tests +const capabilities = [ + { + 'browserName': 'Chrome', // Browsers allowed: `Chrome`, `MicrosoftEdge`, `pw-chromium`, `pw-firefox` and `pw-webkit` + 'browserVersion': 'latest', + 'LT:Options': { + 'platform': 'Windows 10', + 'build': 'Playwright Sample Build', + 'name': 'Playwright Sample Test on Windows 10 - Chrome', + 'user': process.env.LT_USERNAME, + 'accessKey': process.env.LT_ACCESS_KEY, + 'network': true, + 'video': true, + 'console': true + } + }, + { + 'browserName': 'MicrosoftEdge', + 'browserVersion': '109', + 'LT:Options': { + 'platform': 'Windows 8', + 'build': 'Playwright Sample Build', + 'name': 'Playwright Sample Test on Windows 8 - MicrosoftEdge', + 'user': process.env.LT_USERNAME, + 'accessKey': process.env.LT_ACCESS_KEY, + 'network': true, + 'video': true, + 'console': true + } + }, + { + 'browserName': 'Chrome', + 'browserVersion': 'latest', + 'LT:Options': { + 'platform': 'MacOS Big sur', + 'build': 'Playwright Sample Build', + 'name': 'Playwright Sample Test on MacOS Big sur - Chrome', + 'user': process.env.LT_USERNAME, + 'accessKey': process.env.LT_ACCESS_KEY, + 'network': true, + 'video': true, + 'console': true + } + }] + +capabilities.forEach(async (capability) => { + await parallelTests(capability) +}) \ No newline at end of file diff --git a/playwright_single.js b/playwright_single.js new file mode 100644 index 0000000..4f1594c --- /dev/null +++ b/playwright_single.js @@ -0,0 +1,46 @@ +const { chromium } = require('playwright') +const { expect } = require('@playwright/test'); + +(async () => { + const capabilities = { + 'browserName': 'Chrome', // Browsers allowed: `Chrome`, `MicrosoftEdge`, `pw-chromium`, `pw-firefox` and `pw-webkit` + 'browserVersion': 'latest', + 'LT:Options': { + 'platform': 'Windows 10', + 'build': 'Playwright Sample Build', + 'name': 'Playwright Sample Test', + 'user': process.env.LT_USERNAME, + 'accessKey': process.env.LT_ACCESS_KEY, + 'network': true, + 'video': true, + 'console': true, + 'tunnel': false, // Add tunnel configuration if testing locally hosted webpage + 'tunnelName': '', // Optional + 'geoLocation': '', // country code can be fetched from https://www.lambdatest.com/capabilities-generator/ + } + } + + const browser = await chromium.connect({ + wsEndpoint: `wss://cdp.lambdatest.com/playwright?capabilities=${encodeURIComponent(JSON.stringify(capabilities))}` + }) + + const page = await browser.newPage() + + await page.goto('https://www.bing.com') + + const element = await page.$('[id="sb_form_q"]') + await element.click() + await element.type('LambdaTest') + await element.press('Enter') + const title = await page.title() + + try { + expect(title).toEqual('LambdaTest - Search') + // Mark the test as completed or failed + await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ action: 'setTestStatus', arguments: { status: 'passed', remark: 'Title matched' } })}`) + } catch { + await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ action: 'setTestStatus', arguments: { status: 'failed', remark: 'Title not matched' } })}`) + } + + await browser.close() +})() \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8723a25..99c133a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,15 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 Java-TestNG-Selenium Java-TestNG-Selenium 0.0.1-SNAPSHOT + + 1.8 + 1.8 + - Java-TestNG-Selenium/src Java-TestNG-Selenium/src @@ -18,10 +21,7 @@ maven-compiler-plugin - 3.7.0 - - 10 - + 3.10.0 org.apache.maven.plugins @@ -35,6 +35,9 @@ + + ${env.project} + ${suite} @@ -50,6 +53,12 @@ selenium-java 3.13.0 + + com.microsoft.playwright + playwright + 1.19.0 + compile + org.testng @@ -60,17 +69,17 @@ io.appium java-client 7.0.0 - + commons-io commons-io 1.3.2 - + com.googlecode.json-simple json-simple 1.1.1 - + \ No newline at end of file diff --git a/result.json b/result.json new file mode 100644 index 0000000..d4082de --- /dev/null +++ b/result.json @@ -0,0 +1,86 @@ +{ + "data": { + "suites": [ + { + "title": "E2E Tests - Login", + "tests": [ + { + "title": "I navigate to the login page", + "fullTitle": "E2E Tests - Login I navigate to the login page", + "timedOut": null, + "duration": 1442, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "cy.visit('https://the-internet.herokuapp.com/login');\ncy.get('h2').should('contain', 'Login Page');", + "err": {}, + "uuid": "4d4f9dcf-50ac-4839-a347-b6e4d2370a1f", + "parentUUID": "d295d56e-f349-407e-b023-910caed67a37", + "isHook": false, + "skipped": false + }, + { + "title": "I submit invalid login credentials", + "fullTitle": "E2E Tests - Login I submit invalid login credentials", + "timedOut": null, + "duration": 2366, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "cy.get('#username').type('invalid_usr');\ncy.get('#password').type('invalid_pass');\ncy.get('button[type=\"submit\"]').click();\ncy.get('.flash.error').should('be.visible');\ncy.screenshot({\n capture: 'fullPage'\n});", + "err": {}, + "uuid": "5e742de4-1619-4c42-8032-f37d9c638e18", + "parentUUID": "d295d56e-f349-407e-b023-910caed67a37", + "isHook": false, + "skipped": false + }, + { + "title": "I submit valid login credentials", + "fullTitle": "E2E Tests - Login I submit valid login credentials", + "timedOut": null, + "duration": 2717, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "cy.get('#username').type('tomsmith');\ncy.get('#password').type('SuperSecretPassword!');\ncy.get('button[type=\"submit\"]').click();\ncy.get('.flash.success').should('be.visible');\ncy.screenshot({\n capture: 'fullPage'\n});", + "err": {}, + "uuid": "11f16fd6-fc84-45e4-b615-e840d1a55462", + "parentUUID": "d295d56e-f349-407e-b023-910caed67a37", + "isHook": false, + "skipped": false + }, + { + "title": "I logout from the app", + "fullTitle": "E2E Tests - Login I logout from the app", + "timedOut": null, + "duration": 725, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "cy.get('.button.secondary.radius').click();\ncy.get('h2').should('contain', 'Login Page');\ncy.screenshot({\n capture: 'fullPage'\n});", + "err": {}, + "uuid": "a2585cd6-dd66-4094-b354-a68ec8621cbd", + "parentUUID": "d295d56e-f349-407e-b023-910caed67a37", + "isHook": false, + "skipped": false + } + ] + } + ], + "spec": "cypress/integration/examples/login.spec.js" + }, + "status": "success", + "message": "Retrieve logs list was successful" +} \ No newline at end of file diff --git a/src/test/java/com/lambdaTestApp/android/Android1.java b/src/test/java/com/lambdaTestApp/android/Android1.java deleted file mode 100644 index 9b36509..0000000 --- a/src/test/java/com/lambdaTestApp/android/Android1.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.lambdaTestApp.android; - -import java.net.URL; -import java.util.List; -import java.net.MalformedURLException; - -import io.appium.java_client.MobileBy; -import io.appium.java_client.android.AndroidDriver; -import io.appium.java_client.android.AndroidElement; - -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.Test; -import org.openqa.selenium.remote.DesiredCapabilities; - -public class Android1 { - - String userName = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); - String accessKey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); - String android_appurl = System.getenv("android_appurl") == null ? "Your android appurl" : System.getenv("android_appurl"); - - @Test - public void basicTest() throws MalformedURLException, - InterruptedException { - DesiredCapabilities caps = new DesiredCapabilities(); - - caps.setCapability("platformName", "Android"); - caps.setCapability("deviceName", "Galaxy Tab S4"); - caps.setCapability("platformVersion", "10"); - caps.setCapability("isRealMobile", true); - caps.setCapability("project", "App Automation Demo"); - caps.setCapability("build", "Android"); - caps.setCapability("name", "Single Test"); - caps.setCapability("app", android_appurl ); - - AndroidDriver driver = new AndroidDriver( - new URL("https://" + userName + ":" + accessKey + "@beta-hub.lambdatest.com/wd/hub"), - caps); - WebDriverWait wait = new WebDriverWait(driver, 10); - AndroidElement searchElement = (AndroidElement) wait - .until(ExpectedConditions - .elementToBeClickable(MobileBy.AccessibilityId("Search Wikipedia"))); - searchElement.click(); - AndroidElement insertTextElement = (AndroidElement) wait - .until(ExpectedConditions.elementToBeClickable( - MobileBy.id("org.wikipedia.alpha:id/search_src_text"))); - insertTextElement.sendKeys("LambdaTest"); - Thread.sleep(5000); - - List allProductsName = driver.findElementsByClassName("android.widget.TextView"); - assert (allProductsName.size() > 0); - - // The driver.quit statement is required, otherwise the test continues to - // execute, leading to a timeout. - driver.quit(); - } -} diff --git a/src/test/java/com/lambdaTestApp/android/Android2.java b/src/test/java/com/lambdaTestApp/android/Android2.java deleted file mode 100644 index f0f2a6d..0000000 --- a/src/test/java/com/lambdaTestApp/android/Android2.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.lambdaTestApp.android; - -import java.net.URL; -import java.util.List; -import java.net.MalformedURLException; - -import io.appium.java_client.MobileBy; -import io.appium.java_client.android.AndroidDriver; -import io.appium.java_client.android.AndroidElement; - -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.Test; -import org.openqa.selenium.remote.DesiredCapabilities; - -public class Android2 { - - String userName = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); - String accessKey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); - String android_appurl = System.getenv("android_appurl") == null ? "Your android appurl" : System.getenv("android_appurl"); - - @Test - public void basicTest() throws MalformedURLException, - InterruptedException { - DesiredCapabilities caps = new DesiredCapabilities(); - - caps.setCapability("platformName", "Android"); - caps.setCapability("deviceName", "Google Pixel 4"); - caps.setCapability("platformVersion", "11"); - caps.setCapability("isRealMobile", true); - caps.setCapability("project", "App Automation Demo"); - caps.setCapability("build", "Android"); - caps.setCapability("name", "Single Test"); - caps.setCapability("app", android_appurl); - - AndroidDriver driver = new AndroidDriver( - new URL("https://" + userName + ":" + accessKey + "@beta-hub.lambdatest.com/wd/hub"), - caps); - WebDriverWait wait = new WebDriverWait(driver, 10); - AndroidElement searchElement = (AndroidElement) wait - .until(ExpectedConditions - .elementToBeClickable(MobileBy.AccessibilityId("Search Wikipedia"))); - searchElement.click(); - AndroidElement insertTextElement = (AndroidElement) wait - .until(ExpectedConditions.elementToBeClickable( - MobileBy.id("org.wikipedia.alpha:id/search_src_text"))); - insertTextElement.sendKeys("LambdaTest"); - Thread.sleep(5000); - - List allProductsName = driver.findElementsByClassName("android.widget.TextView"); - assert (allProductsName.size() > 0); - - // The driver.quit statement is required, otherwise the test continues to - // execute, leading to a timeout. - driver.quit(); - } -} diff --git a/src/test/java/com/lambdaTestApp/android/AndroidApp.java b/src/test/java/com/lambdaTestApp/android/AndroidApp.java new file mode 100644 index 0000000..5f8be43 --- /dev/null +++ b/src/test/java/com/lambdaTestApp/android/AndroidApp.java @@ -0,0 +1,193 @@ +package com.lambdaTestApp.android; + +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.MobileElement; +import okhttp3.*; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Optional; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class AndroidApp { + + String userName = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); + String accessKey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); + + String credential = Credentials.basic(userName, accessKey); + public String gridURL = "@mobile-hub.lambdatest.com/wd/hub"; + + AppiumDriver driver; + + @BeforeSuite + public void beforeSuite() throws IOException, InterruptedException { + if (isAppPresent()){ + System.out.println("App already present, skipping app upload..."); + }else { + System.out.println("App not present, uploading app..."); + uploadApp(); + System.out.println("App upload successful"); + System.out.println("Waiting for tests to be initiated. It will take approx. 1 min for app to be configured to run with network logs"); + Thread.sleep(60000); + System.out.println("Starting the test execution..."); + } + } + + @Test + @org.testng.annotations.Parameters(value = {"device", "version", "platform"}) + public void AndroidApp1(String device, @Optional String version, String platform) { + try { + DesiredCapabilities capabilities = new DesiredCapabilities(); + capabilities.setCapability("build","Java TestNG Android"); + capabilities.setCapability("name",platform+" "+device+" "+version); + capabilities.setCapability("deviceName", device); + capabilities.setCapability("platformVersion",version); + capabilities.setCapability("platformName", platform); + capabilities.setCapability("isRealMobile", true); + //AppURL (Create from Wikipedia.apk sample in project) + capabilities.setCapability("app", "proverbial-android"); //Enter your app url + capabilities.setCapability("deviceOrientation", "PORTRAIT"); + capabilities.setCapability("console", true); + capabilities.setCapability("network", true); + capabilities.setCapability("visual", true); + capabilities.setCapability("devicelog", true); + capabilities.setCapability("appProfiling", true); + //capabilities.setCapability("geoLocation", "HK"); + + String hub = "https://" + userName + ":" + accessKey + gridURL; + driver = new AppiumDriver(new URL(hub), capabilities); + + MobileElement color = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/color"); + //Changes color to pink + color.click(); + Thread.sleep(1000); + //Back to orginal color + color.click(); + + + + MobileElement text = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/Text"); + //Changes the text to "Proverbial" + text.click(); + + //toast will be visible + MobileElement toast = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/toast"); + toast.click(); + + + //notification will be visible + MobileElement notification = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/notification"); + notification.click(); + Thread.sleep(2000); + + //Opens the geolocation page + MobileElement geo = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/geoLocation"); + geo.click(); + Thread.sleep(5000); + + //takes back to home page + MobileElement home = (MobileElement) driver.findElementByAccessibilityId("Home"); + home.click(); + + //Takes to speed test page + MobileElement speedtest = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/speedTest"); + speedtest.click(); + Thread.sleep(5000); + + MobileElement Home = (MobileElement) driver.findElementByAccessibilityId("Home"); + Home.click(); + + //Opens the browser + MobileElement browser = (MobileElement) driver.findElementByAccessibilityId("Browser"); + browser.click(); + + MobileElement url = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/url"); + url.sendKeys("https://www.lambdatest.com"); + + MobileElement find = (MobileElement) driver.findElementById("com.lambdatest.proverbial:id/find"); + find.click(); + + driver.quit(); + + } catch (Exception e) { + e.printStackTrace(); + try{ + driver.quit(); + }catch(Exception e1){ + e.printStackTrace(); + } + } + + + } + + private void uploadApp() throws IOException, InterruptedException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("text/plain"); + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("appFile","apps/proverbial_android.apk", + RequestBody.create(MediaType.parse("application/octet-stream"), + new File("apps/proverbial_android.apk"))) + .addFormDataPart("custom_id","proverbial-android") + .addFormDataPart("name","proverbial-android") + .build(); + Request request = new Request.Builder() + .url("https://manual-api.lambdatest.com/app/upload/realDevice") + .method("POST", body) + .addHeader("Authorization", credential) + .build(); + Response response = client.newCall(request).execute(); + //System.out.println(response.body().string()); + } + + private boolean isAppPresent() throws IOException { + String jsonString = getResponseAsJson("android"); + List listOfApps = getAppIdsFromJson(jsonString); + return listOfApps.contains("proverbial-android"); + } + private String getResponseAsJson(String platform) throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("text/plain"); + RequestBody body = RequestBody.create(mediaType, ""); + Request request = new Request.Builder() + .url("https://manual-api.lambdatest.com/app/data?type="+platform+"&level=user") + .method("GET",null) + .addHeader("Authorization", credential) + .build(); + + + Response response = client.newCall(request).execute(); + assert response.body() != null; + return response.body().string(); + } + + private List getAppIdsFromJson(String jsonData) { + List namesList = new ArrayList(); + try { + JSONParser parser = new JSONParser(); + JSONObject jsonObject = (JSONObject) parser.parse(jsonData); + JSONArray dataArray = (JSONArray) jsonObject.get("data"); + for (Object data : dataArray) { + JSONObject dataObject = (JSONObject) data; + String name = (String) dataObject.get("name"); + namesList.add(name); + } + } catch (ParseException e) { + e.printStackTrace(); + } + return namesList; + } + +} + diff --git a/src/test/java/com/lambdaTestApp/iOS/IOSApp.java b/src/test/java/com/lambdaTestApp/iOS/IOSApp.java new file mode 100644 index 0000000..ab5f180 --- /dev/null +++ b/src/test/java/com/lambdaTestApp/iOS/IOSApp.java @@ -0,0 +1,193 @@ +package com.lambdaTestApp.iOS; + +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.MobileBy; +import io.appium.java_client.MobileElement; +import okhttp3.*; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class IOSApp { + + String userName = System.getenv("LT_USERNAME") == null ? + "username" : System.getenv("LT_USERNAME"); //Add username here + String accessKey = System.getenv("LT_ACCESS_KEY") == null ? + "accessKey" : System.getenv("LT_ACCESS_KEY"); //Add accessKey here + + public String gridURL = "@mobile-hub.lambdatest.com/wd/hub"; + + private final String credential = Credentials.basic(userName, accessKey); + + AppiumDriver driver; + + @BeforeSuite + public void beforeSuite() throws IOException, InterruptedException { + if (isAppPresent()){ + System.out.println("App already present, skipping app upload..."); + }else { + System.out.println("App not present, uploading app..."); + uploadApp(); + System.out.println("App upload successful"); + System.out.println("Waiting for tests to be initiated. It will take approx. 1 min for app to be configured to run with network logs"); + Thread.sleep(60000); + System.out.println("Starting the test execution..."); + } + } + + @Test + @org.testng.annotations.Parameters(value = {"device", "version", "platform"}) + public void iOSApp1(String device, String version, String platform) { + + try { + DesiredCapabilities capabilities = new DesiredCapabilities(); + capabilities.setCapability("build","Java TestNG iOS"); + capabilities.setCapability("name",platform+" "+device+" "+version); + capabilities.setCapability("deviceName", device); + capabilities.setCapability("platformVersion",version); + capabilities.setCapability("platformName", platform); + capabilities.setCapability("isRealMobile", true); + capabilities.setCapability("app", "proverbial-ios"); //Enter your app url + capabilities.setCapability("deviceOrientation", "PORTRAIT"); + capabilities.setCapability("console", true); + capabilities.setCapability("network", true); + capabilities.setCapability("visual", true); + capabilities.setCapability("devicelog", true); + capabilities.setCapability("appProfiling", true); + //capabilities.setCapability("geoLocation", "HK"); + + String hub = "https://" + userName + ":" + accessKey + gridURL; + driver = new AppiumDriver(new URL(hub), capabilities); + + WebDriverWait Wait = new WebDriverWait(driver,30); + + //Changes the color of the text + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("color"))).click(); + Thread.sleep(1000); + + //Changes the text to "Proverbial" + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("Text"))).click(); + Thread.sleep(1000); + + //Toast will be visible + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("toast"))).click(); + Thread.sleep(1000); + + //Notification will be visible + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("notification"))).click(); + Thread.sleep(4000); + + //Opens the geolocation page + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("geoLocation"))).click(); + Thread.sleep(4000); + + //Takes back + driver.navigate().back(); + + //Takes to speedtest page + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("speedTest"))).click(); + Thread.sleep(4000); + + driver.navigate().back(); + + //Opens the browser + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("Browser"))).click(); + Thread.sleep(1000); + + MobileElement url = (MobileElement) driver.findElementByAccessibilityId("url"); + url.click(); + url.sendKeys("https://www.lambdatest.com"); + + Wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("find"))).click(); + Thread.sleep(1000); + + driver.quit(); + + } catch (Exception e) { + e.printStackTrace(); + try{ + driver.quit(); + }catch(Exception e1){ + e.printStackTrace(); + } + } + + + } + + private void uploadApp() throws IOException, InterruptedException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("text/plain"); + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("appFile", "apps/proverbial_ios.ipa", + RequestBody.create(MediaType.parse("application/octet-stream"), + new File("apps/proverbial_ios.ipa"))) + .addFormDataPart("custom_id","proverbial-ios") + .addFormDataPart("name","proverbial-ios") + .build(); + Request request = new Request.Builder() + .url("https://manual-api.lambdatest.com/app/upload/realDevice") + .method("POST", body) + .addHeader("Authorization", credential) + .build(); + Response response = client.newCall(request).execute(); + Thread.sleep(15000); + + } + + private boolean isAppPresent() throws IOException { + String jsonString = getResponseAsJson("ios"); + List listOfApps = getAppIdsFromJson(jsonString); + return listOfApps.contains("proverbial-ios"); + } + + private String getResponseAsJson(String platform) throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("text/plain"); + RequestBody body = RequestBody.create(mediaType, ""); + Request request = new Request.Builder() + .url("https://manual-api.lambdatest.com/app/data?type="+platform+"&level=user") + .method("GET",null) + .addHeader("Authorization", credential) + .build(); + + + Response response = client.newCall(request).execute(); + assert response.body() != null; + return response.body().string(); + } + + private List getAppIdsFromJson(String jsonData) { + List namesList = new ArrayList(); + try { + JSONParser parser = new JSONParser(); + JSONObject jsonObject = (JSONObject) parser.parse(jsonData); + JSONArray dataArray = (JSONArray) jsonObject.get("data"); + for (Object data : dataArray) { + JSONObject dataObject = (JSONObject) data; + String name = (String) dataObject.get("name"); + namesList.add(name); + } + } catch (ParseException e) { + e.printStackTrace(); + } + return namesList; + } + +} + + diff --git a/src/test/java/com/lambdaTestApp/iOS/iOS1.java b/src/test/java/com/lambdaTestApp/iOS/iOS1.java deleted file mode 100644 index d081f60..0000000 --- a/src/test/java/com/lambdaTestApp/iOS/iOS1.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.lambdaTestApp.iOS; - -import java.net.URL; -import java.net.MalformedURLException; - -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.Test; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.ExpectedConditions; - -import io.appium.java_client.MobileBy; -import io.appium.java_client.ios.IOSDriver; -import io.appium.java_client.ios.IOSElement; - -public class iOS1 { - public static String username = System.getenv("LT_USERNAME"); - public static String accessKey = System.getenv("LT_ACCESS_KEY"); - public static String iOS_appurl = System.getenv("iOS_appurl"); - - @Test - public void basicTest() throws MalformedURLException, InterruptedException { - DesiredCapabilities capabilities = new DesiredCapabilities(); - capabilities.setCapability("build", "iOSAppAutomation_LT"); - capabilities.setCapability("name", "iOS_Test"); - capabilities.setCapability("platformName", "iOS"); - capabilities.setCapability("deviceName", "iPhone 13 Mini"); - capabilities.setCapability("isRealMobile", true); - capabilities.setCapability("platformVersion", "15.0"); - capabilities.setCapability("console", true); - capabilities.setCapability("visual", true); - capabilities.setCapability("app", iOS_appurl); - - IOSDriver driver = new IOSDriver( - new URL("https://" + username + ":" + accessKey + "@beta-hub.lambdatest.com/wd/hub"), - capabilities); - - IOSElement Checkbox = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[1]/XCUIElementTypeSwitch"))); - Checkbox.click(); - - IOSElement Checkbox1 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[2]/XCUIElementTypeSwitch"))); - Checkbox1.click(); - - IOSElement Checkbox2 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[3]/XCUIElementTypeSwitch"))); - Checkbox2.click(); - - IOSElement Checkbox3 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[4]/XCUIElementTypeSwitch"))); - Checkbox3.click(); - - IOSElement Checkbox4 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[5]/XCUIElementTypeSwitch"))); - Checkbox4.click(); - - IOSElement Checkbox5 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[4]/XCUIElementTypeTextField"))); - Checkbox5.sendKeys("Sixth Item"); - - Thread.sleep(5000); - - IOSElement Checkbox6 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.AccessibilityId("add"))); - Checkbox6.click(); - - // The driver.quit statement is required, otherwise the test continues to - // execute, leading to a timeout. - driver.quit(); - } -} \ No newline at end of file diff --git a/src/test/java/com/lambdaTestApp/iOS/iOS2.java b/src/test/java/com/lambdaTestApp/iOS/iOS2.java deleted file mode 100644 index 3975c83..0000000 --- a/src/test/java/com/lambdaTestApp/iOS/iOS2.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.lambdaTestApp.iOS; - -import java.net.URL; -import java.net.MalformedURLException; - -import org.openqa.selenium.support.ui.WebDriverWait; -import org.testng.annotations.Test; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.support.ui.ExpectedConditions; - -import io.appium.java_client.MobileBy; -import io.appium.java_client.ios.IOSDriver; -import io.appium.java_client.ios.IOSElement; - -public class iOS2 { - public static String username = System.getenv("LT_USERNAME"); - public static String accessKey = System.getenv("LT_ACCESS_KEY"); - public static String iOS_appurl = System.getenv("iOS_appurl"); - - @Test - public void basicTest() throws MalformedURLException, InterruptedException { - DesiredCapabilities capabilities = new DesiredCapabilities(); - capabilities.setCapability("build", "iOSAppAutomation_LT"); - capabilities.setCapability("name", "iOS_Test"); - capabilities.setCapability("platformName", "iOS"); - capabilities.setCapability("deviceName", "iPhone 11"); - capabilities.setCapability("isRealMobile", true); - capabilities.setCapability("platformVersion", "13.0"); - capabilities.setCapability("console", true); - capabilities.setCapability("visual", true); - capabilities.setCapability("app", iOS_appurl); - - IOSDriver driver = new IOSDriver( - new URL("https://" + username + ":" + accessKey + "@beta-hub.lambdatest.com/wd/hub"), - capabilities); - - IOSElement Checkbox = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[1]/XCUIElementTypeSwitch"))); - Checkbox.click(); - - IOSElement Checkbox1 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[2]/XCUIElementTypeSwitch"))); - Checkbox1.click(); - - IOSElement Checkbox2 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[3]/XCUIElementTypeSwitch"))); - Checkbox2.click(); - - IOSElement Checkbox3 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[4]/XCUIElementTypeSwitch"))); - Checkbox3.click(); - - IOSElement Checkbox4 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[3]/XCUIElementTypeOther[5]/XCUIElementTypeSwitch"))); - Checkbox4.click(); - - IOSElement Checkbox5 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.xpath( - "//XCUIElementTypeOther[@name=\"Sample page - lambdatest.com\"]/XCUIElementTypeOther[4]/XCUIElementTypeTextField"))); - Checkbox5.sendKeys("Sixth Item"); - - Thread.sleep(5000); - - IOSElement Checkbox6 = (IOSElement) new WebDriverWait(driver, 30).until( - ExpectedConditions.elementToBeClickable(MobileBy.AccessibilityId("add"))); - Checkbox6.click(); - - // The driver.quit statement is required, otherwise the test continues to - // execute, leading to a timeout. - driver.quit(); - } -} \ No newline at end of file diff --git a/src/test/java/com/lambdatest/TestNGAccessibilty.java b/src/test/java/com/lambdatest/TestNGAccessibilty.java new file mode 100644 index 0000000..9712deb --- /dev/null +++ b/src/test/java/com/lambdatest/TestNGAccessibilty.java @@ -0,0 +1,208 @@ +package com.lambdatest; + +import org.openqa.selenium.By; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; +import org.testng.ITestContext; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; + +public class TestNGAccessibilty { + + private RemoteWebDriver driver; + private String Status = "failed"; + + @BeforeMethod + public void setup(Method m, ITestContext ctx) throws MalformedURLException { + String username = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); + String authkey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); + ; + String hub = "@hub.lambdatest.com/wd/hub"; + + DesiredCapabilities caps = new DesiredCapabilities(); + caps.setCapability("browserName", "Chrome"); + caps.setCapability("version", "latest"); + caps.setCapability("build", "TestNG With Java"); + caps.setCapability("name", m.getName() + this.getClass().getName()); + caps.setCapability("plugin", "git-testng"); + caps.setCapability("performance",true); + caps.setCapability("network", true); + caps.setCapability("console", true); + caps.setCapability("video", true); + caps.setCapability("w3c", true); + caps.setCapability("accessibility", true); + //caps.setCapability("accessibility.wcagVersion", "wcag21a"); + caps.setCapability("accessibility.bestPractice", true); + caps.setCapability("accessibility.needsReview", true); + caps.setCapability("smartUI.project", "par"); + + + + + String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; + caps.setCapability("tags", Tags); + + driver = new RemoteWebDriver(new URL("http://" + username + ":" + authkey + hub), caps); + } + + + @Test + public void basicTest() throws InterruptedException { + String spanText; + System.out.println("Loading Url"); + + driver.get("https://www.google.com"); + + //driver.executeScript("smartui.takeScreenshot({'screenshotName':'home-page'})"); + + Thread.sleep(2000); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + + // Let's also assert that the todo we added is present in the list. + + spanText = driver.findElement (By.xpath("/html/body/div/div/div/ul/li[9]/span")).getText(); + Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; + Thread.sleep(150); + + System.out.println("TestFinished"); + + } + + @AfterMethod + public void tearDown() { + driver.executeScript("lambda-status=" + Status); + driver.quit(); + } + +} diff --git a/src/test/java/com/lambdatest/TestNGTodo1.java b/src/test/java/com/lambdatest/TestNGTodo1.java index 62577d1..b89aca2 100644 --- a/src/test/java/com/lambdatest/TestNGTodo1.java +++ b/src/test/java/com/lambdatest/TestNGTodo1.java @@ -32,6 +32,17 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { caps.setCapability("build", "TestNG With Java"); caps.setCapability("name", m.getName() + " - " + this.getClass().getName()); caps.setCapability("plugin", "git-testng"); + caps.setCapability("performance",true); + caps.setCapability("network", true); + caps.setCapability("console", true); + caps.setCapability("commandLog", true); + caps.setCapability("systemLog", true); + caps.setCapability("terminal", true); + caps.setCapability("video", true); + caps.setCapability("accessibility", true); + caps.setCapability("accessibility.bestPractice", true); + caps.setCapability("accessibility.needsReview", true); + String[] Tags = new String[] { "Feature", "Falcon", "Severe" }; caps.setCapability("tags", Tags); @@ -40,11 +51,11 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { } - @Test + @Test public void basicTest() throws InterruptedException { String spanText; System.out.println("Loading Url"); - + Thread.sleep(100); driver.get("https://lambdatest.github.io/sample-todo-app/"); System.out.println("Checking Box"); @@ -56,54 +67,22 @@ public void basicTest() throws InterruptedException { System.out.println("Checking Box"); driver.findElement(By.name("li3")).click(); - System.out.println("Checking Another Box"); - driver.findElement(By.name("li4")).click(); + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); driver.findElement(By.id("addbutton")).click(); - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); - driver.findElement(By.id("addbutton")).click(); - - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li1")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li3")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li7")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li8")).click(); - Thread.sleep(300); - - System.out.println("Entering Text"); - driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); - - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li9")).click(); - - // Let's also assert that the todo we added is present in the list. - - spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); - Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; - Thread.sleep(150); + Thread.sleep(800); System.out.println("TestFinished"); } - @AfterMethod public void tearDown() { driver.executeScript("lambda-status=" + Status); driver.quit(); } -} \ No newline at end of file +} diff --git a/src/test/java/com/lambdatest/TestNGTodo2.java b/src/test/java/com/lambdatest/TestNGTodo2.java index 1fd4be6..1906f0e 100644 --- a/src/test/java/com/lambdatest/TestNGTodo2.java +++ b/src/test/java/com/lambdatest/TestNGTodo2.java @@ -32,6 +32,21 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { caps.setCapability("build", "TestNG With Java"); caps.setCapability("name", m.getName() + this.getClass().getName()); caps.setCapability("plugin", "git-testng"); + caps.setCapability("performance",true); + caps.setCapability("network", true); + caps.setCapability("console", true); + caps.setCapability("performance", true); + caps.setCapability("accessibility", true); + + caps.setCapability("accessibility.bestPractice", true); + caps.setCapability("accessibility.needsReview", true); + + + + caps.setCapability("commandLog", true); + caps.setCapability("systemLog", true); + caps.setCapability("terminal", true); + caps.setCapability("video", true); String[] Tags = new String[] { "Feature", "Magicleap", "Severe" }; caps.setCapability("tags", Tags); @@ -39,11 +54,11 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps); } - @Test + @Test public void basicTest() throws InterruptedException { String spanText; System.out.println("Loading Url"); - + Thread.sleep(100); driver.get("https://lambdatest.github.io/sample-todo-app/"); System.out.println("Checking Box"); @@ -55,53 +70,22 @@ public void basicTest() throws InterruptedException { System.out.println("Checking Box"); driver.findElement(By.name("li3")).click(); - System.out.println("Checking Another Box"); - driver.findElement(By.name("li4")).click(); + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); driver.findElement(By.id("addbutton")).click(); - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); - driver.findElement(By.id("addbutton")).click(); - - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li1")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li3")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li7")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li8")).click(); - - System.out.println("Entering Text"); - driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); - - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li9")).click(); - - // Let's also assert that the todo we added is present in the list. - - spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); - Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; - Thread.sleep(150); + Thread.sleep(800); System.out.println("TestFinished"); } - @AfterMethod public void tearDown() { driver.executeScript("lambda-status=" + Status); driver.quit(); } -} \ No newline at end of file +} diff --git a/src/test/java/com/lambdatest/TestNGTodo3.java b/src/test/java/com/lambdatest/TestNGTodo3.java index 632320c..4551997 100644 --- a/src/test/java/com/lambdatest/TestNGTodo3.java +++ b/src/test/java/com/lambdatest/TestNGTodo3.java @@ -32,6 +32,18 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { caps.setCapability("build", "TestNG With Java"); caps.setCapability("name", m.getName() + this.getClass().getName()); caps.setCapability("plugin", "git-testng"); + caps.setCapability("performance",true); + caps.setCapability("network", true); + caps.setCapability("console", true); + + caps.setCapability("commandLog", true); + caps.setCapability("systemLog", true); + caps.setCapability("terminal", true); + caps.setCapability("video", true); + caps.setCapability("accessibility", true); + + caps.setCapability("accessibility.bestPractice", true); + caps.setCapability("accessibility.needsReview", true); String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; caps.setCapability("tags", Tags); @@ -55,42 +67,12 @@ public void basicTest() throws InterruptedException { System.out.println("Checking Box"); driver.findElement(By.name("li3")).click(); - System.out.println("Checking Another Box"); - driver.findElement(By.name("li4")).click(); + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); driver.findElement(By.id("addbutton")).click(); - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); - driver.findElement(By.id("addbutton")).click(); - - driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li1")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li3")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li7")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li8")).click(); - - System.out.println("Entering Text"); - driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); - - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li9")).click(); - - // Let's also assert that the todo we added is present in the list. - - spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); - Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; Thread.sleep(800); @@ -104,4 +86,4 @@ public void tearDown() { driver.quit(); } -} \ No newline at end of file +} diff --git a/src/test/java/com/lambdatest/TestNGTodoMobile.java b/src/test/java/com/lambdatest/TestNGTodoMobile.java index 29ae54a..ee26620 100644 --- a/src/test/java/com/lambdatest/TestNGTodoMobile.java +++ b/src/test/java/com/lambdatest/TestNGTodoMobile.java @@ -23,19 +23,24 @@ public void setup(Method m, ITestContext ctx) throws MalformedURLException { String username = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); String authkey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); ; - String hub = "@hub.lambdatest.com/wd/hub"; + String hub = "@mobile-hub.lambdatest.com/wd/hub"; DesiredCapabilities caps = new DesiredCapabilities(); - caps.setCapability("deviceName", "Google Pixel 4a"); + caps.setCapability("deviceName", "Pixel.*"); + caps.setCapability("platformName", "Android"); caps.setCapability("build", "TestNG With Java"); + caps.setCapability("platformVersion","11"); caps.setCapability("name", m.getName() + this.getClass().getName()); caps.setCapability("plugin", "git-testng"); caps.setCapability("isRealMobile", true); + caps.setCapability("console", true); + caps.setCapability("network", true); + String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; caps.setCapability("tags", Tags); - driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps); + driver = new RemoteWebDriver(new URL("http://" + username + ":" + authkey + hub), caps); } @Test @@ -72,27 +77,8 @@ public void basicTest() throws InterruptedException { System.out.println("Checking Another Box"); driver.findElement(By.name("li3")).click(); - System.out.println("Checking Another Box"); - driver.findElement(By.name("li7")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li8")).click(); - - System.out.println("Entering Text"); - driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); - - driver.findElement(By.id("addbutton")).click(); - - System.out.println("Checking Another Box"); - driver.findElement(By.name("li9")).click(); - - // Let's also assert that the todo we added is present in the list. - - spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); - Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); Status = "passed"; Thread.sleep(800); - System.out.println("TestFinished"); } diff --git a/src/test/java/com/lambdatest/VisualChangeBuild.java b/src/test/java/com/lambdatest/VisualChangeBuild.java new file mode 100644 index 0000000..4c5f2cc --- /dev/null +++ b/src/test/java/com/lambdatest/VisualChangeBuild.java @@ -0,0 +1,115 @@ +package com.lambdatest; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; + +import com.beust.jcommander.Parameter; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; +import org.testng.ITestContext; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; + +public class VisualChangeBuild { + + private RemoteWebDriver driver; + private String Status = "failed"; + + @BeforeMethod + @Parameters("environment") + public void setup(Method m, ITestContext ctx, String environment) throws MalformedURLException { + String username = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); + String authkey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); + ; + String hub = "@hub.lambdatest.com/wd/hub"; + + DesiredCapabilities caps = new DesiredCapabilities(); + caps.setCapability("platform", "Windows 10"); + caps.setCapability("browserName", "Chrome"); + caps.setCapability("version", "latest"); + caps.setCapability("build", "TestNG With Java - Visual Build"); + caps.setCapability("name", m.getName() + this.getClass().getName()); + caps.setCapability("plugin", "git-testng"); + caps.setCapability("network", true); + caps.setCapability("video", true); + caps.setCapability("smartUI.project", environment); + caps.setCapability("smartUI.baseline", false); + + String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; + caps.setCapability("tags", Tags); + + driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps); + } + + @Test + public void basicTest() throws InterruptedException { + String spanText; + System.out.println("Loading Url"); + Thread.sleep(100); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + + ((JavascriptExecutor)driver).executeScript("smartui.takeScreenshot=sample-1"); + + spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); + Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; + Thread.sleep(800); + + System.out.println("TestFinished"); + + } + + @AfterMethod + public void tearDown() { + driver.executeScript("lambda-status=" + Status); + driver.quit(); + } + +} diff --git a/src/test/java/com/lambdatest/Visual_Baseline.java b/src/test/java/com/lambdatest/Visual_Baseline.java new file mode 100644 index 0000000..4ce3b96 --- /dev/null +++ b/src/test/java/com/lambdatest/Visual_Baseline.java @@ -0,0 +1,119 @@ +package com.lambdatest; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; + +import com.beust.jcommander.Parameter; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; +import org.testng.ITestContext; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Parameters; +import org.testng.annotations.Test; + +public class Visual_Baseline { + + private RemoteWebDriver driver; + private String Status = "failed"; + + @BeforeMethod + @Parameters("environment") + public void setup(Method m, ITestContext ctx, String environment) throws MalformedURLException { + String username = System.getenv("LT_USERNAME") == null ? "Your LT Username" : System.getenv("LT_USERNAME"); + String authkey = System.getenv("LT_ACCESS_KEY") == null ? "Your LT AccessKey" : System.getenv("LT_ACCESS_KEY"); + ; + String hub = "@hub.lambdatest.com/wd/hub"; + + DesiredCapabilities caps = new DesiredCapabilities(); + caps.setCapability("platform", "Windows 10"); + caps.setCapability("browserName", "Chrome"); + caps.setCapability("version", "latest"); + caps.setCapability("build", "TestNG With Java - Visual Build"); + caps.setCapability("name", m.getName() + this.getClass().getName()); + caps.setCapability("plugin", "git-testng"); + caps.setCapability("network", true); + caps.setCapability("video", true); + caps.setCapability("smartUI.project", environment); + caps.setCapability("smartUI.baseline", true); + + + String[] Tags = new String[] { "Feature", "Tag", "Moderate" }; + caps.setCapability("tags", Tags); + + driver = new RemoteWebDriver(new URL("https://" + username + ":" + authkey + hub), caps); + } + + @Test + public void basicTest() throws InterruptedException { + String spanText; + System.out.println("Loading Url"); + Thread.sleep(100); + driver.get("https://lambdatest.github.io/sample-todo-app/"); + + + System.out.println("Checking Box"); + driver.findElement(By.name("li1")).click(); + + ((JavascriptExecutor)driver).executeScript("smartui.takeScreenshot=sample-1"); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li2")).click(); + + System.out.println("Checking Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li4")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 6"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 7"); + driver.findElement(By.id("addbutton")).click(); + + driver.findElement(By.id("sampletodotext")).sendKeys(" List Item 8"); + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li1")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li3")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li7")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li8")).click(); + + System.out.println("Entering Text"); + driver.findElement(By.id("sampletodotext")).sendKeys("Get Taste of Lambda and Stick to It"); + + driver.findElement(By.id("addbutton")).click(); + + System.out.println("Checking Another Box"); + driver.findElement(By.name("li9")).click(); + + // Let's also assert that the todo we added is present in the list. + + spanText = driver.findElementByXPath("/html/body/div/div/div/ul/li[9]/span").getText(); + Assert.assertEquals("Get Taste of Lambda and Stick to It", spanText); + Status = "passed"; + Thread.sleep(800); + + System.out.println("TestFinished"); + + } + + @AfterMethod + public void tearDown() { + driver.executeScript("lambda-status=" + Status); + driver.quit(); + } + +} diff --git a/test.jmx b/test.jmx new file mode 100644 index 0000000..1ca7456 --- /dev/null +++ b/test.jmx @@ -0,0 +1,157 @@ + + + + + false + false + + + + false + + + + continue + + 10 + false + + 10 + 4 + 1437578406000 + 1437578406000 + true + 60 + + false + true + + + + + + + + + false + + props.put("groupNum", System.getenv("GROUP_NUMBER")); + + + + + + + false + + + + ${PATH} + GET + true + false + true + false + false + false + false + 6 + false + 0 + 1000 + 3000 + Detected the start of a redirect chain + + + + true + false + false + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + + + + + + + \n + + url-list.txt + false + false + true + shareMode.all + false + PATH + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + + + + + + + + + diff --git a/testng_hyperexecute_autosplit_sample.yaml b/testng_hyperexecute_autosplit_sample.yaml new file mode 100644 index 0000000..001af07 --- /dev/null +++ b/testng_hyperexecute_autosplit_sample.yaml @@ -0,0 +1,54 @@ +--- +version: 0.2 +globalTimeout: 150 +testSuiteTimeout: 150 +testSuiteStep: 150 + +runson: win + +autosplit: true +retryOnFailure: true + +maxRetries: 3 +concurrency: 4 + +tunnel: true + +env: + # PAT: ${{ .secrets.testKey }} + CACHE_DIR: m2_cache_dir + LT_USERNAME: ${LT_USERNAME} + LT_ACCESS_KEY: ${LT_ACCESS_KEY} + +cacheKey: '{{ checksum "pom.xml" }}' +cacheDirectories: + - .m2 + +pre: + # Skip execution of the tests in the pre step + - mvn -Dmaven.repo.local=./.m2 dependency:resolve + +post: + - ls target/surefire-reports/ + +mergeArtifacts: true + + +uploadArtefacts: + - name: ExecutionSnapshots + path: + - target/surefire-reports/html/** + +report: true +partialReports: + location: target/surefire-reports/html + type: html + frameworkName: extent + +framework: + name: maven/testng + defaultReports: false + flags: + - "-Dsuite=parallel.xml" + +jobLabel: [selenium-testng, win, autosplit] \ No newline at end of file diff --git a/urls.json b/urls.json new file mode 100644 index 0000000..e94b918 --- /dev/null +++ b/urls.json @@ -0,0 +1,7 @@ +[ + { + "name": "lambdatest-home-page", + "url": "cvs.com/minuteclinic", + "waitForTimeout": 1000 + } +] diff --git a/visual_baseline.xml b/visual_baseline.xml new file mode 100644 index 0000000..01202e6 --- /dev/null +++ b/visual_baseline.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/visualchangebuild.xml b/visualchangebuild.xml new file mode 100644 index 0000000..924a92a --- /dev/null +++ b/visualchangebuild.xml @@ -0,0 +1,9 @@ + + + + + + + + +