diff --git a/.gitignore b/.gitignore index 6432d35..871cd6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ -*.class -*.jar -*.war -*.ear +*.png +target/ local.log -target +.idea +*.iml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..e61a73a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: java + +jdk: + - oraclejdk8 + - oraclejdk7 + - openjdk6 + +before_install: + - true && `base64 --decode <<< ZXhwb3J0IEJST1dTRVJTVEFDS19BQ0NFU1NfS0VZPUh5VmZydXJvb3dYb041eGhLZEs2Cg==` + +after_failure: cat /home/travis/build/browserstack/browserstack-local-java/target/surefire-reports/* + +scripts: + - mvn test -P single && mvn test -P local && mvn test -P parallel diff --git a/README.md b/README.md index 37abd46..f047b4b 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,26 @@ -# JBehave-Browserstack +# jbehave-browserstack -Execute [JBehave](https://github.com/jbehave/jbehave-core) scripts on BrowserStack. +[JBehave](https://github.com/jbehave/jbehave-core) Integration with BrowserStack. -## Usage +## Setting up a sample test -### Prerequisites +- Clone the repo +- Install dependencies `mvn install` +- Update `*.conf.json` files inside the `src/test/resources/conf` directory with your BrowserStack Username and Access Key. (These can be found in the [settings](https://www.browserstack.com/accounts/settings) section on BrowserStack accounts page) -Java and Maven +## Running the sample test -### Clone the repo +- To run single test, run `mvn test -P single` +- To run parallel tests, run `mvn test -P parallel` +- To run local tests, run `mvn test -P local` -`git clone https://github.com/browserstack/jbehave-browserstack.git` +## Integrating with your existing test suite -### BrowserStack Authentication +- Update `pom.xml` in your project. +- Copy `src/test/java/com/browserstack/BrowserStackJBehaveRunner.java` and `src/test/resources/conf/*` to your project. +- Adjust your configuration files as per `src/test/resources/conf/*.conf.json`. Here is the full list of [BrowserStack configuration capabilities](https://www.browserstack.com/automate/capabilities) -Export the environment variables for the username and access key of your BrowserStack account. -These can be found on the automate accounts page on [BrowserStack](https://www.browserstack.com/accounts/automate) +## Notes -`export BROWSERSTACK_USERNAME=` - -`export BROWSERSTACK_ACCESS_KEY=` - -### Run the tests - - - To start a single test, run: `mvn clean install` - - To start parallel tests, run: `TEST_TYPE=parallel mvn clean install` - - To start local tests, run: `TEST_TYPE=local mvn clean install` - - To start local tests in parallel, run: `TEST_TYPE=local,parallel mvn clean install` - ------- - -#### How to specify the capabilities - -The [Code Generator](https://www.browserstack.com/automate/node#setting-os-and-browser) can come in very handy when specifying the capabilities especially for mobile devices. +- In order to test on different set of browsers, check out our [code generator](https://www.browserstack.com/automate/python#setting-os-and-browser) +- You can export the environment variables for the Username and Access Key of your BrowserStack account using `export BROWSERSTACK_USERNAME= && export BROWSERSTACK_ACCESS_KEY=` diff --git a/pom.xml b/pom.xml index f2c3e33..ceacb22 100644 --- a/pom.xml +++ b/pom.xml @@ -1,51 +1,122 @@ - 4.0.0 - com.browserstack - jbehave-browserstack - 0.1.0 - - - junit - junit - 4.11 - - - org.seleniumhq.selenium - selenium-java - 2.35.0 - - - com.browserstack - browserstack-local-java - 0.1.0 - - - org.jbehave - jbehave-core - 3.8 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.5 - - StoryRunner.java - methods - - - - + 4.0.0 + com.browserstack + jbehave-browserstack + 0.1.0 + + + junit + junit + 4.11 + + + org.seleniumhq.selenium + selenium-java + 2.35.0 + + + com.browserstack + browserstack-local-java + 0.1.0 + + + org.jbehave + jbehave-core + 3.8 + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.5 + + true + + + + + + + + single + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.5 + + com/browserstack/BrowserStackJBehaveRunner.java + + single.conf.json + com.browserstack.single.SingleEmbedder + stories/single.story + + + + + + + + + local + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.5 + + com/browserstack/BrowserStackJBehaveRunner.java + + local.conf.json + com.browserstack.single.LocalEmbedder + stories/local.story + + + + + + + + + parallel + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.5 + + com/browserstack/BrowserStackJBehaveRunner.java + methods + + parallel.conf.json + com.browserstack.single.SingleEmbedder + stories/single.story + + + + + + + diff --git a/src/test/java/com/browserstack/BrowserStackJBehaveRunner.java b/src/test/java/com/browserstack/BrowserStackJBehaveRunner.java new file mode 100644 index 0000000..622ee98 --- /dev/null +++ b/src/test/java/com/browserstack/BrowserStackJBehaveRunner.java @@ -0,0 +1,119 @@ +package com.browserstack; +import com.browserstack.local.Local; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Iterator; +import java.util.Collection; +import java.lang.reflect.Constructor; +import org.json.simple.JSONObject; +import org.json.simple.JSONArray; +import org.json.simple.parser.JSONParser; + +import org.jbehave.core.embedder.Embedder; +import org.junit.Test; +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.junit.runners.Parameterized.Parameter; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.DesiredCapabilities; + + +@RunWith(Parameterized.class) +public class BrowserStackJBehaveRunner { + + public WebDriver driver; + private Local l; + + private static JSONObject config; + + @Parameter(value = 0) + public int taskID; + + @Parameters + public static Collection data() throws Exception { + List taskIDs = new ArrayList(); + if(System.getProperty("config") != null) { + JSONParser parser = new JSONParser(); + config = (JSONObject) parser.parse(new FileReader("src/test/resources/conf/" + System.getProperty("config"))); + int envs = ((JSONArray)config.get("environments")).size(); + + for(int i=0; i envCapabilities = (Map) envs.get(taskID); + Iterator it = envCapabilities.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + capabilities.setCapability(pair.getKey().toString(), pair.getValue().toString()); + } + + Map commonCapabilities = (Map) config.get("capabilities"); + it = commonCapabilities.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + if(capabilities.getCapability(pair.getKey().toString()) == null){ + capabilities.setCapability(pair.getKey().toString(), pair.getValue().toString()); + } + } + + String username = System.getenv("BROWSERSTACK_USERNAME"); + if(username == null) { + username = (String) config.get("user"); + } + + String accessKey = System.getenv("BROWSERSTACK_ACCESS_KEY"); + if(accessKey == null) { + accessKey = (String) config.get("key"); + } + + if(capabilities.getCapability("browserstack.local") != null && capabilities.getCapability("browserstack.local") == "true"){ + l = new Local(); + Map options = new HashMap(); + options.put("key", accessKey); + l.start(options); + } + + driver = new RemoteWebDriver(new URL("http://"+username+":"+accessKey+"@"+config.get("server")+"/wd/hub"), capabilities); + } + + @After + public void tearDown() throws Exception { + driver.quit(); + if(l != null) l.stop(); + } + + @Test + public void runStories() throws Exception { + Class c = Class.forName(System.getProperty("embedder")); + Constructor cons = c.getConstructor(WebDriver.class); + Embedder storyEmbedder = (Embedder) cons.newInstance(driver); + + List storyPaths = Arrays.asList(System.getProperty("stories")); + storyEmbedder.runStoriesAsPaths(storyPaths); + } +} diff --git a/src/test/java/com/browserstack/local/LocalEmbedder.java b/src/test/java/com/browserstack/local/LocalEmbedder.java new file mode 100644 index 0000000..ef8e921 --- /dev/null +++ b/src/test/java/com/browserstack/local/LocalEmbedder.java @@ -0,0 +1,58 @@ +package com.browserstack.single; + +import java.text.SimpleDateFormat; + +import org.jbehave.core.configuration.Configuration; +import org.jbehave.core.configuration.MostUsefulConfiguration; +import org.jbehave.core.embedder.Embedder; +import org.jbehave.core.embedder.EmbedderControls; +import org.jbehave.core.io.CodeLocations; +import org.jbehave.core.io.LoadFromClasspath; +import org.jbehave.core.parsers.RegexPrefixCapturingPatternParser; +import org.jbehave.core.reporters.CrossReference; +import org.jbehave.core.reporters.StoryReporterBuilder; +import org.jbehave.core.steps.ParameterControls; +import org.jbehave.core.steps.SilentStepMonitor; +import org.jbehave.core.steps.ParameterConverters; +import org.jbehave.core.steps.InstanceStepsFactory; +import org.jbehave.core.steps.InjectableStepsFactory; +import org.jbehave.core.steps.ParameterConverters.DateConverter; +import org.openqa.selenium.WebDriver; + +import com.browserstack.single.steps.LocalSteps; + +public class LocalEmbedder extends Embedder { + private WebDriver driver; + + public LocalEmbedder(WebDriver driver) { + this.driver = driver; + } + + @Override + public EmbedderControls embedderControls() { + return new EmbedderControls().doIgnoreFailureInStories(true).doIgnoreFailureInView(true); + } + + @Override + public Configuration configuration() { + Class embedderClass = this.getClass(); + return new MostUsefulConfiguration() + .useStoryLoader(new LoadFromClasspath(embedderClass.getClassLoader())) + .useStoryReporterBuilder(new StoryReporterBuilder() + .withCodeLocation(CodeLocations.codeLocationFromClass(embedderClass)) + .withDefaultFormats() + .withCrossReference(new CrossReference())) + .useParameterConverters(new ParameterConverters() + .addConverters(new DateConverter(new SimpleDateFormat("yyyy-MM-dd")))) + .useParameterControls(new ParameterControls().useNameDelimiterLeft("<").useNameDelimiterRight(">")) + .useStepPatternParser(new RegexPrefixCapturingPatternParser( + "$")) + .useStepMonitor(new SilentStepMonitor()); + } + + @Override + public InjectableStepsFactory stepsFactory() { + return new InstanceStepsFactory(configuration(), new LocalSteps(driver)); + } + +} diff --git a/src/test/java/com/browserstack/local/pages/LocalPage.java b/src/test/java/com/browserstack/local/pages/LocalPage.java new file mode 100644 index 0000000..340cd55 --- /dev/null +++ b/src/test/java/com/browserstack/local/pages/LocalPage.java @@ -0,0 +1,23 @@ +package com.browserstack.single.pages; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class LocalPage { + private String DEFAULT_LOCAL_URL = "http://bs-local.com:45691/check"; + private WebDriver driver; + private WebElement element; + + public LocalPage(WebDriver driver) { + this.driver = driver; + } + + public String getPageSource(){ + return driver.getPageSource(); + } + + public void openHealthCheck() { + driver.get(DEFAULT_LOCAL_URL); + } +} diff --git a/src/test/java/com/browserstack/local/steps/LocalSteps.java b/src/test/java/com/browserstack/local/steps/LocalSteps.java new file mode 100644 index 0000000..bad7526 --- /dev/null +++ b/src/test/java/com/browserstack/local/steps/LocalSteps.java @@ -0,0 +1,29 @@ +package com.browserstack.single.steps; + +import org.jbehave.core.annotations.Given; +import org.jbehave.core.annotations.Then; +import org.jbehave.core.annotations.When; +import org.junit.Assert; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.browserstack.single.pages.LocalPage; + +public class LocalSteps { + private LocalPage page; + + public LocalSteps(WebDriver driver) { + page = new LocalPage(driver); + } + + @When("I open health check") + public void openHealthCheck() { + page.openHealthCheck(); + } + + @Then("I should see \"$keyword\"") + public void pageShouldContain(String keyword) { + Assert.assertTrue(page.getPageSource().contains(keyword)); + } +} diff --git a/src/test/java/com/browserstack/pages/BasePage.java b/src/test/java/com/browserstack/pages/BasePage.java deleted file mode 100644 index 579cb11..0000000 --- a/src/test/java/com/browserstack/pages/BasePage.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.browserstack.pages; - -import org.openqa.selenium.WebDriver; - -public class BasePage { - - private WebDriver driver; - - public BasePage(WebDriver driver) { - this.driver = driver; - } - - public String getTitle() { - return driver.getTitle(); - } - -} diff --git a/src/test/java/com/browserstack/pages/GooglePage.java b/src/test/java/com/browserstack/pages/GooglePage.java deleted file mode 100644 index 8feea3b..0000000 --- a/src/test/java/com/browserstack/pages/GooglePage.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.browserstack.pages; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.support.ui.ExpectedConditions; - -import com.browserstack.utils.WebdriverUtils; - -public class GooglePage extends BasePage { - private String DEFAULT_GOOGLE_URL = "https://google.com"; - private WebDriverWait wait; - - private WebDriver driver; - - public GooglePage(WebDriver driver) { - super(driver); - this.driver = driver; - wait = new WebDriverWait(driver, 10); - } - - public void searchOnGoogle(String keyword) { - By locator = By.name("q"); - WebdriverUtils.openPage(driver, DEFAULT_GOOGLE_URL); - WebElement searchBoxElement = WebdriverUtils.getVisibleElement(driver, locator); - searchBoxElement.sendKeys(keyword); - clickSearch(); - } - - public void clickSearch() { - By locator = By.name("btnG"); - WebElement searchButton = WebdriverUtils.getVisibleElement(driver, locator); - searchButton.click(); - locator = By.id("top_nav"); - WebElement navBar = WebdriverUtils.getVisibleElement(driver, locator); - wait.until(ExpectedConditions.visibilityOf(navBar)); - } - - public String getSelectedCountry(){ - By locator = By.cssSelector(".lan_country_selector a"); - WebElement country = WebdriverUtils.getVisibleElement(driver, locator); - return country.getText().trim(); - } -} diff --git a/src/test/java/com/browserstack/runner/StoryRunner.java b/src/test/java/com/browserstack/runner/StoryRunner.java deleted file mode 100644 index 4415d16..0000000 --- a/src/test/java/com/browserstack/runner/StoryRunner.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.browserstack.runner; - -import java.net.URL; -import java.net.MalformedURLException; -import java.util.List; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Collection; - -import org.jbehave.core.embedder.Embedder; -import org.junit.Test; -import org.junit.After; -import org.junit.Before; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.remote.RemoteWebDriver; -import org.openqa.selenium.remote.DesiredCapabilities; - -import com.browserstack.local.Local; - -@RunWith(Parameterized.class) -public class StoryRunner { - - public WebDriver driver; - public String os; - public String osVersion; - public String browser; - public String browserVersion; - - private static Local bsLocal; - private static String TEST_TYPE = System.getenv("TEST_TYPE"); - private static String BS_USER = System.getenv("BROWSERSTACK_USERNAME"); - private static String BS_AUTH_KEY = System.getenv("BROWSERSTACK_ACCESS_KEY"); - - public StoryRunner(String os, String osVersion, String browser, - String browserVersion) { - this.os = os; - this.osVersion = osVersion; - this.browser = browser; - this.browserVersion = browserVersion; - } - - @BeforeClass - public static void setupLocalBeforeClass() throws Exception { - if(TEST_TYPE != null && TEST_TYPE.toLowerCase().indexOf("local") > -1) { - bsLocal = new Local(); - HashMap bsLocalArgs = new HashMap(); - bsLocalArgs.put("key", BS_AUTH_KEY); - bsLocalArgs.put("forcelocal", ""); - bsLocal.start(bsLocalArgs); - } - } - @AfterClass - public static void stopLocalAfterClass() throws Exception { - if(bsLocal != null) { - bsLocal.stop(); - } - } - - @Before - public void setUp() throws Exception { - String url = "http://"+BS_USER+":"+BS_AUTH_KEY+"@hub.browserstack.com/wd/hub/"; - DesiredCapabilities dc = new DesiredCapabilities(); - dc.setCapability("os", os); - dc.setCapability("os_version", osVersion); - dc.setCapability("browser", browser); - dc.setCapability("browser_version", browserVersion); - dc.setCapability("browserstack.debug", "true"); - dc.setCapability("build", "Sample JBehave Tests"); - dc.setCapability("name", "Sample " + ( TEST_TYPE != null ? TEST_TYPE : "" ) + " JBehave Tests"); - if(TEST_TYPE != null && TEST_TYPE.toLowerCase().indexOf("local") > -1) { - dc.setCapability("browserstack.local", "true"); - } - try { - System.out.println("Creating driver using key: "+BS_AUTH_KEY); - driver = new RemoteWebDriver(new URL(url), dc); - } catch (MalformedURLException e) { - System.err.println("Exception in url: " + e.getMessage()); - } - } - - @After - public void tearDown() throws Exception { - driver.quit(); - } - - @Parameters - public static Collection data() { - Object[][] data; - if(System.getenv("TEST_TYPE") != null && - System.getenv("TEST_TYPE").toLowerCase().indexOf("parallel") > -1) { - data = new Object[][] { - { "OS X", "El Capitan", "firefox", "46" }, - { "Windows", "10", "chrome", "49" } }; - } else { - data = new Object[][] { - { "OS X", "El Capitan", "firefox", "46" } }; - } - return Arrays.asList(data); - } - - @Test - public void runStories() throws Exception { - Embedder storyEmbedder = new StoryEmbedder(driver); - List storyPaths = Arrays.asList("features/search/google.feature"); - storyEmbedder.runStoriesAsPaths(storyPaths); - } - -} diff --git a/src/test/java/com/browserstack/runner/StoryEmbedder.java b/src/test/java/com/browserstack/single/SingleEmbedder.java similarity index 88% rename from src/test/java/com/browserstack/runner/StoryEmbedder.java rename to src/test/java/com/browserstack/single/SingleEmbedder.java index 6a4d54b..c11d59e 100644 --- a/src/test/java/com/browserstack/runner/StoryEmbedder.java +++ b/src/test/java/com/browserstack/single/SingleEmbedder.java @@ -1,4 +1,4 @@ -package com.browserstack.runner; +package com.browserstack.single; import java.text.SimpleDateFormat; @@ -19,13 +19,12 @@ import org.jbehave.core.steps.ParameterConverters.DateConverter; import org.openqa.selenium.WebDriver; -import com.browserstack.steps.GoogleSearchSteps; - -public class StoryEmbedder extends Embedder{ +import com.browserstack.single.steps.GoogleSteps; +public class SingleEmbedder extends Embedder { private WebDriver driver; - public StoryEmbedder(WebDriver driver) { + public SingleEmbedder(WebDriver driver) { this.driver = driver; } @@ -36,7 +35,7 @@ public EmbedderControls embedderControls() { @Override public Configuration configuration() { - Class embedderClass = this.getClass(); + Class embedderClass = this.getClass(); return new MostUsefulConfiguration() .useStoryLoader(new LoadFromClasspath(embedderClass.getClassLoader())) .useStoryReporterBuilder(new StoryReporterBuilder() @@ -53,7 +52,7 @@ public Configuration configuration() { @Override public InjectableStepsFactory stepsFactory() { - return new InstanceStepsFactory(configuration(), new GoogleSearchSteps(driver)); + return new InstanceStepsFactory(configuration(), new GoogleSteps(driver)); } } diff --git a/src/test/java/com/browserstack/single/pages/GooglePage.java b/src/test/java/com/browserstack/single/pages/GooglePage.java new file mode 100644 index 0000000..476083e --- /dev/null +++ b/src/test/java/com/browserstack/single/pages/GooglePage.java @@ -0,0 +1,30 @@ +package com.browserstack.single.pages; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class GooglePage { + private String DEFAULT_GOOGLE_URL = "https://www.google.com/ncr"; + private WebDriver driver; + private WebElement element; + + public GooglePage(WebDriver driver) { + this.driver = driver; + } + + public String getTitle(){ + return driver.getTitle(); + } + + public void searchOnGoogle(String keyword) { + driver.get(DEFAULT_GOOGLE_URL); + element = driver.findElement(By.name("q")); + element.sendKeys(keyword); + } + + public void submitSearch() throws Exception { + element.submit(); + Thread.sleep(5000); + } +} diff --git a/src/test/java/com/browserstack/single/steps/GoogleSteps.java b/src/test/java/com/browserstack/single/steps/GoogleSteps.java new file mode 100644 index 0000000..375b6a2 --- /dev/null +++ b/src/test/java/com/browserstack/single/steps/GoogleSteps.java @@ -0,0 +1,34 @@ +package com.browserstack.single.steps; + +import org.jbehave.core.annotations.Given; +import org.jbehave.core.annotations.Then; +import org.jbehave.core.annotations.When; +import org.junit.Assert; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.browserstack.single.pages.GooglePage; + +public class GoogleSteps { + private GooglePage page; + + public GoogleSteps(WebDriver driver) { + page = new GooglePage(driver); + } + + @When("I type query as \"$keyword\"") + public void searchGoogle(String keyword) { + page.searchOnGoogle(keyword); + } + + @Then("I submit") + public void submit() throws Exception { + page.submitSearch(); + } + + @Then("I should see title \"$keyword\"") + public void titleShouldContain(String keyword) { + Assert.assertEquals(keyword, page.getTitle()); + } +} diff --git a/src/test/java/com/browserstack/steps/GoogleSearchSteps.java b/src/test/java/com/browserstack/steps/GoogleSearchSteps.java deleted file mode 100644 index 422aaa6..0000000 --- a/src/test/java/com/browserstack/steps/GoogleSearchSteps.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.browserstack.steps; - -import org.jbehave.core.annotations.Given; -import org.jbehave.core.annotations.Then; -import org.jbehave.core.annotations.When; -import org.junit.Assert; -import org.openqa.selenium.WebDriver; - -import com.browserstack.pages.GooglePage; - -public class GoogleSearchSteps { - private static int SHORT_WAIT = 30; - - private GooglePage googlePage; - - public GoogleSearchSteps(WebDriver driver) { - googlePage = new GooglePage(driver); - } - - @When("I search Google for $keyword") - public void searchGoogle(String keyword) { - googlePage.searchOnGoogle(keyword); - } - - @Then("the title should contain $keyword") - public void titleShouldContain(String keyword) { - String actual = googlePage.getTitle(); - if (actual.toLowerCase().indexOf(keyword.toLowerCase()) < 0) { - Assert.fail("Actual: " + actual + " Expected: " + keyword); - } - } - -} diff --git a/src/test/java/com/browserstack/utils/WebdriverUtils.java b/src/test/java/com/browserstack/utils/WebdriverUtils.java deleted file mode 100644 index 4795d15..0000000 --- a/src/test/java/com/browserstack/utils/WebdriverUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.browserstack.utils; - -import java.io.File; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.OutputType; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.remote.Augmenter; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.openqa.selenium.support.ui.ExpectedConditions; - -public class WebdriverUtils { - private static int WEBELEMENT_TIMOUT = 60; - - public static WebElement getClickableElement(WebDriver driver, By locator) { - WebDriverWait wait = new WebDriverWait(driver, WEBELEMENT_TIMOUT); - WebElement element = wait.until(ExpectedConditions - .elementToBeClickable(locator)); - return element; - } - - public static WebElement getVisibleElement(WebDriver driver, By locator) { - WebDriverWait wait = new WebDriverWait(driver, WEBELEMENT_TIMOUT); - WebElement element = wait.until(ExpectedConditions - .visibilityOfElementLocated(locator)); - return element; - } - - public static void openPage(WebDriver driver, String url) { - driver.get(url); - } -} diff --git a/src/test/resources/conf/local.conf.json b/src/test/resources/conf/local.conf.json new file mode 100644 index 0000000..5b371f9 --- /dev/null +++ b/src/test/resources/conf/local.conf.json @@ -0,0 +1,16 @@ +{ + "server": "hub-cloud.browserstack.com", + "user": "BROWSERSTACK_USERNAME", + "key": "BROWSERSTACK_ACCESS_KEY", + + "capabilities": { + "build": "jbehave-browserstack", + "name": "local_test", + "browserstack.debug": true, + "browserstack.local": true + }, + + "environments": [{ + "browser": "chrome" + }] +} diff --git a/src/test/resources/conf/parallel.conf.json b/src/test/resources/conf/parallel.conf.json new file mode 100644 index 0000000..1686779 --- /dev/null +++ b/src/test/resources/conf/parallel.conf.json @@ -0,0 +1,21 @@ +{ + "server": "hub-cloud.browserstack.com", + "user": "BROWSERSTACK_USERNAME", + "key": "BROWSERSTACK_ACCESS_KEY", + + "capabilities": { + "build": "jbehave-browserstack", + "name": "parallel_test", + "browserstack.debug": true + }, + + "environments": [{ + "browser": "chrome" + },{ + "browser": "firefox" + },{ + "browser": "safari" + },{ + "browser": "internet explorer" + }] +} diff --git a/src/test/resources/conf/single.conf.json b/src/test/resources/conf/single.conf.json new file mode 100644 index 0000000..d1f3bc4 --- /dev/null +++ b/src/test/resources/conf/single.conf.json @@ -0,0 +1,15 @@ +{ + "server": "hub-cloud.browserstack.com", + "user": "BROWSERSTACK_USERNAME", + "key": "BROWSERSTACK_ACCESS_KEY", + + "capabilities": { + "build": "jbehave-browserstack", + "name": "single_test", + "browserstack.debug": true + }, + + "environments": [{ + "browser": "chrome" + }] +} diff --git a/src/test/resources/features/search/google.feature b/src/test/resources/features/search/google.feature deleted file mode 100644 index 7a48008..0000000 --- a/src/test/resources/features/search/google.feature +++ /dev/null @@ -1,4 +0,0 @@ -Scenario: Google search - -When I search Google for BrowserStack -Then the title should contain BrowserStack diff --git a/src/test/resources/stories/local.story b/src/test/resources/stories/local.story new file mode 100644 index 0000000..811128c --- /dev/null +++ b/src/test/resources/stories/local.story @@ -0,0 +1,4 @@ +Scenario: Can check tunnel working + +When I open health check +Then I should see "Up and running" diff --git a/src/test/resources/stories/single.story b/src/test/resources/stories/single.story new file mode 100644 index 0000000..16bb707 --- /dev/null +++ b/src/test/resources/stories/single.story @@ -0,0 +1,5 @@ +Scenario: Google's Search Functionality + +When I type query as "BrowserStack" +Then I submit +Then I should see title "BrowserStack - Google Search"