Code Monkey home page Code Monkey logo

digital-delivery-academy / selenium-pom-framework Goto Github PK

View Code? Open in Web Editor NEW
1.0 9.0 0.0 4.66 MB

A simple Selenium framework offering externalised configuration, good selection of libraries for supporting test data, simple WebDriver browser binary resolution and an opinionated approach for WebDriver test design.

Home Page: https://www.evoco.co.uk

License: MIT License

Java 80.85% HTML 3.01% Shell 0.55% JavaScript 1.80% Vue 13.80%
selenium java-13 maven hamcrest junit webdriver webdrivermanager junit-5 boilderplate selenium-pom

selenium-pom-framework's Introduction

selenium-pom-framework

GitHub Actions Build GitHub Issues badge

Coverage Reliability Rating Security Rating Sauce Test Status

Latest version badge

All Contributors

We've released version 1.0.0! And we've moved to Maven Central hosting and added instrumentation

This toolkit is really a culmination of 10 years of working with teams building automated UI checks with Selenium. We've found time and again that we refactor or rewrite "frameworks" that wrap the entirety of the Selenium API (to little benefit). On top of this, we see so much brittle code that we wanted to put something out there that people could use and benefit from our experience. As a result, this toolkit provides an simple, lightweight (and well structured) way to launch, control and configure checks for Selenium/WebDriver in Java. It's a curation of all of the little libraries and fixes we've used over the years. So if you're at the start of your automation journey or you're just bored of writing the same "framework" over and over again, you're in the right place.

