{"id":14978908,"url":"https://github.com/retailmenot/scaffold","last_synced_at":"2025-10-28T13:31:23.115Z","repository":{"id":57728270,"uuid":"176768873","full_name":"RetailMeNot/scaffold","owner":"RetailMeNot","description":"A Java based Selenium WebDriver abstraction","archived":false,"fork":false,"pushed_at":"2023-04-10T17:03:52.000Z","size":206,"stargazers_count":6,"open_issues_count":11,"forks_count":9,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-02-01T15:11:30.738Z","etag":null,"topics":["java","selenium","selenium-java","selenium-webdriver"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RetailMeNot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-20T15:57:21.000Z","updated_at":"2024-12-01T22:34:57.000Z","dependencies_parsed_at":"2024-09-19T01:00:41.709Z","dependency_job_id":"dba9cc8f-dab3-47d0-9f9b-606309e9f6fd","html_url":"https://github.com/RetailMeNot/scaffold","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":0.1428571428571429,"last_synced_commit":"67482612a595e71519097c2cfd49f208652a1216"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RetailMeNot%2Fscaffold","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RetailMeNot%2Fscaffold/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RetailMeNot%2Fscaffold/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RetailMeNot%2Fscaffold/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RetailMeNot","download_url":"https://codeload.github.com/RetailMeNot/scaffold/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238655019,"owners_count":19508541,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","selenium","selenium-java","selenium-webdriver"],"created_at":"2024-09-24T13:58:37.044Z","updated_at":"2025-10-28T13:31:22.670Z","avatar_url":"https://github.com/RetailMeNot.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Scaffold\nScaffold is a Selenium WebDriver abstraction built in Java 11 with Spring Boot 2.x / Jersey / Jax Rs. Out of the box, it provides a myriad of additional features on top of the base WebDriver wrapper:\n\n* Bootstrapper - Starts and stops a new thread safe WebDriver instances (parallelizable).\n* Provides an abstraction of WebElements to depict literal object representations of what exists in the DOM (e.g. InputWebElement or LinkWebElement).\n* Implicitly waits for elements to be located during page object instantiation and element manipulation\n* Automatically handles StaleElementException issues when the state of the DOM has changed.\n* Provides a Navigation class to give users a separation of concerns between test setup and test assertions.\n* Provides a Spring Boot auto-configuration for configuring a browser when creating Spring Boot profiles in an implementing project (DesiredCapabilities, e.g. browser type, environment type, etc).\n* Provides a Spring Boot auto-configuration for managing configuring connections to SauceLabs.\n* Configures Junit Jupiter's parallel testing when running the testing through an automated framework like Sauce or Grid\n* Provides all dependencies to implementing projects\n\n# Current Version\nTo view the most current version, [visit the Central Repository](https://search.maven.org/search?q=g:com.retailmenot.scaffold).\n\n# Links\n- [Contributing Guide](https://github.com/RetailMeNot/scaffold/blob/master/CONTRIBUTING.md)\n- [Code of Conduct](https://github.com/RetailMeNot/scaffold/blob/master/CODE_OF_CONDUCT.md)\n- [License](https://github.com/RetailMeNot/scaffold/blob/master/LICENSE.txt)\n    \n# Required Tools for Dev\n* Java 11\n* Maven 3.x\n\n# CI\nThe build can be found [on Travis CI](https://travis-ci.org/RetailMeNot/scaffold).\n\n# Setting Up Your Project\nUse this section for setting up a new project using Scaffold. Setup follows a fairly standard Spring Boot application design by using modules for the code base's environment and main testing.\n\nComing in a future update, we will provide an example implementation project and a maven archetype to easily start up new projects. \n\n## Create the Project\nCreate a new Java Maven project.\n\nFollow the standard maven [naming conventions](https://maven.apache.org/guides/mini/guide-naming-conventions.html) when creating the new project.\n\n## Add Maven Repo Dependencies\nAdd the following dependency to your parent POM's DependencyManagement section:\n\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.retailmenot.scaffold\u003c/groupId\u003e\n    \u003cartifactId\u003escaffold\u003c/artifactId\u003e\n    \u003cversion\u003ecurrent_version\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.retailmenot.scaffold\u003c/groupId\u003e\n    \u003cartifactId\u003eframework\u003c/artifactId\u003e\n    \u003cversion\u003ecurrent_version\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.retailmenot.scaffold\u003c/groupId\u003e\n    \u003cartifactId\u003eenvironment\u003c/artifactId\u003e\n    \u003cversion\u003ecurrent_version\u003c/version\u003e\n\u003c/dependency\u003e\n``` \n\n## Create Modules\nCreate two new maven modules in your project. \n\n* `environment`\n* `core`\n\nThe environment module's POM should contain Scaffold's environment dependency. \n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.retailmenot.scaffold\u003c/groupId\u003e\n    \u003cartifactId\u003eenvironment\u003c/artifactId\u003e\n\u003c/dependency\u003e\n```\n\nThe core module's POM should contain Scaffold's framework dependency.\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.retailmenot.scaffold\u003c/groupId\u003e\n    \u003cartifactId\u003eframework\u003c/artifactId\u003e\n\u003c/dependency\u003e\n```\n\n## Required Files\nThe following are files that should be created in your project.\n\n### Spring Configuration\nA spring configuration file is necessary for handling component scanning and the usage of spring profiles when running testing. Component scanning is necessary for dependency injection and spring profiles are used for setting\n`DesiredCapabilities` for testing. More detail regarding spring profiles are included in a later section. \n\nCreate a new file under the environment module adhering to the naming convention standardization hierarchy set when creating your new project. \n\nE.G: `environment \u003e src \u003e main \u003e java \u003e your \u003e groupID \u003e environment \u003e YourProjectConfiguration.java`\n\nThe contents of this file should include:\n```\n@Configuration\n@ComponentScan(value = \"your.group.id\")\n@PropertySource(\"classpath:/application.properties\")\npublic class YourProjectConfig {\n}\n```  \n\n### Page Objects\nScaffold implements the paradigm of a page object. Page objects are simple representations of web pages as a Java Object. In order to create a representation of a web page, you'll need to create a new class that contains properties \nof Scaffold's strongly typed elements.\n\n#### Strongly Typed Elements\nScaffold makes available particular types of WebElements for you to use, which narrow the scope of methods available for any given WebElement, and keep the user focused on the actions they should be performing on these elements. \nFor example, a user cannot `sendKeys()` to a Button or a Link. The `ButtonWebElement` and `LinkWebElement` objects take that into account and don't expose those methods.\n\nAnother advantage of these elements is that they manage all interaction with the WebDriver internally. Most frameworks require the test write/page object maintainer to use the WebDriver to perform all their actions, \nwhich requires a lot of Selenium knowledge, and can also lead to race conditions, thread-safety issues, and the exposure of unnecessary complexity to the testers.\n\nIn the millions of test cases run by Scaffold over the years, there has never been a reported occurrence of a StaleElementReferenceException. This is possible because the framework manages the WebDriver and the WebElements \ninternally, in a thread-safe and careful manner.\n\nA strongly typed element in scaffold can be one of the following:\n* ButtonWebElement\n* CheckBoxWebElement\n* DateWebElement\n* DivWebElement\n* DropDownWebElement\n* ImageWebElement\n* InputWebElement\n* LinkWebElement\n* RadioWebElement\n* StaticTextWebElement\n\n#### Page Object Example\nPage objects should only be written in a way that makes them agnostic to navigation, the web driver itself, or by any other external means outside the scope of its own representation. They should also never contain any \nassertions. While the `WebDriver` is not directly injected into a page object, the underlying `WebDriver` is used for finding elements when a `getElement()` is performed and _not_ when an element is declared.\n\nIn other words, simply initializing a strongly typed element does not perform an interaction with the underlying WebDriver; but instead, only creates a reference point with a By locator. This creates a dynamic use case when \nperforming navigation in that when a new page object is initialized, the elements will not be searched for at the time of the class being constructed. It isn't until you attempt to get the strongly typed element with a getter \nthat the underlying WebDriver will perform a `getWebElement()`, therefore performing the `findElement()` interaction.    \n\nTo create a page object, follow the same design as Java Beans, [found here](https://www.javatpoint.com/java-bean).\n\nThe page objects should live within the core module in a page module. E.G: `core \u003e src \u003e main \u003e java \u003e your \u003e groupID \u003e page` \n\nAn example page object:\n```\npublic class LoginPage {\n\n    private DivWebElement pageHeader = new DivWebElement(By.cssSelector(\"#someHeader\"));\n    private InputWebElement emailInput = new InputWebElement(By.cssSelector(\"#emailInput\"));\n    private InputWebElement passwordInput = new InputWebElement(By.cssSelector(\"#passwordInput\"));\n    private ButtonWebElement loginButton = new ButtonWebElement(By.cssSelector(\"#loginButton\"));\n\n    public DivWebElement getPageHeader() {\n        return pageHeader;\n    }\n\n    public DivWebElement getEmailInput() {\n        return profileGreeting;\n    }\n\n    public LinkWebElement getPasswordInput() {\n        return editProfileLink;\n    }\n\n    public DivWebElement getLoginButton() {\n        return emailList;\n    }\n\n    public void clickLoginButton() {\n        getLoginButton().click();\n    }\n    \n    public void login(String username, String password) {\n        getEmailInput().clearAndSendKeys(username);\n        getPasswordInput().clearAndSendKeys(password);\n        getLogInButton().click();\n    }\n}\n```\n\nLet's break down what we see in the example above.\n\n1. Properties        \nThese are the elements on the page that we wish to represent. They can be whatever you feel is necessary to have. They could be headers, inputs, buttons, images, or anything else on the list of Strong Typed Elements above \nand are all merely references to be used later when you're getting the elements. They are located with the `By` class.\n2. Getters         \nJust regular ol' getters. It was already mentioned above, but this is where the magic happens. For example, when you use the `clickLoginButton()` method in a test, the `AbstractWebElement` class will perform a find element\nfrom the `WebDriverWrapper` to find the element `loginButton`, and then perform the click action from `AbstractClickable`.\n3. Page actions          \nThe page object is a good opportunity to include any page specific actions you'd like to abstract. This is yet another level of creating an additional layer that will allow us to maintain our testing a little easier as it scales.\n\n### Navigation\nYour project should have a navigation file that extends `WebDriverNavigation`. This file should live within the core module in a navigation package. E.G: `core \u003e src \u003e main \u003e java \u003e your \u003e groupID \u003e page \u003e Navigation.class`\n \nThe navigation file handles the navigation of the page objects. For example, using the example login page object above, let's say your implementing project has a login page and a profile page.\nIn order to navigate to the profile page, it first requires a login (since the profile is gated). Your page navigation file might contain the method `navigateToProfilePage`:\n```\n@Component\npublic class AutomationNavigation extends WebDriverNavigation {\n\n    // Spring environment variable from a configuration file in environment module\n    private final String baseEnvironmentUrl;\n\n    public NavigationImpl(@Value(\"${base-environment-url}\") String baseEnvironmentUrl) {\n        this.baseEnvironmentUrl = baseEnvironmentUrl;\n    }\n\n    public ProfilePage navigateToProfilePage(String username, String password) {    \n        // Start the web test from a base environment URL pulled in from a Spring env variable\n        getWebDriverWrapper().get(baseEnvironmentUrl);\n        \n        // Create a new instance of the LoginPage\n        var logInPage = new LoginPage();\n        \n        // Use the login method from the LoginPage\n        logInPage.login(username, password);\n        \n        // Return the new ProfilePage\n        return new ProfilePage();\n    }\n}\n```\n\nLet's break down what we see in this above example.\n\n1. @Component     \nThis is an important annotation to use here because we'll be injecting this class into the BaseTest file later on. Because we have a component scan configuration file (set up earlier), it will detect classes with the `@Component`\nannotation and allow us to perform the injection.\n2. WebDriverNavigation extension         \nExtending off of `WebDriverNavigation` is important here so we can get the `WebDriverWrapper` instance from the current thread. That allows us to perform the `.get` call.\n3. Constructor dependency injection            \nSeen in the example above, we reference `@Value(\"${base-environment-url}\") String baseEnvironmentUrl`. This is a spring environment variable defined in a spring profile (more on that later). This allows us have a configure what\nwe want our url to be based on what environment we're wanting to run the testing on. It's important to know that only Strings can be used for these variables.\n4. Navigation method           \nHere is where the actual work happens. We get the WebDriverWrapper from the WebDriverNavigation class (because it's protected) and we perform the `get()` function to navigate to our base environment url set by a spring profile.\nThen, we create a new instance of the LoginPage page object, we perform the login that is defined on the LoginPage class (since it's gated), and then return a new instance of a ProfilePage page object.\n\nThe advantage here for separating out the navigation is that it gives us further abstraction in our test writing. Or, in other words, creating an additional layer that will allow us to maintain our testing a little easier as it scales.\n\n### BaseTest\nYour project should have a BaseTest file that extends `ScaffoldBaseTest`. This file should live within the core module's test package. E.G: `core \u003e src \u003e test \u003e java \u003e your \u003e groupID \u003e BaseTest.java`\n\nThis BaseTest file should include any project specific spring wiring or configurations along with the Scaffold configuration. Make sure to also attach the annotation listed below, as well.\n```\n@Execution(ExecutionMode.CONCURRENT)\n@ExtendWith(SpringExtension.class)\n@SpringBootTest(\n        webEnvironment = SpringBootTest.WebEnvironment.NONE,\n        classes = { your_own_config.class, ScaffoldConfig.class }\n)\npublic abstract class BaseTest extends ScaffoldBaseTest {\n\n    @Autowired\n    protected Navigation navigation;\n    \n    @BeforeEach\n    public void doSomethingAtStart() {\n        // Some code here that might do something before each test is started\n    }\n    \n    @AfterEach\n    public void doSomethingAtEnd() {\n        // Some code here that might do something after each test is finished\n    }\n}\n``` \n\nLet's break down what we see in this example above.\n\n1. Annotations        \nThese annotations are important for configuring what was once known in Junit4 as the test runner, the parallelization mode, and the spring configuration for loading the application context / spring boot test app. Under the \n`@SpringBootTest` annotation, be sure to change `your_own_config.class` to your projects configuration class name.\n2. Abstract class identifier          \nIt's important to declare this class abstract so any Junit5 methods are not ran as tests.\n3. ScaffoldBaseTest extension         \nExtending `ScaffoldBaseTest` gets you the driver initialization and tear down and will also get you the `WebDriverWrapper` instance from the current thread.\n4. @Autowired          \nThis is a means of dependency injection within Spring Boot known as composition. With this annotation, we can wire in an instance of a `@Component` with ease. Since it's protected, any class that extends off of BaseTest will\nnow be able to access it.\n5. @BeforeEach and @AfterEach         \nThese are just some examples of additional code you can write in your `BaseTest` file to perform any pre req or tear down actions outside of the driver initializing and closing.\n\n### Spring Profiles\nSpring profiles are sets of configurations that can be used when running testing locally or through a test automation framework like Sauce. These configurations determine the `DesiredCapabilities` of the browser and can also \nconfigure Sauce credentials. During a test run, you specify the spring profile to use. This will be explained a little bit later.\n\nThe spring profiles should live under the resources package in the environment module that was set up earlier in this guide. E.G: `environment \u003e src \u003e main \u003e resources \u003e application-chrome_sauce.properties`. For more information on spring profiles, [check out this link here](https://www.springboottutorial.com/spring-boot-profiles).\n\n#### Desired Capabilities\nTo set the `DesiredCapabilites`, include pre configured properties from the `DesiredCapabilitiesConfigurationProperties` file. A full list of these properties [can be found at the following link](https://github.com/RetailMeNot/scaffold/blob/master/environment/src/main/java/com/retailmenot/scaffold/environment/config/DesiredCapabilitiesConfigurationProperties.java).\nAll of these properties are preceded by the prefix of `desired-capabilities`. So, for example, if you wish to define the run type of sauce, you'd enter `desired-capabilities.run-type=sauce`. Because Scaffold includes an\nauto configuration for these properties, you gain the benefit of auto complete, as well. Simply type the first few letters of the word `desired` will show you a list of capabilities that can be set.\n\nIf you'd like to learn more about desired capabilities, details on the configuration [options that can be found here](https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options).\n\nBelow is the current list of potential desired capabilities to set.\n```\n# Browser/OS Config\ndesired-capabilities.run-type=where the browser testing is running, e.g. local, sauce, or grid\ndesired-capabilities.environment-type=the environment the testing is running on, e.g. test or stage.\ndesired-capabilities.browser-type=the browser type to be launched\ndesired-capabilities.browserVersion=the version of the browser to be launched\ndesired-capabilities.runPlatform=the operating system the browser is launching on\ndesired-capabilities.remote-url=The default grid URL to use\ndesired-capabilities.upload-screenshots=a boolean to determine if screenshots will be uploaded\n``` \n\n#### Local Chrome Example\nOne option of a test run could include a local execution. This type of configuration is good for a one off test to debug or for POC'ing a test. It's not recommended that you run a large suite of testing with a local\nbrowser. Typically, this sort of local configuration is included in an overrides spring profile and is not used for CI. If using an overrides profile _do not_ include this file in your commit. \nEnsure that this file is added to your .gitignore. Overrides files are also used to include hard coded secrets and should never be exposed publicly. \n\n*Important note: Since a local browser is being used, you must have the local driver installed. E.G: ChromeDriver. Otherwise, the testing will not work.*\n\nFor this example, let's assume we have created a new overrides profile. This overrides profile is called `application-overrides.properties`. In that file, we would include the following:\n```\nbase-environment-url=some_base_url\n\ndesired-capabilities.run-type=local\ndesired-capabilities.browser-type=chrome\ndesired-capabilities.run-platform=mac\n```\n1. The base environment is in this file because it's a required environment variable from the `Navigation` class.  \n2. The run type is local because we're executing the test against our local browser\n3. The browser type is chrome because chrome happens to be our main browser. This can be switched to other browsers but those drivers will be required\n4. The run platform is mac because our OS is mac. This can be changed to whatever OS is being run.\n\n#### Sauce Chrome Example\nAnother option of a test run could include a test execution against Sauce Labs. Because of the auto configuration defined by Scaffold, it's easy to add the sauce credentials to the overrides profile (to run the testing from your machine but sending the testing to sauce labs) \nor to a spring profile that is used in the CI/CD pipeline.\n\n*Important note: If adding the sauce credentials to an overrides file, ensure the overrides file is not checked in to your code base. These values should never be publicly exposed.*\n\nFor this example, let's create a new spring profile called `application-chrome_test.properties`. This configuration is going to be ran through sauce labs and will execute against a lower environment, TEST, with a windows browser.\nThis configuration file should be included would have the following:\n```\nbase-environment-url=http://www.websitetest.com\n\n# Sauce Config\ndesired-capabilities.sauce.url=\u003cyour sauce url\u003e\ndesired-capabilities.sauce.user-name=\u003cyour username\u003e\ndesired-capabilities.sauce.password=\u003cyour password\u003e\ndesired-capabilities.sauce.access-key=\u003cyour access key\u003e\ndesired-capabilities.sauce.tunnel-identifier=\u003cyour tunnel identifier\u003e\n\n# Base Desired Capabilities\ndesired-capabilities.run-type=sauce\ndesired-capabilities.browser-type=chrome\ndesired-capabilities.run-platform=windows\n```\n\n1. The base environment is in this file because it's a required environment variable from the `Navigation` class.\n2. The sauce url is the endpoint you'd like to hit for testing. For now, Scaffold does not have a hard requirement to force you to hit the Selenium endpoint.  \n3. The username is your sauce labs account username\n4. The password is your sauce labs account password\n5. The access key is your sauce labs account's access key\n6. The tunnel identifier is the name of your tunnel that is started in your CI (or locally) to run against.\n7. The run type is sauce because the testing is running against sauce labs\n8. The browser type is chrome because we'd like to run the testing in chrome. This can be changed to any other browser supported by Sauce Labs.\n9. The run platform is windows because we'd like to run the testing on a Windows OS. \n\n#### Configuring Constant Values for DesiredCapabilities\nBecause of the hierarchy of the spring profile system, it is possible to create constant environment variable values that all spring profiles can automatically include. This is useful for sauce credentials since you can include\nthe configuration in only one profile. \n\nThese constants can be included in a file named `application.properties`. It's worth mentioning that any subsequent spring profile that sets the same environment variable will override the existing value in `application.properties`. \nThis will allow you to set default values for any additional environment variable you create but override them in child profiles if you so wish.  \n\nFor this example, let's say we'd like to include the sauce credentials in `application.properties`. Since we might have multiple configurations we'd like to have, with all of them requiring sauce credentials, it makes sense to only\ninclude them in one file.That file will include the following:\n```\ndesired-capabilities.sauce.url=\u003cyour sauce url\u003e\ndesired-capabilities.sauce.user-name=\u003cyour username\u003e\ndesired-capabilities.sauce.password=\u003cyour password\u003e\ndesired-capabilities.sauce.access-key=\u003cyour access key\u003e\ndesired-capabilities.sauce.tunnel-identifier=\u003cyour tunnel identifier\u003e\n```  \n\nTaking the example from the Sauce Chrome Example section above, the new `application-chrome_test.properties` file would look like this:\n```\nbase-environment-url=http://www.websitetest.com\n\n# Base Desired Capabilities\ndesired-capabilities.run-type=sauce\ndesired-capabilities.browser-type=chrome\ndesired-capabilities.run-platform=windows\n```\n\nSince the sauce credentials are already included in `application.properties`, the `application-chrome_test.properties` file does not need the sauce credentials. Therefore, we cut back on a little bit of code!\n\n## Running the Testing\n\n### Locally\nThere are two potential methods of running the testing locally. The first is maven goal execution and the second is running the testing through the IDE.\n\n### Maven\nDuring your maven goal execution step on your CI, specify the following system property: `-Dspring.profiles.active=your_spring_profile.properties`.\n\nThis will pull the environment variables from the profile specified in the system property.\n\n### IDE\nIf you don't already have one, create a file named `application.OVERRIDES` in `environment \u003e src \u003e main \u003e resources \u003e application-OVERRIDES.properties`. In this file, include the desired capabilities and any other secret values required to run your testing. \n\n*NOTE: Make sure to add `application.OVERRIDES` to your `.gitignore`*\n\nNext, create a new JUNIT run configuration for the testing you'd like to run locally. In the new run configuration, add the new environment variable `SPRING.PROFILES.ACTIVE=OVERRIDES`. This setting will pull in the environment variables from the OVERRIDES profile when that test is run through the IDE. \n\n*As a reminder, it's recommended to not use a spring configuration that contains a local browser desired capability for running a large amount of testing.*\n\nNow your testing is ready to be executed.\n\n### CI\nDuring your maven goal execution step on your CI, specify the following system property: `-Dspring.profiles.active=your_spring_profile.properties`.\n\nThis will pull the environment variables from the profile specified in the system property.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fretailmenot%2Fscaffold","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fretailmenot%2Fscaffold","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fretailmenot%2Fscaffold/lists"}