Branch: master
Find file History
Latest commit b1764c3 Feb 13, 2019
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
__fixtures__ feat: add spawnd & expect-puppeteer Mar 4, 2018
src chore: upgrade deps (#152) Nov 11, 2018
.npmignore fix(expect-puppeteer): add all sources in pkg Mar 4, 2018
CHANGELOG.md v4.0.0 Feb 13, 2019
LICENSE feat: add spawnd & expect-puppeteer Mar 4, 2018
README.md docs(expect-puppeteer): update Jest API (#191) Feb 4, 2019
package.json v4.0.0 Feb 13, 2019

README.md

expect-puppeteer

Build Status version MIT License

Assertion library for Puppeteer.

npm install expect-puppeteer

Usage

Without Jest:

import expect from 'expect-puppeteer'
;(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://google.com')
  await expect(page).toMatch('google')
  await browser.close()
})()

Use with Jest

To use with Jest, just modify your configuration:

{
  "setupFilesAfterEnv": ["expect-puppeteer"]
}

Why do I need it

Writing integration test is very hard, especially when you are testing a Single Page Applications. Data are loaded asynchronously and it is difficult to know exactly when an element will be displayed in the page.

Puppeteer API is great, but it is low level and not designed for integration testing.

This API is designed for integration testing:

  • It will wait for element before running an action
  • It adds additional feature like matching an element using text

Example

// Does not work if button is not in page
await page.click('button')

// Will try while 500ms to click on "button"
await page.toClick('button')

// Will match a button with a "My button" text inside
await page.toClick('button', { text: 'My button' })

API

Table of Contents

expect(instance).toClick(selector[, options])

Expect an element to be in the page or element, then click on it.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to click on
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
    • text <string|RegExp> A text or a RegExp to match in element textContent.
await expect(page).toClick('button', { text: 'Home' })

expect(page).toDisplayDialog(block)

Expect block function to trigger a dialog and returns it.

const dialog = await expect(page).toDisplayDialog(async () => {
  await expect(page).toClick('button', { text: 'Show dialog' })
})

expect(instance).toFill(selector, value[, options])

Expect a control to be in the page or element, then fill it with text.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to match field
  • value <string> Value to fill
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
    • delay <number> delay to pass to the puppeteer element.type API
await expect(page).toFill('input[name="firstName"]', 'James')

expect(instance).toFillForm(selector, values[, options])

Expect a form to be in the page or element, then fill its controls.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to match form
  • values <Object> Values to fill
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
await expect(page).toFillForm('form[name="myForm"]', {
  firstName: 'James',
  lastName: 'Bond',
})

expect(instance).toMatch(matcher[, options])

Expect a text or a string RegExp to be present in the page or element.

  • instance <Page|ElementHandle> Context
  • matcher <string|RegExp> A text or a RegExp to match in page
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
// Matching using text
await expect(page).toMatch('Lorem ipsum')
// Matching using RegExp
await expect(page).toMatch(/lo.*/)

expect(instance).toMatchElement(selector[, options])

Expect an element be present in the page or element.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to match element
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
    • text <string|RegExp> A text or a RegExp to match in element textContent.
// Select a row containing a text
const row = await expect(page).toMatchElement('tr', { text: 'My row' })
// Click on the third column link
await expect(row).toClick('td:nth-child(2) a')

expect(instance).toSelect(selector, valueOrText[, options])

Expect a select control to be present in the page or element, then select the specified option.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to match select element
  • valueOrText <string> Value or text matching option
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
await expect(page).toSelect('select[name="choices"]', 'Choice 1')

expect(instance).toUploadFile(selector, filePath[, options])

Expect a input file control to be present in the page or element, then fill it with a local file.

  • instance <Page|ElementHandle> Context
  • selector <string> A selector to match input element
  • filePath <string> A file path
  • options <Object> Optional parameters
    • polling <string|number> An interval at which the pageFunction is executed, defaults to raf. If polling is a number, then it is treated as an interval in milliseconds at which the function would be executed. If polling is a string, then it can be one of the following values:
      • raf - to constantly execute pageFunction in requestAnimationFrame callback. This is the tightest polling mode which is suitable to observe styling changes.
      • mutation - to execute pageFunction on every DOM mutation.
    • timeout <number> maximum time to wait for in milliseconds. Defaults to 500.
import path from 'path'

await expect(page).toUploadFile(
  'input[type="file"]',
  path.join(__dirname, 'file.txt'),
)

Configure default options

To configure default options like timeout, expect-puppeteer exposes two methods: getDefaultOptions and setDefaultOptions. You can find available options in Puppeteer page.waitForFunction documentation. Default options are set to: { timeout: 500 }.

import { setDefaultOptions } from 'expect-puppeteer'

setDefaultOptions({ timeout: 1000 })

License

MIT