You'll find no junk (hopefully) here, but it's a fairly opinionated approach:

  • There's no mass "wrapper" on Selenium - that's dumb
  • We suggest using the Page Object Model, it's generally a good idea, and we provide a starting point for this
  • We resolve Driver binaries from WebDriverManager (https://github.com/bonigarcia/webdrivermanager)
  • We provide random test data generators from Mockneat (https://github.com/nomemory/mockneat) and UK Gov (https://github.com/dwp/nino-format-validation) as well as some of our own (for dates and stuff)
  • There's an externalised (and overridable) configuration system, based on JSON
  • We handle providing JUnit (we use version 5), Selenium and Hamcrest (for writing good assertions)
  • The framework is instrumented to measure execution time of internals, and these metrics are available via JMX or Graphite.
  • Our framework is unit and integration checked as well as monitored for code quality; we treat this as a production code base, not a second class citizen.
  • We have a (developing) open road map in GitHub Issues (click the Issues tab to see what we have so far)
  • We have a fuller set of documentation here: https://digital-delivery-academy.github.io/selenium-pom-framework/index.html

Coming soon:

It really is a one stop shop for getting up and running with a robust toolkit for building Selenium checks, without the massive investment that many business make in hand rolling their own.

All of our code is unit or integration checked.

It's highly unlikely that you need anything more complicated than this. If you do, then you probably have the scope of what you're trying to check a little wrong.

Remember that checking through a browser is brittle, slow and should be at the very top of your automation pyramid.

5-10% of all of your projects automated checks (if you're building bespoke software) should be here.
If you end up with 500 Selenium checks then it's quite possible that you took a wrong turn. We'd be happy to talk about getting you back on the right path (get in touch: [email protected]).

If you have questions please feel free to contact me ([email protected]) or if you find issues raise a PR or submit an issue ticket.

Documentation

Example checks/project

See https://github.com/digital-delivery-academy/selenium-pom-example repository for an example of how to write Selenium checks using the Page Object Model. This repository uses this framework.

Usage

This project is published to Maven Central, so you just need to put this in your pom.xml.

<dependency>
  <groupId>uk.co.evoco</groupId>
  <artifactId>selenium-pom-framework</artifactId>
  <version>1.0.23</version>
</dependency>

Note: we used to publish releases to GitHub packages (which you can see if you click Packages above). This was restrictive because people HAD to have a GitHub account to use it, and had to mess around with their M2 settings. Maven Central was the right answer to this problem.

We skipped through a few minor versions setting up the Maven Central release, so there is no effective gap between 1.0.2 and 1.0.7.

Instrumentation and metrics

The framework is instrumented with Dropwizard Metrics which has two reporters; JMX and Graphite.

To view the JMX reports, the JVM still needs to be running. You can access by running from a command line jconsole and then connecting to the JVM that is running the tests. From jconsole you will need to open MBeans and then metrics to see the metrics that are being produced.

Note: We're probably going to remove JMX in coming releases because the nature of the framework is that it runs and then exits. When the container closes, the metrics go with it (unless we add something like Graphite to back it). We'll see. It'll be fine during debugging though. We'd recommend looking at the next bit about Graphite and Grafana.

Graphite is a much more powerful way to see performance of the framework over time, and to see where your tests are spending the most time. Here's some instructions about how to get started using Docker.

Note: Obviously you have to have docker installed. I'm sure you can Google that :)

We're going to setup docker containers for graphite which is essentially a cool way to track metrics over time and grafana which is a sexy way to visualise things and create some dashboards. We need to link these two containers so that they can access each other and we're going to use the official containers from Graphite and Grafana themselves to get the latest versions. First up, we need a docker network:

docker network create graphite_grafana

Then we need to grab graphite:

docker run -d \
 --name graphite \
 --restart=always \
 --net graphite_grafana \
 -p 80:80 \
 -p 2003-2004:2003-2004 \
 -p 2023-2024:2023-2024 \
 -p 8125:8125/udp \
 -p 8126:8126 \
 graphiteapp/graphite-statsd

And finally we need to grab grafana:

docker run -d --name=grafana -p 3000:3000 --net graphite_grafana grafana/grafana

Once all of these commands have finished if you run docker ps you should end up with something like the following:

CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                                                                                                                                                                       NAMES
acbce542bd1f        graphiteapp/graphite-statsd   "/entrypoint"       4 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:2003-2004->2003-2004/tcp, 2013-2014/tcp, 8080/tcp, 0.0.0.0:2023-2024->2023-2024/tcp, 0.0.0.0:8126->8126/tcp, 8125/tcp, 0.0.0.0:8125->8125/udp   graphite
ed8a7fcdbfc3        grafana/grafana               "/run.sh"           2 minutes ago       Up 2 minutes        0.0.0.0:3000->3000/tcp                                                                                                                                                      grafana

Now open up a browser window and get the two web interfaces loaded up:

Graphite: http://localhost:80

Grafana: http://localhost:3000

Grafana is where we're going to do most of our work now. Let's set up the data source first. From the home page in Grafana click "Add data source". Then select "Graphite" from the list of sources.

Give an appropriate name (selenium-pom-framework for example). The following fields and values follow:

URL: http://graphite:80

Click Save & Test. Everything should go green, and Graphite and Grafana should now be connected. Now you can run tests and all of the metrics will be put out to Graphite and you can create dashboards to see where your tests are going slowly.

There's a sample dashboard in this repo in grafana-dashboard-examples/sample-dashboard.json that you can import to get started.

If you're deploying this else where (i.e. not locally) you can configure connection details in the configuration object (see below).

"metrics": {
    "jmx": {
        "enabled": false
    },
    "graphite": {
        "enabled": true,
        "host": "localhost",
        "port": 2003
    }
}

References/thanks

Testing Powered By SauceLabs

We're using repositories from the guys below to provide some of our features:

Contributors


Steve Walton

๐Ÿ’ป

Augustine K

๐Ÿ’ป

balu836

๐Ÿ’ป

damien-cooke

๐Ÿ’ป

selenium-pom-framework's People

Contributors

akwanashie avatar allcontributors[bot] avatar balu836 avatar dependabot[bot] avatar stevewalton28 avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

selenium-pom-framework's Issues

Document how to override Selenium versions

Once this is a library that can be released, it probably won't be obvious to newcomers on how to override the Selenium version that we use "under the hood". We should probably document how to do that with Maven so if we're a minute late with bumping the version then we're still good to go.

Test builds against multiple JDK versions

Update travis configuration to test against:

  • jdk8
  • jdk9
  • jdk10
  • jdk11
  • jdk12
  • jdk13

Lots of people will be trying to use this in older environments. Maybe investigate the current usages of older JDKs and what is still supported etc.

Create tolerantSelectBox

Is your feature request related to a problem? Please describe.
Create tolerantSelectBox

Describe the solution you'd like
See implementation of tolerantClick

tolerantClick method with By instead of WebElement

Is your feature request related to a problem? Please describe.
The tolerantClick method is good, but its always going to cause issues outside of a pageobject if we try and interact with a WebElement again if a StaleElementException is the thing we're trying to handle.

Describe the solution you'd like
A new version of tolerantClick to take a By instead of a WebElement so on retry the element can be refreshed.

Publish to Maven Central

Is your feature request related to a problem? Please describe.
Currently, people that want to use the library have to have a GitHub account and issue a personal access token and then configure their ./m2/settings.xml with the configuration we show in the README.md.

This is pretty prohibitive if you're a newbie (like many people will be I imagine). We need to get people going quickly, and these extra configuration steps are in the way, just to use GitHub packages.

Describe the solution you'd like

This will require some POM enhancements: https://central.sonatype.org/pages/requirements.html

Tolerated exceptions ignored if the package name is omitted from the config file

Describe the bug
Sometimes a TolerantInteraction would fail because the exception couldn't be mapped out of its class name string (with included package etc) to the exceptions that are in the framework configuration file.

To Reproduce
Steps to reproduce the behavior:
List exceptions in the config.json file without the package name
Note that there is no debug messages supplied at all

Expected behavior
Exceptions should be tolerated for the given timeout.

Codacy coverage not picking up surefire/integration tests

Describe the bug
We have a set of integration tests that get ran during the Travis builds. However, when we run the Codacy Jacoco coverage plugin to push the coverage metrics to Codacy, we're not seeing the benefits of the ITs in the coverage report. This is giving us a false report of 25% code coverage.

To Reproduce
Steps to reproduce the behavior:

  1. Run travis build on tag
  2. Look in Codacy
  3. See that the WebDriver helpers report 0% coverage

Expected behavior
IT classes should be providing coverage for some part of the ConfiguredDriver implementing classes and all of the WebDriver helper classes.

Bank Holiday data source

Is your feature request related to a problem? Please describe.
Bank holidays are sourced for the UK from Gov.UK. We may be working in environments with no access to the internet.

Describe the solution you'd like
At build time we should package up the bank holiday json from Gov.UK and bundle it with the application with the latest version. It only changes once a year, so this solution is fine. We can then remove the reference to the API from the framework, and shift it to the build scripts.

Let's make sure that the JSON goes onto the classpath so we can get at it.

Integrated reporting (HTML)

Would be cool to have integrated reporting ready to go here that is richer than just the surefire reports.

How do I use this with Cucumber...jk

Please don't use Cucumber. Every time a tester uses Cucumber with Selenium or does "Acceptance Test Driven Development" or whatever mad name is being used for it, Santa executes an elf.

Santa needs elves people. Don't make the elves die.

This is a reminder to myself to never ever ever ever show anyone how to use Selenium with Cucumber.

Expand documentation

Is your feature request related to a problem? Please describe.
We have a small vue app in /src/main/resources that has some documentation about the framework as a reference. There are a few gaps that would be great to get filled.

Describe the solution you'd like
Pick a section and work on it. One section per PR. Link to this issue.

Create tolerantSendKeys or tolerantType

Is your feature request related to a problem? Please describe.
Create tolerantSendKeys or tolerantType

Describe the solution you'd like
See implementation of tolerantClick

Expand documentation

Describe the solution you'd like
We need a full set of documentation for the framework beyond javadocs

Additional context
We have javadocs and a rough outline on the wiki, but this is not enough!

Publish JavaDocs for framework to GitHub pages

On release we should publish the generated Java Docs to GitHub pages so that we have an up to date reference.

This would probably need to go into a version directory at the root so that we can host multiple versions of the Java Docs.

Unable to launch with Selenium Grid

Describe the bug
Unable to start a test using Selenium Grid

To Reproduce
Start a Grid:

docker run -d -p 4444:4444 --name selenium-hub selenium/hub:3.4.0
docker run -d --link selenium-hub:hub selenium/node-chrome:3.4.0
docker run -d --link selenium-hub:hub selenium/node-firefox:3.4.0

Start a test with the following config using version: selenium-pom-framework:1.0.9:

{
  "browser": "chrome",
  "baseUrl": "https://www.google.com",
  "timeout": "30",
  "headless": true,
  "runType": "GRID",
  "testConfig": {
    "sample": "sample text"
  },
  "gridConfig": {
    "url": "http://localhost:4444/wd/hub"
  },
  "browserPreferences": {
    "firefox": {
      "browser.download.defaultFolder": "downloads/reports",
      "pdfjs.disabled": true,
      "browser.download.folderList": 2
    }
  },
  "tolerantActionExceptions": {
    "waitTimeoutInSeconds": 5,
    "exceptionsToHandle": [
      "StaleElementReferenceException",
      "ElementClickInterceptedException",
      "ElementNotInteractableException"
    ]
  },
  "metrics": {
    "jmx": {
      "enabled": false
    },
    "graphite": {
      "enabled": false,
      "host": "localhost",
      "port": 2003
    }
  }
}

Expected behavior
Should be starting a test against the Grid.

Stack trace

org.openqa.selenium.WebDriverException: Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'Steve-Waltons-MacBook-Pro.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.4', java.version: '13.0.1'
Driver info: driver.version: RemoteWebDriver

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
	at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
	at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$errorHandler$0(JsonWireProtocolResponse.java:54)
	at org.openqa.selenium.remote.HandshakeResponse.lambda$getResponseFunction$0(HandshakeResponse.java:30)
	at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:126)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
	at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:128)
	at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:74)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:144)
	at uk.co.evoco.webdriver.utils.SampleIT.setUp(SampleIT.java:20)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:111)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptBeforeAllMethod(TimeoutExtension.java:60)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllMethods$8(ClassBasedTestDescriptor.java:371)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllMethods(ClassBasedTestDescriptor.java:369)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:193)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:77)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:132)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.NullPointerException
	at java.util.HashMap.putMapEntries(HashMap.java:500)
	at java.util.HashMap.putAll(HashMap.java:784)
	at org.openqa.selenium.remote.DesiredCapabilities.<init>(DesiredCapabilities.java:55)
	at org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:104)
	at org.openqa.grid.web.servlet.DriverServlet.process(DriverServlet.java:83)
	at org.openqa.grid.web.servlet.DriverServlet.doPost(DriverServlet.java:67)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.seleniumhq.jetty9.servlet.ServletHolder.handle(ServletHolder.java:841)
	at org.seleniumhq.jetty9.servlet.ServletHandler.doHandle(ServletHandler.java:543)
	at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
	at org.seleniumhq.jetty9.server.session.SessionHandler.doHandle(SessionHandler.java:1584)
	at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
	at org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle(ContextHandler.java:1228)
	at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
	at org.seleniumhq.jetty9.servlet.ServletHandler.doScope(ServletHandler.java:481)
	at org.seleniumhq.jetty9.server.session.SessionHandler.doScope(SessionHandler.java:1553)
	at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
	at org.seleniumhq.jetty9.server.handler.ContextHandler.doScope(ContextHandler.java:1130)
	at org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.seleniumhq.jetty9.server.Server.handle(Server.java:564)
	at org.seleniumhq.jetty9.server.HttpChannel.handle(HttpChannel.java:320)
	at org.seleniumhq.jetty9.server.HttpConnection.onFillable(HttpConnection.java:251)
	at org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
	at org.seleniumhq.jetty9.io.FillInterest.fillable(FillInterest.java:112)
	at org.seleniumhq.jetty9.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
	at org.seleniumhq.jetty9.util.thread.Invocable.invokePreferred(Invocable.java:122)
	at org.seleniumhq.jetty9.util.thread.strategy.ExecutingExecutionStrategy.invoke(ExecutingExecutionStrategy.java:58)
	at org.seleniumhq.jetty9.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:201)
	at org.seleniumhq.jetty9.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:133)
	at org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
	at org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
	at java.lang.Thread.run(Thread.java:748)





