SlideShare a Scribd company logo
1 of 106
Download to read offline
🎭 Playwright Test
Playful testing framework
Talk Prerequisites
https:/
/nodejs.org/ Web Platform
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
○ TypeScript support out-of-the-box
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
○ TypeScript support out-of-the-box
○ Parallel execution out-of-the-box
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
○ TypeScript support out-of-the-box
○ Parallel execution out-of-the-box
○ Cross-browser, Snapshots, Fixtures, ...
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
○ TypeScript support out-of-the-box
○ Parallel execution out-of-the-box
○ Cross-browser, Snapshots, Fixtures, …
○ Time-travel debugging 🔥
What is Playwright Test?
https:/
/github.com/microsoft/playwright
● New product from Playwright Team
● Batteries-included test framework for end-to-end testing
○ TypeScript support out-of-the-box
○ Parallel execution out-of-the-box
○ Cross-browser, Snapshots, Fixtures, …
○ Time-travel debugging 🔥
● Open Source, Free
What is Playwright Test?
https:/
/github.com/microsoft/playwright
Agenda
1. Getting Started 🚀
2. Fixtures 🦄
3. Configuration 🛠
4. Artifacts Management 💎
5. Playwright Tracing 󰨂
Act I
Getting Started
🚀 Getting Started
🦄 Fixtures
🛠 Configuration
💎 Artifacts
󰨂 Tracing
🍿 Demo: Getting Started 🍿
Installation
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
Running Test
# .github/workflows/tests.yml
on: [push]
jobs:
run_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- run: npm ci
- run: npx playwright install-deps
- run: npx playwright install
- run: npx playwright test
G
i
t
h
u
b
A
c
t
i
o
n
s
💎 Artifacts
Act II
Fixtures
🚀 Getting Started
🦄 Fixtures
🛠 Configuration
󰨂 Tracing
🎁 Treats
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
“Fixture”
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
1. Fully isolated Playwright page
“Fixture”
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page, context }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
2. Fully isolated Playwright context for multi-page tests
“Fixture”
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page, context, browserName }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
3. Browser name: ‘chromium’, ‘firefox’ or ‘webkit’
“Fixture”
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page, context, browserName, isMobile }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
4. “true” when running in mobile browser
“Fixture”
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page, context, browserName, isMobile }) => {
await page.goto('https://playwright.dev/');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
4. “true” when running in mobile browser
“Fixture”
5. channel
6. timezoneId
7. locale
8. ...
Concept: “Fixtures” 🦄
● Borrowed from PyTest
● Isolated configurable environment for each test
● Playwright Test comes with many ready-to-use fixtures
● Create your own fixtures instead of “beforeEach” / “afterEach” hooks
○ Organize tests semantically, not by environment
○ Fixtures are only initialized when required by test
○ Fixtures are ~20% less code
● Read more: https:/
/playwright.dev/docs/test-fixtures
💎 Artifacts
Act III
Configuration
🚀 Getting Started
🦄 Fixtures
🔧 Configuration
󰨂 Tracing
Configuration
1. Global configuration via configuration file
2. Granular configuration via test.use()
3. Data-driven configuration
Configuration File
● JavaScript: playwright.config.js
● TypeScript: playwright.config.ts
Configuration File
● JavaScript: playwright.config.js
● TypeScript: playwright.config.ts
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
};
export default config;
● globalSetup
● globalTeardown
● ...
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
};
export default config;
● globalSetup
● globalTeardown
● ...
T
y
p
e
S
c
r
i
p
t
First-Party:
● dot
● list
● line
● json
● junit
Third-Party:
● experimental-allure-playwright 🔥
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
};
export default config;
● globalSetup
● globalTeardown
● ...
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
}]};
export default config;
● globalSetup
● globalTeardown
● ...
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
}]};
export default config;
● globalSetup
● globalTeardown
● ...
● outputDir
● testDir
● ...
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'chromium',
},
}]};
export default config;
● globalSetup
● globalTeardown
● ...
● outputDir
● testDir
● ...
T
y
p
e
S
c
r
i
p
t
● browserName
● headless
● screenshot
● trace
● ...
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'chromium',
},
}]};
export default config;
● globalSetup
● globalTeardown
● ...
● outputDir
● testDir
● ...
● browserName
● headless
● screenshot
● trace
● ...
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'chromium',
},
}]};
export default config;
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
page; // chromium page
});
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'chromium',
},
}]};
export default config;
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
page; // chromium page
});
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'chromium',
},
}]};
export default config;
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
page; // chromium page
});
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
// 1. Runner configuration
reporter: 'list',
projects: [{
// 2. Project configuration
name: 'chromium',
retries: 0,
timeout: 30000,
// 3. Fixtures configuration
use: {
browserName: 'webkit',
},
}]};
export default config;
T
y
p
e
S
c
r
i
p
t
// test.spec.ts
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
page; // webkit page
});
● javaScriptEnabled
● launchOptions
● locale
● offline
● permissions
● proxy
● screenshot
● storageState
● timezoneId
● trace
● userAgent
● video
● viewport
● acceptDownloads
● baseURL
● browserName
● bypassCSP
● channel
● colorScheme
● deviceScaleFactor
● extraHTPHeaders
● geolocation
● hasTouch
● headless
● httpCredentials
● ignoreHTTPSErrors
Fixtures Configuration
Granular Fixtures Configuration
● Per-file configuration
● Per-suite configuration
Granular Fixtures Configuration
● Per-file configuration
● Per-suite configuration
// france.spec.ts
import { test, expect } from '@playwright/test';
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
test('should work', async ({ page }) => { /* ... test goes here ... */ });
test('should use euro', async ({ page }) => { /* ... */ });
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
test('should work', async ({ page }) => { /* ... test goes here ... */ });
test('should use euro', async ({ page }) => { /* ... */ });
test.describe('light theme', () => {
});
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
test('should work', async ({ page }) => { /* ... test goes here ... */ });
test('should use euro', async ({ page }) => { /* ... */ });
test.describe('light theme', () => {
test.use({ colorScheme: 'light' }); // per-suite configuration
});
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
test('should work', async ({ page }) => { /* ... test goes here ... */ });
test('should use euro', async ({ page }) => { /* ... */ });
test.describe('light theme', () => {
test.use({ colorScheme: 'light' }); // per-suite configuration
test('should be light', async ({ page }) => { /* ... */ });
});
T
y
p
e
S
c
r
i
p
t
// france.spec.ts
import { test, expect } from '@playwright/test';
// per-file configuration
test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' });
test('should work', async ({ page }) => { /* ... test goes here ... */ });
test('should use euro', async ({ page }) => { /* ... */ });
test.describe('light theme', () => {
test.use({ colorScheme: 'light' }); // per-suite configuration
test('should be light', async ({ page }) => { /* ... */ });
});
test.describe('dark theme', () => {
test.use({ colorScheme: 'dark' }); // per-suite configuration
test('should be dark', async ({ page }) => { /* ... */ });
});
T
y
p
e
S
c
r
i
p
t
Data-Driven Tests
Data-Driven Tests
Data-Driven Tests
// check-urls.spec.ts
import { test, expect } from '@playwright/test';
T
y
p
e
S
c
r
i
p
t
// check-urls.spec.ts
import { test, expect } from '@playwright/test';
const urls = require('./urls.json');
T
y
p
e
S
c
r
i
p
t
// check-urls.spec.ts
import { test, expect } from '@playwright/test';
const urls = require('./urls.json');
for (const url of urls) {
}
T
y
p
e
S
c
r
i
p
t
// check-urls.spec.ts
import { test, expect } from '@playwright/test';
const urls = require('./urls.json');
for (const url of urls) {
test(`check ${url}`, async ({ page }) => {
await page.goto(url);
});
}
T
y
p
e
S
c
r
i
p
t
// check-urls.spec.ts
import { test, expect } from '@playwright/test';
const urls = require('./urls.json');
for (const url of urls) {
test(`check ${url}`, async ({ page }) => {
await page.goto(url);
});
}
T
y
p
e
S
c
r
i
p
t
NOTE: Make sure to have
different test titles
🍿 Demo: iPhone 🍿
// playwright.config.ts
import { PlaywrightTestConfig, devices } from '@playwright/test';
const config : PlaywrightTestConfig = {
projects: [
{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
{
name: 'iphone',
use: { ...devices['iPhone 12 Pro'], },
},
]
};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig, devices } from '@playwright/test';
const config : PlaywrightTestConfig = {
projects: [
{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
{
name: 'iphone',
use: { ...devices['iPhone 12 Pro'], },
},
]
};
export default config;
1. Import Devices
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig, devices } from '@playwright/test';
const config : PlaywrightTestConfig = {
projects: [
{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
{
name: 'iphone',
use: { ...devices['iPhone 12 Pro'], },
},
]
};
export default config;
1. Import Devices
T
y
p
e
S
c
r
i
p
t
2. Run tests on iPhone
// test.spec.ts
import { test, expect } from '@playwright/test';
test('should work', async ({ page, isMobile }) => {
await page.goto('https://playwright.dev');
if (isMobile)
await page.click('[aria-label="Navigation bar toggle"]');
await page.click('a:visible:has-text("Docs")');
expect(page.url()).toBe('https://playwright.dev/docs/intro');
});
T
y
p
e
S
c
r
i
p
t
Launching Playwright Inspector
Playwright Inspector
Act IV
Artifacts Management
🚀 Getting Started
🦄 Fixtures
🛠 Configuration
💎 Artifacts
󰨂 Tracing
Playwright Test Artifacts 💎
Test Artifacts – any by-product of test running that helps debug test failures.
All artifacts are stored by default in test-results folder.
Playwright Test Artifacts 💎
Test Artifacts – any by-product of test running that helps debug test failures.
All artifacts are stored by default in test-results folder.
1. screenshots
Playwright Test Artifacts 💎
Test Artifacts – any by-product of test running that helps debug test failures.
All artifacts are stored by default in test-results folder.
1. screenshots 2. videos
Playwright Test Artifacts 💎
Test Artifacts – any by-product of test running that helps debug test failures.
All artifacts are stored by default in test-results folder.
1. screenshots
��♂
3. traces
2. videos
D
i
s
c
u
s
s
e
d
l
a
t
e
r
t
o
d
a
y
!
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
retries: 2,
use: {
screenshot: 'only-on-failure',
video: 'off',
trace: 'on-first-retry',
},
projects: [{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
]};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
retries: 2,
use: {
screenshot: 'only-on-failure',
video: 'off',
trace: 'on-first-retry',
},
projects: [{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
]};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
retries: 2,
use: {
screenshot: 'only-on-failure',
video: 'off',
trace: 'on-first-retry',
},
projects: [{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
]};
export default config;
T
y
p
e
S
c
r
i
p
t
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config : PlaywrightTestConfig = {
retries: 2,
use: {
screenshot: 'only-on-failure',
video: 'off',
trace: 'on-first-retry',
},
projects: [{
name: 'Desktop Chromium',
use: { browserName: 'chromium', },
},
]};
export default config;
T
y
p
e
S
c
r
i
p
t
Recommended 👍
Screenshot Artifacts
● “on” – always record screenshot after the test is finished
● “off” – never record screenshot after the test is finished
● “only-on-failure” – record screenshot after the test is failed
Screenshot Artifacts
● “on” – always record screenshot after the test is finished
● “off” – never record screenshot after the test is finished
● “only-on-failure” – record screenshot after the test is failed
Recommended 👍
Video Artifacts
● “on” – always record video of a test
● “off” – never record video of a test
● “retain-on-failure” – always record video of a test, but keep only videos of
failed test runs.
● “on-first-retry” – only record video when retrying test
Video Artifacts
● “on” – always record video of a test
● “off” – never record video of a test
● “retain-on-failure” – always record video of a test, but keep only videos of
failed test runs.
● “on-first-retry” – only record video when retrying test
Recommended 👍
Trace Artifacts
● “on” – always record trace of a test
● “off” – never record trace of a test
● “retain-on-failure” – always record trace of a test, but keep only traces of
failed test runs.
● “on-first-retry” – only record trace when retrying test
��
Trace Artifacts
● “on” – always record trace of a test
● “off” – never record trace of a test
● “retain-on-failure” – always record trace of a test, but keep only traces of
failed test runs.
● “on-first-retry” – only record trace when retrying test
��
Recommended 👍
# .github/workflows/tests.yml
on: [push]
jobs:
run_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- run: npm ci
- run: npx playwright install-deps
- run: npx playwright install
- run: npx playwright test
G
i
t
h
u
b
A
c
t
i
o
n
s
# .github/workflows/tests.yml
on: [push]
jobs:
run_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- run: npm ci
- run: npx playwright install-deps
- run: npx playwright install
- run: npx playwright test
- uses: actions/upload-artifact@v1
if: always()
with:
name: test-results
path: test-results
G
i
t
h
u
b
A
c
t
i
o
n
s
Uploading Artifacts
Act V
Playwright Tracing
🚀 Getting Started
🦄 Fixtures
🛠 Configuration
💎 Artifacts
󰨂 Tracing
Playwright Tracing
● Playwright actions
● Playwright events
● DOM snapshots 🔥
● Screenshots
● Network log
● Console log
Playwright Tracing
trace.zip files
● Playwright actions
● Playwright events
● DOM snapshots 🔥
● Screenshots
● Network log
● Console log
Playwright Tracing
● GUI tool to explore trace
files
● Bundled with Playwright
trace.zip files Trace Viewer
● Playwright actions
● Playwright events
● DOM snapshots 🔥
● Screenshots
● Network log
● Console log
Playwright Tracing
● GUI tool to explore trace
files
● Bundled with Playwright
trace.zip files Trace Viewer
Time Travel Debugging
🍿 Demo: Trace Viewer 🍿
Opening Playwright Trace
Timeline
Actions
Details
DOM Snapshot 🔥
🍿 Demo: Post-mortem 🍿
Demo Recap
● “Right click → Inspect” to open DevTools on DOM Snapshot
Demo Recap
Demo Recap
● “Right click → Inspect” to open DevTools on DOM Snapshot
● “playwright.selector($0)” in DevTools console to generate selector
Conclusion?
🚀 Getting Started
🦄 Fixtures
🛠 Configuration
💎 Artifacts
󰨂 Tracing
Web Testing
can be
Fun
Andrey Lushnikov
@playwrightweb
Q
u
e
s
t
i
o
n
s
?
Playwright Test
https:/
/aka.ms/playwright-slack
microsoft/playwright
@aslushnikov
aslushnikov@gmail.com
Introducing Playwright's New Test Runner

More Related Content

What's hot

Cypress - Best Practices
Cypress - Best PracticesCypress - Best Practices
Cypress - Best PracticesBrian Mann
 
Getting Started With Cypress
Getting Started With CypressGetting Started With Cypress
Getting Started With CypressKnoldus Inc.
 
Setting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation FrameworkSetting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation Frameworkvaluebound
 
Introduction cypress
Introduction cypressIntroduction cypress
Introduction cypressOim Trust
 
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!Applitools
 
Cypress e2e automation testing - day1 intor by: Hassan Hameed
Cypress e2e automation testing -  day1 intor by: Hassan HameedCypress e2e automation testing -  day1 intor by: Hassan Hameed
Cypress e2e automation testing - day1 intor by: Hassan HameedHassan Muhammad
 
e2e testing with cypress
e2e testing with cypresse2e testing with cypress
e2e testing with cypressTomasz Bak
 
Cypress first impressions
Cypress first impressionsCypress first impressions
Cypress first impressionsHans Emmel
 
Prometheus design and philosophy
Prometheus design and philosophy   Prometheus design and philosophy
Prometheus design and philosophy Docker, Inc.
 
Automated testing with Cypress
Automated testing with CypressAutomated testing with Cypress
Automated testing with CypressYong Shean Chong
 
Test-Driven Development in Vue with Cypress
Test-Driven Development in Vue with CypressTest-Driven Development in Vue with Cypress
Test-Driven Development in Vue with CypressJosh Justice
 
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...Amazon Web Services
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java Ahmed HARRAK
 

What's hot (20)

Cypress - Best Practices
Cypress - Best PracticesCypress - Best Practices
Cypress - Best Practices
 
Getting Started With Cypress
Getting Started With CypressGetting Started With Cypress
Getting Started With Cypress
 
Setting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation FrameworkSetting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation Framework
 
Introduction cypress
Introduction cypressIntroduction cypress
Introduction cypress
 
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!
Cypress, Playwright, Selenium, or WebdriverIO? Let the Engineers Speak!
 
Cypress e2e automation testing - day1 intor by: Hassan Hameed
Cypress e2e automation testing -  day1 intor by: Hassan HameedCypress e2e automation testing -  day1 intor by: Hassan Hameed
Cypress e2e automation testing - day1 intor by: Hassan Hameed
 
End to end test automation with cypress
End to end test automation with cypressEnd to end test automation with cypress
End to end test automation with cypress
 
e2e testing with cypress
e2e testing with cypresse2e testing with cypress
e2e testing with cypress
 
Cypress first impressions
Cypress first impressionsCypress first impressions
Cypress first impressions
 
Cypress testing
Cypress testingCypress testing
Cypress testing
 
Prometheus design and philosophy
Prometheus design and philosophy   Prometheus design and philosophy
Prometheus design and philosophy
 
BDD with Cucumber
BDD with CucumberBDD with Cucumber
BDD with Cucumber
 
Automated testing with Cypress
Automated testing with CypressAutomated testing with Cypress
Automated testing with Cypress
 
Cypress Automation
Cypress  AutomationCypress  Automation
Cypress Automation
 
Test-Driven Development in Vue with Cypress
Test-Driven Development in Vue with CypressTest-Driven Development in Vue with Cypress
Test-Driven Development in Vue with Cypress
 
Component testing with cypress
Component testing with cypressComponent testing with cypress
Component testing with cypress
 
Cucumber & gherkin language
Cucumber & gherkin languageCucumber & gherkin language
Cucumber & gherkin language
 
React Native
React NativeReact Native
React Native
 
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...
CI/CD Best Practices for Building Modern Applications - MAD302 - Anaheim AWS ...
 
Selenium WebDriver avec Java
Selenium WebDriver avec Java Selenium WebDriver avec Java
Selenium WebDriver avec Java
 

Similar to Introducing Playwright's New Test Runner

React starter-kitでとっとと始めるisomorphic開発
React starter-kitでとっとと始めるisomorphic開発React starter-kitでとっとと始めるisomorphic開発
React starter-kitでとっとと始めるisomorphic開発Yoichi Toyota
 
Monitoring Kafka w/ Prometheus
Monitoring Kafka w/ PrometheusMonitoring Kafka w/ Prometheus
Monitoring Kafka w/ Prometheuskawamuray
 
Testing of javacript
Testing of javacriptTesting of javacript
Testing of javacriptLei Kang
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extremeyinonavraham
 
Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernelJohnson Chou
 
Spark summit2014 techtalk - testing spark
Spark summit2014 techtalk - testing sparkSpark summit2014 techtalk - testing spark
Spark summit2014 techtalk - testing sparkAnu Shetty
 
Grunt & Front-end Workflow
Grunt & Front-end WorkflowGrunt & Front-end Workflow
Grunt & Front-end WorkflowPagepro
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017MarcinStachniuk
 
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰KAI CHU CHUNG
 
RichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile DevicesRichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile DevicesPavol Pitoňák
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Plone deployment made easy
Plone deployment made easyPlone deployment made easy
Plone deployment made easyKim Chee Leong
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorRaphaël PINSON
 
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Puppet
 
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017Ortus Solutions, Corp
 
Protractor framework architecture with example
Protractor framework architecture with exampleProtractor framework architecture with example
Protractor framework architecture with exampleshadabgilani
 
Testing Django APIs
Testing Django APIsTesting Django APIs
Testing Django APIstyomo4ka
 

Similar to Introducing Playwright's New Test Runner (20)

React starter-kitでとっとと始めるisomorphic開発
React starter-kitでとっとと始めるisomorphic開発React starter-kitでとっとと始めるisomorphic開発
React starter-kitでとっとと始めるisomorphic開発
 
Monitoring Kafka w/ Prometheus
Monitoring Kafka w/ PrometheusMonitoring Kafka w/ Prometheus
Monitoring Kafka w/ Prometheus
 
Testing of javacript
Testing of javacriptTesting of javacript
Testing of javacript
 
Taking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the ExtremeTaking Jenkins Pipeline to the Extreme
Taking Jenkins Pipeline to the Extreme
 
Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernel
 
Spark summit2014 techtalk - testing spark
Spark summit2014 techtalk - testing sparkSpark summit2014 techtalk - testing spark
Spark summit2014 techtalk - testing spark
 
Grunt & Front-end Workflow
Grunt & Front-end WorkflowGrunt & Front-end Workflow
Grunt & Front-end Workflow
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
 
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
 
RichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile DevicesRichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile Devices
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Plone deployment made easy
Plone deployment made easyPlone deployment made easy
Plone deployment made easy
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and Mspectator
 
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
 
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
 
Protractor framework architecture with example
Protractor framework architecture with exampleProtractor framework architecture with example
Protractor framework architecture with example
 
Testing Django APIs
Testing Django APIsTesting Django APIs
Testing Django APIs
 
Kubernetes debug like a pro
Kubernetes debug like a proKubernetes debug like a pro
Kubernetes debug like a pro
 
Taming AEM deployments
Taming AEM deploymentsTaming AEM deployments
Taming AEM deployments
 
Front-end tools
Front-end toolsFront-end tools
Front-end tools
 

More from Applitools

Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...Applitools
 
Visual AI for eCommerce: Improving Conversions with a Flawless UI
Visual AI for eCommerce: Improving Conversions with a Flawless UIVisual AI for eCommerce: Improving Conversions with a Flawless UI
Visual AI for eCommerce: Improving Conversions with a Flawless UIApplitools
 
A Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the FutureA Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the FutureApplitools
 
Add AI to Your SDLC, presented by Applitools and Curiosity
Add AI to Your SDLC, presented by Applitools and CuriosityAdd AI to Your SDLC, presented by Applitools and Curiosity
Add AI to Your SDLC, presented by Applitools and CuriosityApplitools
 
The Future of AI-Based Test Automation
The Future of AI-Based Test AutomationThe Future of AI-Based Test Automation
The Future of AI-Based Test AutomationApplitools
 
Test Automation at Scale: Lessons from Top-Performing Distributed Teams
Test Automation at Scale: Lessons from Top-Performing Distributed TeamsTest Automation at Scale: Lessons from Top-Performing Distributed Teams
Test Automation at Scale: Lessons from Top-Performing Distributed TeamsApplitools
 
Can AI Autogenerate and Run Automated Tests?
Can AI Autogenerate and Run Automated Tests?Can AI Autogenerate and Run Automated Tests?
Can AI Autogenerate and Run Automated Tests?Applitools
 
Triple Assurance: AI-Powered Test Automation in UI Design and Functionality
Triple Assurance: AI-Powered Test Automation in UI Design and FunctionalityTriple Assurance: AI-Powered Test Automation in UI Design and Functionality
Triple Assurance: AI-Powered Test Automation in UI Design and FunctionalityApplitools
 
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing Teams
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing TeamsNavigating the Challenges of Testing at Scale: Lessons from Top-Performing Teams
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing TeamsApplitools
 
Introducing the Applitools Self Healing Execution Cloud.pdf
Introducing the Applitools Self Healing Execution Cloud.pdfIntroducing the Applitools Self Healing Execution Cloud.pdf
Introducing the Applitools Self Healing Execution Cloud.pdfApplitools
 
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...Applitools
 
Collaborating From Design To Experience: Introducing Centra
Collaborating From Design To Experience: Introducing CentraCollaborating From Design To Experience: Introducing Centra
Collaborating From Design To Experience: Introducing CentraApplitools
 
What the QA Position Will Look Like in the Future
What the QA Position Will Look Like in the FutureWhat the QA Position Will Look Like in the Future
What the QA Position Will Look Like in the FutureApplitools
 
Getting Started with Visual Testing
Getting Started with Visual TestingGetting Started with Visual Testing
Getting Started with Visual TestingApplitools
 
Workshop: Head-to-Head Web Testing: Part 1 with Cypress
Workshop: Head-to-Head Web Testing: Part 1 with CypressWorkshop: Head-to-Head Web Testing: Part 1 with Cypress
Workshop: Head-to-Head Web Testing: Part 1 with CypressApplitools
 
From Washing Cars To Automating Test Applications
From Washing Cars To Automating Test ApplicationsFrom Washing Cars To Automating Test Applications
From Washing Cars To Automating Test ApplicationsApplitools
 
A Holistic Approach to Testing in Continuous Delivery
A Holistic Approach to Testing in Continuous DeliveryA Holistic Approach to Testing in Continuous Delivery
A Holistic Approach to Testing in Continuous DeliveryApplitools
 
AI-Powered-Cross-Browser Testing
AI-Powered-Cross-Browser TestingAI-Powered-Cross-Browser Testing
AI-Powered-Cross-Browser TestingApplitools
 
Workshop: An Introduction to API Automation with Javascript
Workshop: An Introduction to API Automation with JavascriptWorkshop: An Introduction to API Automation with Javascript
Workshop: An Introduction to API Automation with JavascriptApplitools
 

More from Applitools (20)

Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...
Streamlining Your Tech Stack: A Blueprint for Enhanced Efficiency and Coverag...
 
Visual AI for eCommerce: Improving Conversions with a Flawless UI
Visual AI for eCommerce: Improving Conversions with a Flawless UIVisual AI for eCommerce: Improving Conversions with a Flawless UI
Visual AI for eCommerce: Improving Conversions with a Flawless UI
 
A Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the FutureA Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the Future
 
Add AI to Your SDLC, presented by Applitools and Curiosity
Add AI to Your SDLC, presented by Applitools and CuriosityAdd AI to Your SDLC, presented by Applitools and Curiosity
Add AI to Your SDLC, presented by Applitools and Curiosity
 
The Future of AI-Based Test Automation
The Future of AI-Based Test AutomationThe Future of AI-Based Test Automation
The Future of AI-Based Test Automation
 
Test Automation at Scale: Lessons from Top-Performing Distributed Teams
Test Automation at Scale: Lessons from Top-Performing Distributed TeamsTest Automation at Scale: Lessons from Top-Performing Distributed Teams
Test Automation at Scale: Lessons from Top-Performing Distributed Teams
 
Can AI Autogenerate and Run Automated Tests?
Can AI Autogenerate and Run Automated Tests?Can AI Autogenerate and Run Automated Tests?
Can AI Autogenerate and Run Automated Tests?
 
Triple Assurance: AI-Powered Test Automation in UI Design and Functionality
Triple Assurance: AI-Powered Test Automation in UI Design and FunctionalityTriple Assurance: AI-Powered Test Automation in UI Design and Functionality
Triple Assurance: AI-Powered Test Automation in UI Design and Functionality
 
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing Teams
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing TeamsNavigating the Challenges of Testing at Scale: Lessons from Top-Performing Teams
Navigating the Challenges of Testing at Scale: Lessons from Top-Performing Teams
 
Introducing the Applitools Self Healing Execution Cloud.pdf
Introducing the Applitools Self Healing Execution Cloud.pdfIntroducing the Applitools Self Healing Execution Cloud.pdf
Introducing the Applitools Self Healing Execution Cloud.pdf
 
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...
 
Collaborating From Design To Experience: Introducing Centra
Collaborating From Design To Experience: Introducing CentraCollaborating From Design To Experience: Introducing Centra
Collaborating From Design To Experience: Introducing Centra
 
What the QA Position Will Look Like in the Future
What the QA Position Will Look Like in the FutureWhat the QA Position Will Look Like in the Future
What the QA Position Will Look Like in the Future
 
Getting Started with Visual Testing
Getting Started with Visual TestingGetting Started with Visual Testing
Getting Started with Visual Testing
 
Workshop: Head-to-Head Web Testing: Part 1 with Cypress
Workshop: Head-to-Head Web Testing: Part 1 with CypressWorkshop: Head-to-Head Web Testing: Part 1 with Cypress
Workshop: Head-to-Head Web Testing: Part 1 with Cypress
 
From Washing Cars To Automating Test Applications
From Washing Cars To Automating Test ApplicationsFrom Washing Cars To Automating Test Applications
From Washing Cars To Automating Test Applications
 
A Holistic Approach to Testing in Continuous Delivery
A Holistic Approach to Testing in Continuous DeliveryA Holistic Approach to Testing in Continuous Delivery
A Holistic Approach to Testing in Continuous Delivery
 
AI-Powered-Cross-Browser Testing
AI-Powered-Cross-Browser TestingAI-Powered-Cross-Browser Testing
AI-Powered-Cross-Browser Testing
 
Workshop: An Introduction to API Automation with Javascript
Workshop: An Introduction to API Automation with JavascriptWorkshop: An Introduction to API Automation with Javascript
Workshop: An Introduction to API Automation with Javascript
 

Recently uploaded

WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfAzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfryanfarris8
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
WSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million PeopleWSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million PeopleWSO2
 
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2
 

Recently uploaded (20)

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfAzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million PeopleWSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million People
 
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in Uganda
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 

Introducing Playwright's New Test Runner

  • 1. 🎭 Playwright Test Playful testing framework
  • 3. What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 4. ● New product from Playwright Team What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 5. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 6. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing ○ TypeScript support out-of-the-box What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 7. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing ○ TypeScript support out-of-the-box ○ Parallel execution out-of-the-box What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 8. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing ○ TypeScript support out-of-the-box ○ Parallel execution out-of-the-box ○ Cross-browser, Snapshots, Fixtures, ... What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 9. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing ○ TypeScript support out-of-the-box ○ Parallel execution out-of-the-box ○ Cross-browser, Snapshots, Fixtures, … ○ Time-travel debugging 🔥 What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 10. ● New product from Playwright Team ● Batteries-included test framework for end-to-end testing ○ TypeScript support out-of-the-box ○ Parallel execution out-of-the-box ○ Cross-browser, Snapshots, Fixtures, … ○ Time-travel debugging 🔥 ● Open Source, Free What is Playwright Test? https:/ /github.com/microsoft/playwright
  • 11. Agenda 1. Getting Started 🚀 2. Fixtures 🦄 3. Configuration 🛠 4. Artifacts Management 💎 5. Playwright Tracing 󰨂
  • 12. Act I Getting Started 🚀 Getting Started 🦄 Fixtures 🛠 Configuration 💎 Artifacts 󰨂 Tracing
  • 13. 🍿 Demo: Getting Started 🍿
  • 15. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t
  • 17. # .github/workflows/tests.yml on: [push] jobs: run_tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 - run: npm ci - run: npx playwright install-deps - run: npx playwright install - run: npx playwright test G i t h u b A c t i o n s
  • 18.
  • 19.
  • 20. 💎 Artifacts Act II Fixtures 🚀 Getting Started 🦄 Fixtures 🛠 Configuration 󰨂 Tracing 🎁 Treats
  • 21. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t
  • 22. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t
  • 23. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t “Fixture”
  • 24. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t 1. Fully isolated Playwright page “Fixture”
  • 25. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page, context }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t 2. Fully isolated Playwright context for multi-page tests “Fixture”
  • 26. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page, context, browserName }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t 3. Browser name: ‘chromium’, ‘firefox’ or ‘webkit’ “Fixture”
  • 27. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page, context, browserName, isMobile }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t 4. “true” when running in mobile browser “Fixture”
  • 28. // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page, context, browserName, isMobile }) => { await page.goto('https://playwright.dev/'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t 4. “true” when running in mobile browser “Fixture” 5. channel 6. timezoneId 7. locale 8. ...
  • 29. Concept: “Fixtures” 🦄 ● Borrowed from PyTest ● Isolated configurable environment for each test ● Playwright Test comes with many ready-to-use fixtures ● Create your own fixtures instead of “beforeEach” / “afterEach” hooks ○ Organize tests semantically, not by environment ○ Fixtures are only initialized when required by test ○ Fixtures are ~20% less code ● Read more: https:/ /playwright.dev/docs/test-fixtures
  • 30. 💎 Artifacts Act III Configuration 🚀 Getting Started 🦄 Fixtures 🔧 Configuration 󰨂 Tracing
  • 31. Configuration 1. Global configuration via configuration file 2. Granular configuration via test.use() 3. Data-driven configuration
  • 32. Configuration File ● JavaScript: playwright.config.js ● TypeScript: playwright.config.ts
  • 33. Configuration File ● JavaScript: playwright.config.js ● TypeScript: playwright.config.ts
  • 34. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { }; export default config; T y p e S c r i p t
  • 35. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { }; export default config; T y p e S c r i p t
  • 36. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { }; export default config; T y p e S c r i p t
  • 37. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { }; export default config; T y p e S c r i p t
  • 38. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', }; export default config; ● globalSetup ● globalTeardown ● ... T y p e S c r i p t
  • 39. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', }; export default config; ● globalSetup ● globalTeardown ● ... T y p e S c r i p t First-Party: ● dot ● list ● line ● json ● junit Third-Party: ● experimental-allure-playwright 🔥
  • 40. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', }; export default config; ● globalSetup ● globalTeardown ● ... T y p e S c r i p t
  • 41. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ }]}; export default config; ● globalSetup ● globalTeardown ● ... T y p e S c r i p t
  • 42. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, }]}; export default config; ● globalSetup ● globalTeardown ● ... ● outputDir ● testDir ● ... T y p e S c r i p t
  • 43. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'chromium', }, }]}; export default config; ● globalSetup ● globalTeardown ● ... ● outputDir ● testDir ● ... T y p e S c r i p t ● browserName ● headless ● screenshot ● trace ● ...
  • 44. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'chromium', }, }]}; export default config; ● globalSetup ● globalTeardown ● ... ● outputDir ● testDir ● ... ● browserName ● headless ● screenshot ● trace ● ... T y p e S c r i p t
  • 45. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'chromium', }, }]}; export default config; T y p e S c r i p t // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { page; // chromium page });
  • 46. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'chromium', }, }]}; export default config; T y p e S c r i p t // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { page; // chromium page });
  • 47. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'chromium', }, }]}; export default config; T y p e S c r i p t // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { page; // chromium page });
  • 48. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { // 1. Runner configuration reporter: 'list', projects: [{ // 2. Project configuration name: 'chromium', retries: 0, timeout: 30000, // 3. Fixtures configuration use: { browserName: 'webkit', }, }]}; export default config; T y p e S c r i p t // test.spec.ts import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { page; // webkit page });
  • 49. ● javaScriptEnabled ● launchOptions ● locale ● offline ● permissions ● proxy ● screenshot ● storageState ● timezoneId ● trace ● userAgent ● video ● viewport ● acceptDownloads ● baseURL ● browserName ● bypassCSP ● channel ● colorScheme ● deviceScaleFactor ● extraHTPHeaders ● geolocation ● hasTouch ● headless ● httpCredentials ● ignoreHTTPSErrors Fixtures Configuration
  • 50. Granular Fixtures Configuration ● Per-file configuration ● Per-suite configuration
  • 51. Granular Fixtures Configuration ● Per-file configuration ● Per-suite configuration
  • 52. // france.spec.ts import { test, expect } from '@playwright/test'; T y p e S c r i p t
  • 53. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); T y p e S c r i p t
  • 54. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); test('should work', async ({ page }) => { /* ... test goes here ... */ }); test('should use euro', async ({ page }) => { /* ... */ }); T y p e S c r i p t
  • 55. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); test('should work', async ({ page }) => { /* ... test goes here ... */ }); test('should use euro', async ({ page }) => { /* ... */ }); test.describe('light theme', () => { }); T y p e S c r i p t
  • 56. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); test('should work', async ({ page }) => { /* ... test goes here ... */ }); test('should use euro', async ({ page }) => { /* ... */ }); test.describe('light theme', () => { test.use({ colorScheme: 'light' }); // per-suite configuration }); T y p e S c r i p t
  • 57. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); test('should work', async ({ page }) => { /* ... test goes here ... */ }); test('should use euro', async ({ page }) => { /* ... */ }); test.describe('light theme', () => { test.use({ colorScheme: 'light' }); // per-suite configuration test('should be light', async ({ page }) => { /* ... */ }); }); T y p e S c r i p t
  • 58. // france.spec.ts import { test, expect } from '@playwright/test'; // per-file configuration test.use({ locale: 'fr-FR', timezoneId: 'Europe/Paris' }); test('should work', async ({ page }) => { /* ... test goes here ... */ }); test('should use euro', async ({ page }) => { /* ... */ }); test.describe('light theme', () => { test.use({ colorScheme: 'light' }); // per-suite configuration test('should be light', async ({ page }) => { /* ... */ }); }); test.describe('dark theme', () => { test.use({ colorScheme: 'dark' }); // per-suite configuration test('should be dark', async ({ page }) => { /* ... */ }); }); T y p e S c r i p t
  • 62. // check-urls.spec.ts import { test, expect } from '@playwright/test'; T y p e S c r i p t
  • 63. // check-urls.spec.ts import { test, expect } from '@playwright/test'; const urls = require('./urls.json'); T y p e S c r i p t
  • 64. // check-urls.spec.ts import { test, expect } from '@playwright/test'; const urls = require('./urls.json'); for (const url of urls) { } T y p e S c r i p t
  • 65. // check-urls.spec.ts import { test, expect } from '@playwright/test'; const urls = require('./urls.json'); for (const url of urls) { test(`check ${url}`, async ({ page }) => { await page.goto(url); }); } T y p e S c r i p t
  • 66. // check-urls.spec.ts import { test, expect } from '@playwright/test'; const urls = require('./urls.json'); for (const url of urls) { test(`check ${url}`, async ({ page }) => { await page.goto(url); }); } T y p e S c r i p t NOTE: Make sure to have different test titles
  • 68. // playwright.config.ts import { PlaywrightTestConfig, devices } from '@playwright/test'; const config : PlaywrightTestConfig = { projects: [ { name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, { name: 'iphone', use: { ...devices['iPhone 12 Pro'], }, }, ] }; export default config; T y p e S c r i p t
  • 69. // playwright.config.ts import { PlaywrightTestConfig, devices } from '@playwright/test'; const config : PlaywrightTestConfig = { projects: [ { name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, { name: 'iphone', use: { ...devices['iPhone 12 Pro'], }, }, ] }; export default config; 1. Import Devices T y p e S c r i p t
  • 70. // playwright.config.ts import { PlaywrightTestConfig, devices } from '@playwright/test'; const config : PlaywrightTestConfig = { projects: [ { name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, { name: 'iphone', use: { ...devices['iPhone 12 Pro'], }, }, ] }; export default config; 1. Import Devices T y p e S c r i p t 2. Run tests on iPhone
  • 71. // test.spec.ts import { test, expect } from '@playwright/test'; test('should work', async ({ page, isMobile }) => { await page.goto('https://playwright.dev'); if (isMobile) await page.click('[aria-label="Navigation bar toggle"]'); await page.click('a:visible:has-text("Docs")'); expect(page.url()).toBe('https://playwright.dev/docs/intro'); }); T y p e S c r i p t
  • 74. Act IV Artifacts Management 🚀 Getting Started 🦄 Fixtures 🛠 Configuration 💎 Artifacts 󰨂 Tracing
  • 75. Playwright Test Artifacts 💎 Test Artifacts – any by-product of test running that helps debug test failures. All artifacts are stored by default in test-results folder.
  • 76. Playwright Test Artifacts 💎 Test Artifacts – any by-product of test running that helps debug test failures. All artifacts are stored by default in test-results folder. 1. screenshots
  • 77. Playwright Test Artifacts 💎 Test Artifacts – any by-product of test running that helps debug test failures. All artifacts are stored by default in test-results folder. 1. screenshots 2. videos
  • 78. Playwright Test Artifacts 💎 Test Artifacts – any by-product of test running that helps debug test failures. All artifacts are stored by default in test-results folder. 1. screenshots ��♂ 3. traces 2. videos D i s c u s s e d l a t e r t o d a y !
  • 79. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { retries: 2, use: { screenshot: 'only-on-failure', video: 'off', trace: 'on-first-retry', }, projects: [{ name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, ]}; export default config; T y p e S c r i p t
  • 80. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { retries: 2, use: { screenshot: 'only-on-failure', video: 'off', trace: 'on-first-retry', }, projects: [{ name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, ]}; export default config; T y p e S c r i p t
  • 81. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { retries: 2, use: { screenshot: 'only-on-failure', video: 'off', trace: 'on-first-retry', }, projects: [{ name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, ]}; export default config; T y p e S c r i p t
  • 82. // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config : PlaywrightTestConfig = { retries: 2, use: { screenshot: 'only-on-failure', video: 'off', trace: 'on-first-retry', }, projects: [{ name: 'Desktop Chromium', use: { browserName: 'chromium', }, }, ]}; export default config; T y p e S c r i p t Recommended 👍
  • 83. Screenshot Artifacts ● “on” – always record screenshot after the test is finished ● “off” – never record screenshot after the test is finished ● “only-on-failure” – record screenshot after the test is failed
  • 84. Screenshot Artifacts ● “on” – always record screenshot after the test is finished ● “off” – never record screenshot after the test is finished ● “only-on-failure” – record screenshot after the test is failed Recommended 👍
  • 85. Video Artifacts ● “on” – always record video of a test ● “off” – never record video of a test ● “retain-on-failure” – always record video of a test, but keep only videos of failed test runs. ● “on-first-retry” – only record video when retrying test
  • 86. Video Artifacts ● “on” – always record video of a test ● “off” – never record video of a test ● “retain-on-failure” – always record video of a test, but keep only videos of failed test runs. ● “on-first-retry” – only record video when retrying test Recommended 👍
  • 87. Trace Artifacts ● “on” – always record trace of a test ● “off” – never record trace of a test ● “retain-on-failure” – always record trace of a test, but keep only traces of failed test runs. ● “on-first-retry” – only record trace when retrying test ��
  • 88. Trace Artifacts ● “on” – always record trace of a test ● “off” – never record trace of a test ● “retain-on-failure” – always record trace of a test, but keep only traces of failed test runs. ● “on-first-retry” – only record trace when retrying test �� Recommended 👍
  • 89. # .github/workflows/tests.yml on: [push] jobs: run_tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 - run: npm ci - run: npx playwright install-deps - run: npx playwright install - run: npx playwright test G i t h u b A c t i o n s
  • 90. # .github/workflows/tests.yml on: [push] jobs: run_tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 - run: npm ci - run: npx playwright install-deps - run: npx playwright install - run: npx playwright test - uses: actions/upload-artifact@v1 if: always() with: name: test-results path: test-results G i t h u b A c t i o n s Uploading Artifacts
  • 91. Act V Playwright Tracing 🚀 Getting Started 🦄 Fixtures 🛠 Configuration 💎 Artifacts 󰨂 Tracing
  • 93. ● Playwright actions ● Playwright events ● DOM snapshots 🔥 ● Screenshots ● Network log ● Console log Playwright Tracing trace.zip files
  • 94. ● Playwright actions ● Playwright events ● DOM snapshots 🔥 ● Screenshots ● Network log ● Console log Playwright Tracing ● GUI tool to explore trace files ● Bundled with Playwright trace.zip files Trace Viewer
  • 95. ● Playwright actions ● Playwright events ● DOM snapshots 🔥 ● Screenshots ● Network log ● Console log Playwright Tracing ● GUI tool to explore trace files ● Bundled with Playwright trace.zip files Trace Viewer Time Travel Debugging
  • 96. 🍿 Demo: Trace Viewer 🍿
  • 101. ● “Right click → Inspect” to open DevTools on DOM Snapshot Demo Recap
  • 102. Demo Recap ● “Right click → Inspect” to open DevTools on DOM Snapshot ● “playwright.selector($0)” in DevTools console to generate selector
  • 103. Conclusion? 🚀 Getting Started 🦄 Fixtures 🛠 Configuration 💎 Artifacts 󰨂 Tracing