diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc3475d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +log diff --git a/README.md b/README.md index 9103ada..f440653 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,53 @@ # browserstack-selenium-load-testing-sample -Sample repository for Selenium load-testing test + +![BrowserStack Logo](https://d98b8t1nnulk5.cloudfront.net/production/images/layout/logo-header.png?1469004780) + +## Getting Started + +### Run Sample Build + +1. **Clone the repository** + + ```sh + git clone https://github.com/browserstack/browserstack-playwright-load-testing-sample.git + cd testng-browserstack + ``` + +2. **Install Maven dependencies** + + ```sh + mvn compile + ``` + +3. **Install BrowserStack CLI** + + Download the appropriate BrowserStack CLI binary based on your operating system: + + - **macOS x86** + [browserstack-cli-macOS-x86](https://load-api.browserstack.com/api/v1/binary?os=macos&arch=x64) + + - **macOS ARM** + [browserstack-cli-macOS-arm](https://load-api.browserstack.com/api/v1/binary?os=macos&arch=arm64) + + - **Windows x86** + [browserstack-cli-windows](https://load-api.browserstack.com/api/v1/binary?os=win&arch=x64) + + - **Linux x86** + [browserstack-cli-linux-x86](https://load-api.browserstack.com/api/v1/binary?os=linux&arch=arm64) + + - **Linux ARM** + [browserstack-cli-linux-arm](https://load-api.browserstack.com/api/v1/binary?os=linux&arch=x64) + + > Place the downloaded `browserstack-cli` binary in the root of your project. + +4. **Run tests using BrowserStack CLI** + + ```sh + ./browserstack-cli load run + ``` + +5. **View Test Results** + + Visit the [BrowserStack Load-Testing Dashboard](https://load.browserstack.com/projects) to monitor and analyze your test runs. + +--- \ No newline at end of file diff --git a/browserstack-load.yml b/browserstack-load.yml new file mode 100644 index 0000000..88ee9e9 --- /dev/null +++ b/browserstack-load.yml @@ -0,0 +1,45 @@ +# ============================= +# Set BrowserStack Credentials +# ============================= +# Add your BrowserStack userName and accessKey here or set BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY as env variables. +userName: BROWSERSTACK_USERNAME +accessKey: BROWSERSTACK_ACCESS_KEY + +# ====================== +# BrowserStack Reporting +# ====================== +# The following parameters are used to set up reporting on BrowserStack Load Testing: +# Set 'projectName' to the name of your project. Example: 'Product ABC'. Tests under the same projectName will be grouped together. +projectName: Default Project + +# Set 'testName' to the name of your test. Example: 'First Load Test'. Test runs with the same testName will be grouped together. +testName: Default Test + +# ====================== +# Set Load Configuration +# ====================== +# The following parameters are used to set load configuration for your test: +# Set 'testType' to the type of load test that you want to execute. Example:'Playwright', 'Selenium'. This is a required parameter. +testType: Selenium + +# Set 'vus' to the maximum number of virtual users to simulate during the test. +vus: 1 + +# Set multiple regions from which you would want to generate the load (percent should total 100 across all loadzones). +regions: + - loadzone: us-east-1 + percent: 100 + +# Set language to the programming language used in your project. Example: 'java', 'nodejs'. +language: java + +# Set framework to the test framework used in your Selenium project. Example: 'testng'. +# framework: testng + +# Add list of file paths under 'dependencies' to help set up the test environment by installing required packages. Example: path to 'pom.xml' for Java projects using Maven, path to 'package.json' for Node.js projects. +# Add list of file paths under 'testConfigs' to define which configuration files should be used to run tests. Example: path to 'playwright.config.ts' for Playwright (Node.js), path to 'testng.xml' for Selenium (TestNG). +files: + dependencies: + - ./pom.xml + testConfigs: + - ./src/test/resources/testng.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2bfd6a0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + com.example + selenium-testng-example + 1.0-SNAPSHOT + jar + + + 11 + 11 + UTF-8 + 4.15.0 + 7.8.0 + + + + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + + + org.testng + testng + ${testng.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + + src/test/resources/testng.xml + + + + + + diff --git a/src/test/java/com/example/SimpleTest.java b/src/test/java/com/example/SimpleTest.java new file mode 100644 index 0000000..3718721 --- /dev/null +++ b/src/test/java/com/example/SimpleTest.java @@ -0,0 +1,141 @@ +package com.example; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.net.URL; +import java.time.Duration; + +public class SimpleTest { + + private WebDriver driver; + private static final String HUB_URL = "http://localhost:4444/wd/hub"; + + @BeforeMethod + public void setUp() throws Exception { + try { + System.out.println("Setting up Chrome options..."); + + // Try a simpler approach first - just basic capabilities + DesiredCapabilities caps = new DesiredCapabilities(); + caps.setBrowserName("chrome"); + + // Add Chrome options as a map + ChromeOptions chromeOptions = new ChromeOptions(); + // Use timestamp for unique user data directory + String uniqueUserDataDir = "/tmp/chrome-user-data-" + System.currentTimeMillis(); + chromeOptions.addArguments( + "--headless", + "--no-first-run", + "--no-default-browser-check", + "--disable-extensions", + "--disable-default-apps", + "--disable-gpu", + "--disable-dev-shm-usage", + "--disable-software-rasterizer", + "--no-sandbox", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows", + "--disable-renderer-backgrounding", + "--disable-features=TranslateUI", + "--disable-ipc-flooding-protection", + "--disable-web-security", + "--disable-features=VizDisplayCompositor", + "--disable-logging", + "--silent" + ); + + System.out.println("Chrome options configured. User data dir: " + uniqueUserDataDir); + + // Merge the chrome options with capabilities + + System.out.println("Connecting to Selenium Grid at: " + HUB_URL); + driver = new RemoteWebDriver(new URL(HUB_URL), chromeOptions); + + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); + driver.manage().window().maximize(); + + System.out.println("Successfully connected to Selenium Grid!"); + + } catch (Exception e) { + System.err.println("Error during setup: " + e.getMessage()); + e.printStackTrace(); + throw e; + } + } + + @Test + public void testAddToCartBStackDemo() { + // Visit BStackDemo + driver.get("https://bstackdemo.com/"); + + // Get name of product to add to cart (first product) + WebElement productNameElem = driver.findElement(By.cssSelector("#\\33 > p")); + String productToAdd = productNameElem.getText(); + + // Click on add to cart + WebElement addToCartBtn = driver.findElement(By.cssSelector("#\\33 > .shelf-item__buy-btn")); + addToCartBtn.click(); + + // Get name of item in cart + WebElement productInCartElem = driver.findElement(By.cssSelector("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title")); + String productInCart = productInCartElem.getText(); + + // Check if product in cart is same as one added + Assert.assertEquals(productInCart, productToAdd); + System.out.println("Test passed: Add to cart works!"); + } + + @Test + public void testCheckoutFlowBStackDemo() { + // Visit BStackDemo + driver.get("https://bstackdemo.com/"); + + // Sign in + driver.findElement(By.id("signin")).click(); + driver.findElement(By.cssSelector("#username svg")).click(); + driver.findElement(By.id("react-select-2-option-0-0")).click(); + driver.findElement(By.cssSelector("#password svg")).click(); + driver.findElement(By.id("react-select-3-option-0-0")).click(); + driver.findElement(By.id("login-btn")).click(); + + // Wait for login + try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } + + // Click on buy item + driver.findElement(By.cssSelector("#\\31 > .shelf-item__buy-btn")).click(); + driver.findElement(By.cssSelector("div.float-cart__close-btn")).click(); + driver.findElement(By.cssSelector("#\\32 > .shelf-item__buy-btn")).click(); + driver.findElement(By.cssSelector(".buy-btn")).click(); + + // Add address details + driver.findElement(By.id("firstNameInput")).sendKeys("first"); + driver.findElement(By.id("lastNameInput")).sendKeys("last"); + driver.findElement(By.id("addressLine1Input")).sendKeys("address"); + driver.findElement(By.id("provinceInput")).sendKeys("province"); + driver.findElement(By.id("postCodeInput")).sendKeys("pincode"); + + // Checkout + driver.findElement(By.id("checkout-shipping-continue")).click(); + driver.findElement(By.xpath("//*[text()='Continue']")).click(); + driver.findElement(By.xpath("//*[text()='Orders']")).click(); + + System.out.println("Test passed: Checkout flow works!"); + } + + @AfterMethod + public void tearDown() { + if (driver != null) { + driver.quit(); + System.out.println("Browser closed"); + } + } +} diff --git a/src/test/resources/testng.xml b/src/test/resources/testng.xml new file mode 100644 index 0000000..c70b42e --- /dev/null +++ b/src/test/resources/testng.xml @@ -0,0 +1,9 @@ + + + + + + + + +