Process finished with exit code 255

Split out the "framework-y" parts to be a releasable module

Currently the repo is set as an example of how to do things, and a bunch of things that make stuff quickly is just wrapped up as well. It would be better to document examples (or even have a separate demo repo to show how to write the tests) and split out the "framework-y" bits into a releasable library.

Without this, we probably won't get much traction with the thing.

Instrument the framework to highlight slow checks

Describe the solution you'd like
I want a way to see which tests are high performers and which are the slowest. I want to understand and be able to visualise where my bottlenecks are in the test suite. I'd like to have Dropwizard Metrics included in the framework with various configurable appenders (JMX, grafana etc) so that we can collect metrics overtime about performance of the tests and target either:

  • badly performing tests
  • badly performing page objects
  • badly performing helper methods

Additional context
Would like to avoid dependency injection if possible.

Configurable WebDriverManager binaries

Is your feature request related to a problem? Please describe.
Some environments won't have access to the internet, so we need to give a way to configure if we're using the WebDriverManager download technique.

Describe the solution you'd like
Config file option to flag WDM on/off. If off, then config file provides paths to the binaries that we will handle.

Codacy not firing on pull requests

Describe the bug
Codacy is not firing for pull requests - think this is because the repo name has changed

To Reproduce
Steps to reproduce the behavior:

  1. Open a new PR
  2. Wait for a thousand years for codacy to trigger (it never does)

