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
+
+
+
+## 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 @@
+
+
+
+
+
+
+
+
+