Load Test Your App Using Real Browsers.

Flood Element is the first scalable, browser based load generation tool — making load testing as easy as functional testing.

View the docsGitHub

License: Apache 2 • v1.0.5-beta.4

Features

Flood Element is the best way to get started with load testing.

  • Realistic Load

    Working at a higher level of abstraction greatly simplifies the requests you need to make to simulate users on your application.

  • Test Data

    Load testing without test data is like using lorem ipsum in production. Element ships with rich support for CSV and JSON data loading.

  • Selenium Compatible

    Element's DSL is heavily influenced by WebDriver.js, making it really easy to migrate your Selenium scripts to Element.

  • Built on Puppeteer

    Thanks to the speed of the Puppeteer automation library, Element generates load by launching thousands of instances of Google Chrome.

  • TypeScript

    TypeScript gives you inline documentation and script validation before pressing launch, to catch the small issues which might stop the show.

  • Command Line Interface

    Generate new tests, validate, and run them locally, with our interactive CLI.

import { step, TestSettings, Until, By, Device, Key } from '@flood/element'
import * as assert from 'assert'
import { internet } from 'faker'

export const settings: TestSettings = {
	clearCache: true,
	disableCache: true,
	waitTimeout: 30,
	stepDelay: 5.0,
  actionDelay: 1.0,
  loopCount: -1
}

/**
 * fiori
 * @version 1.0
 */
export default () => {
	const randEmail = internet.email()

	step('Test: Start', async browser => {
		await browser.visit('https://www.sapfioritrial.com/sites?helpset=trial&sap-client=001#')

		let iAgreeBtn = By.xpath("//span[contains(text(),'I agree')]")
		await browser.wait(Until.elementIsVisible(iAgreeBtn))

		var button = await browser.findElement(iAgreeBtn)
		assert.ok(await button.isDisplayed(), 'Button is visible')
		await button.click()

		await browser.takeScreenshot()
	})

	step('Click on My Tasks', async browser => {

		let myTasks = By.visibleText('My Tasks')
		await browser.wait(Until.elementIsVisible(myTasks))

		let myTasksBtn = await browser.findElement(By.xpath("//div[@id='__tile13' and contains(@title, 'My Tasks')]"))
		await myTasksBtn.click()

		let searchInput = By.xpath("//input[contains(@placeholder, 'Search')]")
		await browser.wait(Until.elementIsVisible(searchInput))

		await browser.takeScreenshot()
	})

	step('Create a new task and save it', async browser => {
		await browser.press(Key.F6)
		await browser.press(Key.F6)
		await browser.press(Key.F6)
		await browser.press(Key.TAB)
		await browser.press(Key.TAB)
		await browser.press(Key.ENTER)

		let titleInput = By.xpath("//div[5]//div[1]//textarea[1]")
		await browser.wait(Until.elementIsVisible(titleInput))
		await browser.type(titleInput, "Something from " + randEmail)
		console.log('surname was: ' + randEmail)

		let notesInput = By.xpath("//textarea[@id='__xmlview4--noteTa-inner']")
		await browser.type(notesInput, "testing from flood")

		await browser.press(Key.F6)
		await browser.press(Key.ENTER)

		await browser.wait(10)

		await browser.takeScreenshot()
	})

	step('Go back to My Tasks', async browser => {
		await browser.press(Key.ENTER)

		let searchInput = By.xpath("//input[contains(@placeholder, 'Search')]")
		await browser.wait(Until.elementIsVisible(searchInput))

		await browser.takeScreenshot()
	})

	step('Search for the created task', async browser => {
		let searchInput = By.xpath("//input[contains(@placeholder, 'Search')]")
		await browser.type(searchInput, "Something from " + randEmail)

		await browser.press(Key.ENTER)

		let pageTextVerify = By.visibleText("Something from " + randEmail)
		await browser.wait(Until.elementIsVisible(pageTextVerify))

		await browser.takeScreenshot()
	})
}

Test Smarter.

Load testing at the browser level opens up huge opportunities for testing modern web applications which would be extremely difficult to achieve reliably with existing network level load testing tools.

  • Reduce maintenance

    Flood Element scripts are less prone to breakage compared with JMeter or Gatling scripts.

  • Save time

    It takes just a few minutes to get functional load test running with Flood Element.

  • Generate Realistic Load

    In today's modern applications, up to 80% of performance problems occur in the browser, which makes browser based load testing more important than ever.

Browser vs. Protocol

Load testing has barely kept pace with the rate of innovation on the web as a platform over the last 20 years. We set out to change this with Flood Element.

Traditionally, load testing meant simulating network calls as quickly as possible, either using scripting, log replay, or a network recorder. But these approaches have always suffered from a high cost of script maintenance due to the fickle nature of network requests, lack of maintenance due to complexity, or simulating unrealistic load due to a misunderstanding of the workload patterns of regular users of the product.

These are just some of the problems we're solving by load testing in a similar way to real users of your application.

Get Started