-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
06273ef
commit 12edf4f
Showing
1 changed file
with
113 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
# Test Runners | ||
|
||
## Basic Setup | ||
With a few lines of code, you can hook up Playwright to your favorite JavaScript test runner. | ||
|
||
### Jest / Jasmine | ||
|
||
For Jest, [jest-playwright](https://github.com/playwright-community/jest-playwright) can be used. However for a light-weight solution, requiring playwright directly works fine. Jest shares it's syntax with Jasmine, so this applies to Jasmine as well. | ||
|
||
```js | ||
const {chromium} = require('playwright'); | ||
const expect = require('expect'); | ||
let browser; | ||
let page; | ||
beforeAll(async () => { | ||
browser = await chromium.launch(); | ||
}); | ||
afterAll(async () => { | ||
await browser.close(); | ||
}); | ||
beforeEach(async () => { | ||
page = await browser.newPage(); | ||
}); | ||
afterEach(async () => { | ||
await page.close(); | ||
}); | ||
it('should work', async () => { | ||
await page.goto('https://www.example.com/'); | ||
expect(await page.title()).toBe('Example Domain'); | ||
}); | ||
``` | ||
|
||
### AVA | ||
|
||
Tests run concurrently in AVA, so a single page variable cannot be shared between tests. Instead, create new pages with a macro function. | ||
|
||
```js | ||
const {chromium} = require('playwright'); | ||
const test = require('ava').default; | ||
const browserPromise = chromium.launch(); | ||
|
||
async function pageMacro(t, callback) { | ||
const browser = await browserPromise; | ||
const page = await browser.newPage(); | ||
try { | ||
await callback(t, page); | ||
} finally { | ||
await page.close(); | ||
} | ||
} | ||
|
||
test('should work', pageMacro, async (t, page) => { | ||
await page.goto('https://www.example.com/'); | ||
t.is(await page.title(), 'Example Domain'); | ||
}); | ||
``` | ||
|
||
### Mocha | ||
|
||
Mocha looks very similar to the Jest/Jasmine setup, and functions in the same way. | ||
|
||
```js | ||
const {chromium} = require('playwright'); | ||
const assert = require('assert'); | ||
let browser; | ||
before(async() => { | ||
browser = await chromium.launch(); | ||
}); | ||
after(async () => { | ||
await browser.close(); | ||
}); | ||
let page; | ||
beforeEach(async() => { | ||
page = await browser.newPage(); | ||
}); | ||
afterEach(async () => { | ||
await page.close(); | ||
}); | ||
it('should work', async () => { | ||
await page.goto('https://www.example.com/'); | ||
assert.equal(await page.title(), 'Example Domain'); | ||
}); | ||
``` | ||
|
||
|
||
## Types | ||
|
||
If using TypeScript, add types to your variables like: | ||
```ts | ||
let page: import('playwright').Page; | ||
``` | ||
|
||
If using JavaScript, you can still get nice autocompletions in VSCode by using JSDOC | ||
```js | ||
/** @type {import('playwright').Page} **/ | ||
let page; | ||
``` | ||
|
||
## Multiple Browsers | ||
|
||
These simple examples can be extended to support multiple browsers using an environment variable. | ||
|
||
```js | ||
const {chromium, webkit, firefox} = require('playwright'); | ||
const browserName = process.env.BROWSER || 'webkit'; | ||
let browser; | ||
beforeAll(async() => { | ||
browser = await {chromium, webkit, firefox}[browserName].launch(); | ||
}); | ||
``` | ||
|
||
Then set `BROWSER=firefox` to run your tests with firefox, or any other browser. | ||
|