Expected behavior
Codacy should analyse all PRs

Add proxy support everywhere (for local, grid and SauceLabs)

Is your feature request related to a problem? Please describe.
We have no proxy support for anything

Describe the solution you'd like
Support proxies

Describe alternatives you've considered
There's an alternative world where no one cares about proxies, but we don't live there.

Additional context
Would be cool to add them for a number of reasons:

  • Supporting additional tools like ZAProxy, BurpSuite and Axe
  • Makes sure people can tunnel to SauceLabs (important)
  • Enables spitting loads of garbage requests into tools like JMeter (is anyone still doing that?)

Graphite unable to settings HTTP/HTTPS

Describe the bug
We currently allow Graphite reporter settings via the configuration file, with options for host and port but not protocol.

Expected behavior
Should be able to set protocol

Expose date formatter for date strings for a given pattern

Is your feature request related to a problem? Please describe.
Expose date formatter for date strings for a given pattern.

Describe the solution you'd like
This should allow a date/time string to be formatted as required by a given pattern.

Run against multiple browsers/platforms in same test

Is your feature request related to a problem? Please describe.
Run against multiple browsers/platforms in same test

Describe the solution you'd like
Seems pretty clear. I wanna be able to run tests against a configured list of browsers as a minimum. I wanna be able to combine the browser list against platforms for SauceLabs. I don't want to live in JSON hell to configure the thing.

Describe alternatives you've considered
The current work around is to maintain multiple configuration files and trigger a bunch of runs either in parallel or one after another with Jenkins or whatever to get the coverage that you want. That's fine, but it's not ideal, especially when SauceLabs offers this sort of thing as a featurez.

Additional context
Just need to get it done!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.