README
expect-puppeteer
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> Contextselector
<string> A selector to click onoptions
<Object> Optional parametersbutton
<"left"|"right"|"middle"> Defaults toleft
.clickCount
<number> defaults to 1. See UIEvent.detail.delay
<number> Time to wait betweenmousedown
andmouseup
in milliseconds. Defaults to 0.text
<string|RegExp> A text or a RegExp to match in elementtextContent
.
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> Contextselector
<string> A selector to match fieldvalue
<string> Value to filloptions
<Object> Optional parametersdelay
<number> delay to pass to the puppeteerelement.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> Contextselector
<string> A selector to match formvalues
<Object> Values to filloptions
<Object> Optional parametersdelay
<number> delay to pass to the puppeteerelement.type
API
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> Contextmatcher
<string|RegExp> A text or a RegExp to match in pageoptions
<Object> Optional parameterspolling
<string|number> An interval at which thepageFunction
is executed, defaults toraf
. Ifpolling
is a number, then it is treated as an interval in milliseconds at which the function would be executed. Ifpolling
is a string, then it can be one of the following values:raf
- to constantly executepageFunction
inrequestAnimationFrame
callback. This is the tightest polling mode which is suitable to observe styling changes.mutation
- to executepageFunction
on every DOM mutation.
timeout
<number> maximum time to wait for in milliseconds. Defaults to30000
(30 seconds). Pass0
to disable timeout. The default value can be changed by using the page.setDefaultTimeout(timeout) method.
// 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> Contextselector
<string> A selector to match elementoptions
<Object> Optional parameterspolling
<string|number> An interval at which thepageFunction
is executed, defaults toraf
. Ifpolling
is a number, then it is treated as an interval in milliseconds at which the function would be executed. Ifpolling
is a string, then it can be one of the following values:raf
- to constantly executepageFunction
inrequestAnimationFrame
callback. This is the tightest polling mode which is suitable to observe styling changes.mutation
- to executepageFunction
on every DOM mutation.
timeout
<number> maximum time to wait for in milliseconds. Defaults to30000
(30 seconds). Pass0
to disable timeout. The default value can be changed by using the page.setDefaultTimeout(timeout) method.text
<string|RegExp> A text or a RegExp to match in elementtextContent
.visible
<boolean> wait for element to be present in DOM and to be visible, i.e. to not havedisplay: none
orvisibility: hidden
CSS properties. Defaults tofalse
.
// 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)
Expect a select control to be present in the page or element, then select the specified option.
instance
<Page|ElementHandle> Contextselector
<string> A selector to match select elementvalueOrText
<string> Value or text matching option
await expect(page).toSelect('select[name="choices"]', 'Choice 1')
expect(instance).toUploadFile(selector, filePath)
Expect a input file control to be present in the page or element, then fill it with a local file.
instance
<Page|ElementHandle> Contextselector
<string> A selector to match input elementfilePath
<string> A file path
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