diff --git a/.gitignore b/.gitignore index 0e87740..61017aa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ target/ .vscode browserstack.err .idea/ +logs/ +/bin/ +.classpath +.project +.settings diff --git a/README.md b/README.md index fc37d74..32ef19e 100644 --- a/README.md +++ b/README.md @@ -8,33 +8,25 @@ Make sure `maven` is installed in your system. See if it is properly installed. mvn --version ``` -## Steps to run test - -In every test file (JavaSample, JavaLocalSample, JavaParallelSample) make sure you set your credentials. -```java - public static final String AUTOMATE_USERNAME = "BROWSERSTACK_USERNAME"; - public static final String AUTOMATE_ACCESS_KEY = "BROWSERSTACK_ACCESS_KEY"; -``` +## Steps to run local test (using Java SDK) 1. Clone and navigate to the repo. + ``` + git clone -b sdk https://github.com/browserstack/java-selenium-browserstack.git + cd java-selenium-browserstack + ``` -``` - git clone https://github.com/browserstack/java-selenium-browserstack.git - cd java-selenium-browserstack -``` +2. Set your [BrowserStack Username and Access Key](https://www.browserstack.com/accounts/settings) in [browserstack.yml](browserstack.yml) -2. Change capabilities of test. - -```java - HashMap browserstackOptions = new HashMap(); - browserstackOptions.put("os", "OS X"); - browserstackOptions.put("osVersion", "Sierra"); - browserstackOptions.put("local", "false"); - browserstackOptions.put("seleniumVersion", "4.0.0"); - capabilities.setCapability("bstack:options", browserstackOptions); - capabilities.setCapability("sessionName", "BStack-[Java] Sample Test"); // test name - capabilities.setCapability("buildName", "BStack Build Number 1"); // CI/CD job or build name -``` +3. Add `browserstack-java-sdk` in your `pom.xml` as below. + ``` + + com.browserstack + browserstack-java-sdk + LATEST + compile + + ``` ## Build and run test using maven. @@ -47,15 +39,51 @@ mvn install a. To run single test session. ``` - mvn -Dexec.mainClass="com.browserstack.app.JavaSample" -Dexec.classpathScope=test test-compile exec:java +mvn exec:exec -Dexec.executable="java" -Dexec.classpathScope=test -Dexec.args="-cp %classpath -javaagent:/path/to/.m2/repository/browserstack-java-sdk/jar com.browserstack.app.JavaSample" +``` + +b. To run local test session. +- Ensure that you have set `browserstackLocal: true` in your `browserstack.yml` config. +``` +mvn exec:exec -Dexec.executable="java" -Dexec.classpathScope=test -Dexec.args="-cp %classpath -javaagent:/path/to/.m2/repository/browserstack-java-sdk/jar com.browserstack.app.JavaLocalSample" ``` -b. To run parallel test session. +### Arguments + +For the full list of arguments that can be passed in `browserStackLocalOptions`, refer [BrowserStack Local modifiers](https://www.browserstack.com/docs/local-testing/binary-params). For examples, refer below - + +#### Verbose Logging +To enable verbose logging - +```java +browserStackLocalOptions: + v: true + logFile: /browserstack/logs.txt ``` - mvn -Dexec.mainClass="com.browserstack.app.JavaParallelSample" -Dexec.classpathScope=test test-compile exec:java + +#### Force Start +To kill other running Browserstack Local instances - +```java +browserStackLocalOptions: + force: true ``` -c. To run local test session. +#### Only Automate +To disable local testing for Live and Screenshots, and enable only Automate - +```java +browserStackLocalOptions: + onlyAutomate: true ``` - mvn -Dexec.mainClass="com.browserstack.app.JavaLocalSample" -Dexec.classpathScope=test test-compile exec:java + +#### Force Local +To route all traffic via local(your) machine - +```java +browserStackLocalOptions: + forcelocal: true +``` + +#### Local Identifier +If doing simultaneous multiple local testing connections, set this uniquely for different processes - +```java +browserStackLocalOptions: + localIdentifier: randomstring ``` diff --git a/browserstack.yml b/browserstack.yml new file mode 100644 index 0000000..ca750c9 --- /dev/null +++ b/browserstack.yml @@ -0,0 +1,47 @@ +# ============================= +# 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 + +# ====================== +# Organizing your tests +# ====================== +# Use `projectName`, `buildName`, `name` capabilities to organise your tests +# `name` is the name of your test sessions and is automatically picked from your +# test name and doesn't need to be set manually when using BrowserStack SDK +# `buildName` is used to name your CI/CD job or the execution of your test suite. +# Ensure you add a dynamic identifier, like an incremental build number from your +# CI/CD or timestamp at the end of every build; otherwise tests from different +# executions will be grouped together on BrowserStack +buildName: browserstack-build-1 +# Use `projectName` to set the name of your project. Example, Marketing Website +projectName: BrowserStack Samples + +platforms: + - os: OS X + osVersion: Big Sur + browserName: Chrome + browserVersion: latest + - os: Windows + osVersion: 10 + browserName: Edge + browserVersion: latest + - device: Samsung Galaxy S22 Ultra + browserName: chrome # Try 'samsung' for Samsung browser + osVersion: 12.0 + +# ========================================== +# BrowserStack Local +# (For localhost, staging/private websites) +# ========================================== +# Set browserStackLocal to true if your website under test is not accessible publicly over the internet +# Learn more about how BrowserStack Local works here -> https://www.browserstack.com/docs/automate/selenium/local-testing-introduction +browserstackLocal: true # (Default false) +#browserStackLocalOptions: +# Options to be passed to BrowserStack local in-case of advanced configurations +# localIdentifier: browserStackSDK # (Default: null) Needed if you need to run multiple instances of local. +# forceLocal: true # (Default: false) Set to true if you need to resolve all your traffic via BrowserStack Local tunnel. +# Entire list of arguments available here -> https://www.browserstack.com/docs/automate/selenium/manage-incoming-connections diff --git a/pom.xml b/pom.xml index 8a87fca..2fe9c4a 100644 --- a/pom.xml +++ b/pom.xml @@ -16,97 +16,85 @@ UTF-8 1.8 1.8 + 1.0.8 - - junit - junit - 4.11 - test - - - commons-io - commons-io - 1.3.2 - org.seleniumhq.selenium selenium-java - 4.1.0 + 4.4.0 com.browserstack - browserstack-local-java - 1.0.3 - - - com.googlecode.json-simple - json-simple - 1.1.1 + browserstack-java-sdk + LATEST + compile - - - - - - - maven-clean-plugin - 3.1.0 - - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.8.0 - - - maven-surefire-plugin - 2.22.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - - maven-site-plugin - 3.7.1 - - - maven-project-info-reports-plugin - 3.0.0 - - - - + + + sample-test + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + test + java + + -classpath + + -javaagent:${settings.localRepository}/com/browserstack/browserstack-java-sdk/${browserstack.sdk.version}/browserstack-java-sdk-${browserstack.sdk.version}.jar + com.browserstack.app.JavaSample + + + + + + + - single + + sample-local-test - - - org.apache.maven.plugins - maven-surefire-plugin - - - com/browserstack/app/JavaSample.java - - - - + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + java + + + + + test + java + + -classpath + + -javaagent:${settings.localRepository}/com/browserstack/browserstack-java-sdk/${browserstack.sdk.version}/browserstack-java-sdk-${browserstack.sdk.version}.jar + com.browserstack.app.JavaLocalSample + + + + + diff --git a/src/test/java/com/browserstack/app/JavaLocalSample.java b/src/test/java/com/browserstack/app/JavaLocalSample.java index 369cb4e..87f005d 100644 --- a/src/test/java/com/browserstack/app/JavaLocalSample.java +++ b/src/test/java/com/browserstack/app/JavaLocalSample.java @@ -1,51 +1,31 @@ package com.browserstack.app; //Sample test in Java to run Automate session. - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.*; import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import java.net.URL; import java.time.Duration; import java.util.HashMap; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import com.browserstack.local.Local; - public class JavaLocalSample { public static final String AUTOMATE_USERNAME = System.getenv("BROWSERSTACK_USERNAME") != null ? System.getenv("BROWSERSTACK_USERNAME") : "BROWSERSTACK_USERNAME"; public static final String AUTOMATE_ACCESS_KEY = System.getenv("BROWSERSTACK_ACCESS_KEY") != null ? System.getenv("BROWSERSTACK_ACCESS_KEY") : "BROWSERSTACK_ACCESS_KEY"; public static final String URL = "https://" + AUTOMATE_USERNAME + ":" + AUTOMATE_ACCESS_KEY + "@hub-cloud.browserstack.com/wd/hub"; public static void main(String[] args) throws Exception { - DesiredCapabilities capabilities = new DesiredCapabilities(); + MutableCapabilities capabilities = new MutableCapabilities(); capabilities.setCapability("browserName", "Chrome"); capabilities.setCapability("browserVersion", "latest"); HashMap browserstackOptions = new HashMap(); browserstackOptions.put("os", "OS X"); browserstackOptions.put("osVersion", "Sierra"); - browserstackOptions.put("local", "true"); browserstackOptions.put("seleniumVersion", "4.0.0"); + browserstackOptions.put("sessionName", "BStack-[Java] Sample Test"); // test name + browserstackOptions.put("buildName", "BStack Local Build Number 1"); // CI/CD job or build name capabilities.setCapability("bstack:options", browserstackOptions); - capabilities.setCapability("sessionName", "BStack-[Java] Sample Test"); // test name - capabilities.setCapability("buildName", "BStack Local Build Number 1"); // CI/CD job or build name - -//Creates an instance of Local - Local bsLocal = new Local(); - -// You can also set an environment variable - "BROWSERSTACK_ACCESS_KEY". - HashMap bsLocalArgs = new HashMap(); - bsLocalArgs.put("key", AUTOMATE_ACCESS_KEY); - -// Starts the Local instance with the required arguments - bsLocal.start(bsLocalArgs); - -// Check if BrowserStack local instance is running - System.out.println(bsLocal.isRunning()); final WebDriver driver = new RemoteWebDriver(new URL(URL), capabilities); try { @@ -58,10 +38,8 @@ public static void main(String[] args) throws Exception { markTestStatus("passed", "Local Test is successful and up and running", driver); } } catch (Exception e) { - markTestStatus("failed", "Could'nt connect the local", driver); + markTestStatus("failed", "Couldn't connect the local", driver); } - //Stop the Local instance - bsLocal.stop(); driver.quit(); } diff --git a/src/test/java/com/browserstack/app/JavaParallelSample.java b/src/test/java/com/browserstack/app/JavaParallelSample.java deleted file mode 100644 index 24e222b..0000000 --- a/src/test/java/com/browserstack/app/JavaParallelSample.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.browserstack.app; - -import java.util.*; -import java.net.MalformedURLException; -import java.net.URL; -import java.time.Duration; -import java.util.Hashtable; - -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.DesiredCapabilities; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; - -class ParallelTest implements Runnable { - public static final String USERNAME = System.getenv("BROWSERSTACK_USERNAME") != null ? System.getenv("BROWSERSTACK_USERNAME") : "BROWSERSTACK_USERNAME"; - public static final String AUTOMATE_KEY = System.getenv("BROWSERSTACK_ACCESS_KEY") != null ? System.getenv("BROWSERSTACK_ACCESS_KEY") : "BROWSERSTACK_ACCESS_KEY"; - public static final String URL = "https://" + USERNAME + ":" + AUTOMATE_KEY + "@hub-cloud.browserstack.com/wd/hub"; - Hashtable capsHashtable; - String sessionName; - - ParallelTest(Hashtable cap, String sessionString) { - capsHashtable = cap; - sessionName = sessionString; - } - - public void run() { - DesiredCapabilities caps = new DesiredCapabilities(); - caps.setCapability("bstack:options", capsHashtable); - caps.setCapability("sessionName", sessionName); // test name - caps.setCapability("buildName", "BStack-[Java] Sample buildName"); // CI/CD job or build name - WebDriver driver; - try { - driver = new RemoteWebDriver(new URL(URL), caps); - final JavascriptExecutor jse = (JavascriptExecutor) driver; - try { - // Searching for 'BrowserStack' on google.com - driver.get("https://bstackdemo.com/"); - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - wait.until(ExpectedConditions.titleIs("StackDemo")); - // Getting name of the product - String product_name = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\'1\']/p"))).getText(); - //checking whether the Add to Cart button is clickable - WebElement cart_btn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\'1\']/div[4]"))); - // clicking the 'Add to cart' button - cart_btn.click(); - // checking if the Cart pane is visible - wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("float-cart__content"))); - // getting the product's name added in the cart - final String product_in_cart = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\'__next\']/div/div/div[2]/div[2]/div[2]/div/div[3]/p[1]"))).getText(); - // checking if the product added to cart is available in the cart - if (product_name.equals(product_in_cart)) { - jse.executeScript("browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\": \"passed\", \"reason\": \"Product has been added to the cart!\"}}"); - } - } catch (Exception e) { - jse.executeScript("browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\": \"failed\", \"reason\": \"Some elements failed to load..\"}}"); - } - driver.quit(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } -} - -public class JavaParallelSample { - public static void main(String[] args) throws Exception { - List> caps = new ArrayList>(); - - //device 1 - Hashtable cap1 = new Hashtable(); - cap1.put("deviceName", "iPhone 12 Pro"); - cap1.put("realMobile", "true"); - caps.add(cap1); - - //device 2 - Hashtable cap2 = new Hashtable(); - cap2.put("deviceName", "Samsung Galaxy S20"); - cap2.put("realMobile", "true"); - caps.add(cap2); - - //device 3 - Hashtable cap3 = new Hashtable(); - cap3.put("os", "OS X"); - caps.add(cap3); - - //device 4 - Hashtable cap4 = new Hashtable(); - cap4.put("os", "windows"); - caps.add(cap4); - - for (Hashtable cap : caps) { - Thread thread = new Thread(new ParallelTest(cap, "session name")); - thread.start(); - } - } -} diff --git a/src/test/java/com/browserstack/app/JavaSample.java b/src/test/java/com/browserstack/app/JavaSample.java index d4edaf9..b97cfd6 100644 --- a/src/test/java/com/browserstack/app/JavaSample.java +++ b/src/test/java/com/browserstack/app/JavaSample.java @@ -2,27 +2,21 @@ //Sample test in Java to run Automate session. -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.*; import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import java.net.URL; -import java.time.Duration; import java.util.HashMap; - -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; +import java.time.Duration; public class JavaSample { public static final String AUTOMATE_USERNAME = System.getenv("BROWSERSTACK_USERNAME") != null ? System.getenv("BROWSERSTACK_USERNAME") : "BROWSERSTACK_USERNAME"; public static final String AUTOMATE_ACCESS_KEY = System.getenv("BROWSERSTACK_ACCESS_KEY") != null ? System.getenv("BROWSERSTACK_ACCESS_KEY") : "BROWSERSTACK_ACCESS_KEY"; public static final String URL = "https://" + AUTOMATE_USERNAME + ":" + AUTOMATE_ACCESS_KEY + "@hub-cloud.browserstack.com/wd/hub"; - public static void main(String[] args) throws Exception { - DesiredCapabilities capabilities = new DesiredCapabilities(); + MutableCapabilities capabilities = new MutableCapabilities(); capabilities.setCapability("browserName", "Chrome"); capabilities.setCapability("browserVersion", "latest"); HashMap browserstackOptions = new HashMap(); @@ -30,9 +24,9 @@ public static void main(String[] args) throws Exception { browserstackOptions.put("osVersion", "Sierra"); browserstackOptions.put("local", "false"); browserstackOptions.put("seleniumVersion", "4.0.0"); + browserstackOptions.put("sessionName", "BStack-[Java] Sample Test"); // test name + browserstackOptions.put("buildName", "BStack Local Build Number 1"); // CI/CD job or build name capabilities.setCapability("bstack:options", browserstackOptions); - capabilities.setCapability("sessionName", "BStack-[Java] Sample Test"); // test name - capabilities.setCapability("buildName", "BStack Build Number 1"); // CI/CD job or build name final WebDriver driver = new RemoteWebDriver(new URL(URL), capabilities); try { driver.get("https://bstackdemo.com/");