@quickpickle/playwright 0.9.6 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # @quickpickle/playwright
2
+
3
+ @quickpickle/playwright is an extension for [QuickPickle] that integrates [Playwright]
4
+ for end-to-end testing of web applications in a full browser context.
5
+
6
+ ## Features
7
+
8
+ * A custom world constructor with a configurable browser
9
+ * Pre-defined step definitions for common browser actions and assertions
10
+ * Support for easy visual regression testing
11
+ * Support for multiple browsers (Chromium, Firefox, WebKit)
12
+ * Configuration options for the browser and the test runner
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install --save-dev quickpickle @quickpickle/playwright
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### Setup quickpickle with Vitest
23
+
24
+ First set up vitest to recognize your features and setup files. This is the example
25
+ from the [quickpickle] documentation:
26
+
27
+ ```ts
28
+ // vite.config.ts
29
+ import { quickpickle } from 'quickpickle';
30
+
31
+ export default {
32
+ plugins: [
33
+ quickpickle() // <-- Add the quickpickle plugin
34
+ ],
35
+ test: {
36
+ include : [
37
+ 'features/*.feature', // <-- Add Gherkin feature files into "test" configuration
38
+ // (you'll probably want other test files too, for unit tests etc.)
39
+ ],
40
+ setupFiles: ['./tests/tests.steps.ts'] // <-- specify each setupfile here
41
+ },
42
+ };
43
+ ```
44
+
45
+ ### Using the default PlaywrightWorld constructor
46
+
47
+ To use the default PlaywrightWorld constructor, import `@quickpickle/playwright/world`
48
+ in one of your setup files:
49
+
50
+ ```ts
51
+ // tests/tests.steps.ts
52
+ import '@quickpickle/playwright/world'
53
+ ```
54
+
55
+ ### Using the provided step definitions
56
+
57
+ @quickpickle/playwright provides a wide range of step definitions for common actions and assertions
58
+ related to UI testing in a browser context. These step definitions are available in the following
59
+ files, which can also be imported in your setup files:
60
+
61
+ ```ts
62
+ // tests/tests.steps.ts
63
+ import '@quickpickle/playwright/actions'
64
+ import '@quickpickle/playwright/outcomes'
65
+ ```
66
+
67
+ Note that these step definitions are NOT STABLE, and this is the primary reason this package
68
+ has not achieved a full release. What we want is to define a set of step definitions that can
69
+ be used across all projects for UI testing, and we're probably not really close.
70
+
71
+ ### Extending the PlaywrightWorld constructor
72
+
73
+ You can extend the PlaywrightWorld constructor to meet your own environmental requirements:
74
+
75
+ ```ts
76
+ import { PlaywrightWorld, PlaywrightWorldConfig } from '@quickpickle/playwright';
77
+ import type { TestContext } from 'vitest';
78
+ import type { QuickPickleWorldInterface } from 'quickpickle';
79
+
80
+ export class CustomPlaywrightWorld extends PlaywrightWorld {
81
+ customProperty: string;
82
+
83
+ constructor(context: TestContext, info: QuickPickleWorldInterface['info'], worldConfig: Partial<PlaywrightWorldConfig> = {}) {
84
+ super(context, info, worldConfig);
85
+ this.customProperty = 'Custom value';
86
+ }
87
+
88
+ async init() {
89
+ await super.init();
90
+ // Add custom initialization logic here
91
+ console.log('Custom world initialized');
92
+ }
93
+
94
+ customMethod() {
95
+ console.log(`Custom method called with ${this.customProperty}`);
96
+ }
97
+ }
98
+
99
+ // Don't forget to set the world constructor
100
+ import { setWorldConstructor } from 'quickpickle';
101
+ setWorldConstructor(CustomPlaywrightWorld);
102
+ ```
103
+
104
+ ### Configuring the PlaywrightWorld constructor
105
+
106
+ The PlaywrightWorld constructor can be configured by passing an object to the quickpickle
107
+ Vite plugin builder, or by passing a quickpickle configuration object to the "test" object.
108
+ Both of these are demonstrated in the file below, but only one is needed:
109
+
110
+ ```ts
111
+ // vite.config.ts
112
+ import { quickpickle } from 'quickpickle';
113
+
114
+ export default {
115
+ plugins: [
116
+ quickpickle({ // <-- add the quickpickle plugin
117
+
118
+ // General quickpickle configuration
119
+ explodeTags: [
120
+ ['nojs','js'],
121
+ ['chromium','firefox','webkit'],
122
+ ['mobile','tablet','desktop','widescreen'],
123
+ ],
124
+
125
+ // PlaywrightWorld configuration
126
+ worldConfig: {
127
+ port: 5173, // sets the port
128
+ slowMo: 50, // turns on "slowMo" for 50ms
129
+ }
130
+
131
+ })
132
+ ],
133
+ test: {
134
+ include : [
135
+ 'features/*.feature',
136
+ ],
137
+ setupFiles: ['./tests/tests.steps.ts'],
138
+ quickpickle: {
139
+
140
+ // General quickpickle configuration
141
+ explodeTags: [
142
+ ['nojs','js'],
143
+ ['chromium','firefox','webkit'],
144
+ ['mobile','tablet','desktop','widescreen'],
145
+ ],
146
+
147
+ // PlaywrightWorld configuration
148
+ worldConfig: {
149
+ port: 5173, // sets the port
150
+ slowMo: 50, // turns on "slowMo" for 50ms
151
+ }
152
+
153
+ }
154
+ },
155
+ ```
156
+
157
+ The full list of options, with defaults, is here:
158
+
159
+ ```ts
160
+ export type PlaywrightWorldConfigSetting = Partial<{
161
+ host: string, // default host, including protocol (default: http://localhost)
162
+ port: number, // port to which the browser should connect (default: undefined)
163
+ screenshotDir: string, // directory in which to save screenshots (default: "screenshots")
164
+ nojsTags: string|string[] // tags for scenarios to run without javascript (default: @nojs, @noscript)
165
+ showBrowserTags: string|string[] // tags for scenarios to run with browser visible (default: @browser, @show-browser, @showbrowser)
166
+ slowMoTags: string|string[] // tags for scenarios to be run with slow motion enabled (default: @slowmo)
167
+ headless: boolean // whether to run the browser in headless mode (default true)
168
+ slowMo: boolean|number // whether to run the browser with slow motion enabled (default false)
169
+ slowMoMs: number // the number of milliseconds to slow down the browser by (default 500)
170
+ keyboardDelay: number // the number of milliseconds between key presses (default:20)
171
+ defaultBrowser: 'chromium'|'firefox'|'webkit' // the default browser to use (default: chromium)
172
+ browserSizes: Record<string,string> // the default browser sizes to use, in the form "widthxheight"
173
+ // (default: { mobile: "480x640", tablet: "1024x768", desktop: "1920x1080", widescreen: "3440x1440" })
174
+ defaultBrowserSize: string // the default browser size to use (default: desktop)
175
+ }>
176
+ ```
177
+
178
+ ### Use @quickpickle/playwright in CI
179
+
180
+ In order to run playwright tests in CI, you'll need to set up the playwright browsers.
181
+ See [quickpickle's release.yml Github action] for example.
182
+
183
+
184
+ [quickpickle]: https://github.com/dnotes/quickpickle
185
+ [QuickPickle]: https://github.com/dnotes/quickpickle
186
+ [Playwright]: https://github.com/microsoft/playwright
187
+ [quickpickle's release.yml Github action]: https://github.com/dnotes/quickpickle/blob/main/.github/workflows/release.yml
@@ -14,36 +14,88 @@ const defaultPlaywrightWorldConfig = {
14
14
  headless: true,
15
15
  slowMo: false,
16
16
  slowMoMs: 500,
17
+ keyboardDelay: 20,
18
+ defaultBrowser: 'chromium',
19
+ browserSizes: {
20
+ mobile: '480x640',
21
+ tablet: '1024x768',
22
+ desktop: '1920x1080',
23
+ widescreen: '3440x1440',
24
+ },
25
+ defaultBrowserSize: 'desktop',
17
26
  };
18
27
  class PlaywrightWorld extends quickpickle.QuickPickleWorld {
19
28
  constructor(context, info, worldConfig = {}) {
20
29
  super(context, info);
21
30
  this.playwrightConfig = defaultPlaywrightWorldConfig;
31
+ this.setConfig(worldConfig);
32
+ }
33
+ async init() {
34
+ await this.startBrowser();
35
+ this.browserContext = await this.browser.newContext({
36
+ serviceWorkers: 'block',
37
+ javaScriptEnabled: this.tagsMatch(this.playwrightConfig.nojsTags) ? false : true,
38
+ });
39
+ this.page = await this.browserContext.newPage();
40
+ await this.setViewportSize();
41
+ }
42
+ get browserName() {
43
+ return this.info.tags.find(t => t.match(/^@(?:chromium|firefox|webkit)$/))?.replace(/^@/, '') ?? this.playwrightConfig.defaultBrowser ?? 'chromium';
44
+ }
45
+ get browserSize() {
46
+ let tag = this.tagsMatch(this.browserSizeTags)?.[0]?.replace(/^@/, '');
47
+ let sizeStr = (tag
48
+ ? this.playwrightConfig.browserSizes[tag.replace(/^@/, '')]
49
+ : this.playwrightConfig.browserSizes[this.playwrightConfig.defaultBrowserSize]) ?? '1920x1080';
50
+ return getDimensions(sizeStr);
51
+ }
52
+ get browserSizeTags() {
53
+ return Object.keys(this.playwrightConfig.browserSizes).map(k => `@${k}`);
54
+ }
55
+ setConfig(worldConfig) {
22
56
  let newConfig = lodashEs.defaultsDeep(worldConfig || {}, defaultPlaywrightWorldConfig);
23
57
  newConfig.nojsTags = quickpickle.normalizeTags(newConfig.nojsTags);
24
58
  newConfig.showBrowserTags = quickpickle.normalizeTags(newConfig.showBrowserTags);
25
59
  newConfig.slowMoTags = quickpickle.normalizeTags(newConfig.slowMoTags);
60
+ if (!['chromium', 'firefox', 'webkit'].includes(newConfig.defaultBrowser))
61
+ newConfig.defaultBrowser = 'chromium';
26
62
  if (typeof newConfig.slowMo === 'number') {
27
63
  newConfig.slowMoMs = newConfig.slowMo;
28
64
  newConfig.slowMo = newConfig.slowMoMs > 0;
29
65
  }
30
66
  this.playwrightConfig = newConfig;
31
67
  }
32
- async init() {
33
- let browserName = this.info.tags.find(t => t.match(/^@(?:chromium|firefox|webkit)$/))?.replace(/^@/, '') ?? 'chromium';
34
- this.browser = await browsers[browserName].launch({
68
+ async setViewportSize(size) {
69
+ if (size) {
70
+ size = size.replace(/^['"]/, '').replace(/['"]$/, '');
71
+ if (this.playwrightConfig.browserSizes[size]) {
72
+ await this.page.setViewportSize(getDimensions(this.playwrightConfig.browserSizes[size]));
73
+ }
74
+ else if (size.match(/^\d+x\d+$/)) {
75
+ await this.page.setViewportSize(getDimensions(size));
76
+ }
77
+ else
78
+ throw new Error(`Invalid browser size: ${size}
79
+ (found: ${this.playwrightConfig.browserSizes[size]})
80
+ (available: ${Object.keys(this.playwrightConfig.browserSizes).join(', ')})`);
81
+ }
82
+ else
83
+ await this.page.setViewportSize(this.browserSize);
84
+ }
85
+ async startBrowser() {
86
+ this.browser = await browsers[this.browserName].launch({
35
87
  headless: this.tagsMatch(this.playwrightConfig.showBrowserTags) ? false : this.playwrightConfig.headless,
36
88
  slowMo: (this.playwrightConfig.slowMo || this.tagsMatch(this.playwrightConfig.slowMoTags)) ? this.playwrightConfig.slowMoMs : 0
37
89
  });
38
- this.browserContext = await this.browser.newContext({
39
- serviceWorkers: 'block',
40
- javaScriptEnabled: this.tagsMatch(this.playwrightConfig.nojsTags) ? false : true,
41
- });
42
- this.page = await this.browserContext.newPage();
43
90
  }
44
- async reset() {
91
+ async reset(conf) {
45
92
  await this.page?.close();
46
93
  await this.browserContext?.close();
94
+ if (conf) {
95
+ await this.browser.close();
96
+ await this.setConfig(conf);
97
+ await this.startBrowser();
98
+ }
47
99
  this.browserContext = await this.browser.newContext({
48
100
  serviceWorkers: 'block'
49
101
  });
@@ -59,6 +111,10 @@ class PlaywrightWorld extends quickpickle.QuickPickleWorld {
59
111
  return new URL(this.playwrightConfig.host);
60
112
  }
61
113
  }
114
+ function getDimensions(size) {
115
+ let [width, height] = size.split('x').map(Number);
116
+ return { width, height };
117
+ }
62
118
  quickpickle.After(async (world) => {
63
119
  await world.browserContext.close();
64
120
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightWorld.cjs","sources":["../src/PlaywrightWorld.ts"],"sourcesContent":[null],"names":["chromium","firefox","webkit","QuickPickleWorld","defaultsDeep","normalizeTags","After"],"mappings":"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"}
1
+ {"version":3,"file":"PlaywrightWorld.cjs","sources":["../src/PlaywrightWorld.ts"],"sourcesContent":[null],"names":["chromium","firefox","webkit","QuickPickleWorld","defaultsDeep","normalizeTags","After"],"mappings":"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"}
@@ -11,6 +11,10 @@ export type PlaywrightWorldConfigSetting = Partial<{
11
11
  headless: boolean;
12
12
  slowMo: boolean | number;
13
13
  slowMoMs: number;
14
+ keyboardDelay: number;
15
+ defaultBrowser: 'chromium' | 'firefox' | 'webkit';
16
+ browserSizes: Record<string, string>;
17
+ defaultBrowserSize: string;
14
18
  }>;
15
19
  export declare const defaultPlaywrightWorldConfig: {
16
20
  host: string;
@@ -21,9 +25,19 @@ export declare const defaultPlaywrightWorldConfig: {
21
25
  headless: boolean;
22
26
  slowMo: boolean;
23
27
  slowMoMs: number;
28
+ keyboardDelay: number;
29
+ defaultBrowser: string;
30
+ browserSizes: {
31
+ mobile: string;
32
+ tablet: string;
33
+ desktop: string;
34
+ widescreen: string;
35
+ };
36
+ defaultBrowserSize: string;
24
37
  };
25
38
  export type PlaywrightWorldConfig = typeof defaultPlaywrightWorldConfig & {
26
39
  port?: number;
40
+ browserSizes: Record<string, string>;
27
41
  };
28
42
  export declare class PlaywrightWorld extends QuickPickleWorld {
29
43
  browser: Browser;
@@ -32,7 +46,16 @@ export declare class PlaywrightWorld extends QuickPickleWorld {
32
46
  playwrightConfig: PlaywrightWorldConfig;
33
47
  constructor(context: TestContext, info: QuickPickleWorldInterface['info'] | undefined, worldConfig?: PlaywrightWorldConfigSetting);
34
48
  init(): Promise<void>;
35
- reset(): Promise<void>;
49
+ get browserName(): "chromium" | "firefox" | "webkit";
50
+ get browserSize(): {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ get browserSizeTags(): string[];
55
+ setConfig(worldConfig: PlaywrightWorldConfigSetting): void;
56
+ setViewportSize(size?: string): Promise<void>;
57
+ startBrowser(): Promise<void>;
58
+ reset(conf?: PlaywrightWorldConfigSetting): Promise<void>;
36
59
  close(): Promise<void>;
37
60
  get baseUrl(): URL;
38
61
  }
@@ -12,36 +12,88 @@ const defaultPlaywrightWorldConfig = {
12
12
  headless: true,
13
13
  slowMo: false,
14
14
  slowMoMs: 500,
15
+ keyboardDelay: 20,
16
+ defaultBrowser: 'chromium',
17
+ browserSizes: {
18
+ mobile: '480x640',
19
+ tablet: '1024x768',
20
+ desktop: '1920x1080',
21
+ widescreen: '3440x1440',
22
+ },
23
+ defaultBrowserSize: 'desktop',
15
24
  };
16
25
  class PlaywrightWorld extends QuickPickleWorld {
17
26
  constructor(context, info, worldConfig = {}) {
18
27
  super(context, info);
19
28
  this.playwrightConfig = defaultPlaywrightWorldConfig;
29
+ this.setConfig(worldConfig);
30
+ }
31
+ async init() {
32
+ await this.startBrowser();
33
+ this.browserContext = await this.browser.newContext({
34
+ serviceWorkers: 'block',
35
+ javaScriptEnabled: this.tagsMatch(this.playwrightConfig.nojsTags) ? false : true,
36
+ });
37
+ this.page = await this.browserContext.newPage();
38
+ await this.setViewportSize();
39
+ }
40
+ get browserName() {
41
+ return this.info.tags.find(t => t.match(/^@(?:chromium|firefox|webkit)$/))?.replace(/^@/, '') ?? this.playwrightConfig.defaultBrowser ?? 'chromium';
42
+ }
43
+ get browserSize() {
44
+ let tag = this.tagsMatch(this.browserSizeTags)?.[0]?.replace(/^@/, '');
45
+ let sizeStr = (tag
46
+ ? this.playwrightConfig.browserSizes[tag.replace(/^@/, '')]
47
+ : this.playwrightConfig.browserSizes[this.playwrightConfig.defaultBrowserSize]) ?? '1920x1080';
48
+ return getDimensions(sizeStr);
49
+ }
50
+ get browserSizeTags() {
51
+ return Object.keys(this.playwrightConfig.browserSizes).map(k => `@${k}`);
52
+ }
53
+ setConfig(worldConfig) {
20
54
  let newConfig = defaultsDeep(worldConfig || {}, defaultPlaywrightWorldConfig);
21
55
  newConfig.nojsTags = normalizeTags(newConfig.nojsTags);
22
56
  newConfig.showBrowserTags = normalizeTags(newConfig.showBrowserTags);
23
57
  newConfig.slowMoTags = normalizeTags(newConfig.slowMoTags);
58
+ if (!['chromium', 'firefox', 'webkit'].includes(newConfig.defaultBrowser))
59
+ newConfig.defaultBrowser = 'chromium';
24
60
  if (typeof newConfig.slowMo === 'number') {
25
61
  newConfig.slowMoMs = newConfig.slowMo;
26
62
  newConfig.slowMo = newConfig.slowMoMs > 0;
27
63
  }
28
64
  this.playwrightConfig = newConfig;
29
65
  }
30
- async init() {
31
- let browserName = this.info.tags.find(t => t.match(/^@(?:chromium|firefox|webkit)$/))?.replace(/^@/, '') ?? 'chromium';
32
- this.browser = await browsers[browserName].launch({
66
+ async setViewportSize(size) {
67
+ if (size) {
68
+ size = size.replace(/^['"]/, '').replace(/['"]$/, '');
69
+ if (this.playwrightConfig.browserSizes[size]) {
70
+ await this.page.setViewportSize(getDimensions(this.playwrightConfig.browserSizes[size]));
71
+ }
72
+ else if (size.match(/^\d+x\d+$/)) {
73
+ await this.page.setViewportSize(getDimensions(size));
74
+ }
75
+ else
76
+ throw new Error(`Invalid browser size: ${size}
77
+ (found: ${this.playwrightConfig.browserSizes[size]})
78
+ (available: ${Object.keys(this.playwrightConfig.browserSizes).join(', ')})`);
79
+ }
80
+ else
81
+ await this.page.setViewportSize(this.browserSize);
82
+ }
83
+ async startBrowser() {
84
+ this.browser = await browsers[this.browserName].launch({
33
85
  headless: this.tagsMatch(this.playwrightConfig.showBrowserTags) ? false : this.playwrightConfig.headless,
34
86
  slowMo: (this.playwrightConfig.slowMo || this.tagsMatch(this.playwrightConfig.slowMoTags)) ? this.playwrightConfig.slowMoMs : 0
35
87
  });
36
- this.browserContext = await this.browser.newContext({
37
- serviceWorkers: 'block',
38
- javaScriptEnabled: this.tagsMatch(this.playwrightConfig.nojsTags) ? false : true,
39
- });
40
- this.page = await this.browserContext.newPage();
41
88
  }
42
- async reset() {
89
+ async reset(conf) {
43
90
  await this.page?.close();
44
91
  await this.browserContext?.close();
92
+ if (conf) {
93
+ await this.browser.close();
94
+ await this.setConfig(conf);
95
+ await this.startBrowser();
96
+ }
45
97
  this.browserContext = await this.browser.newContext({
46
98
  serviceWorkers: 'block'
47
99
  });
@@ -57,6 +109,10 @@ class PlaywrightWorld extends QuickPickleWorld {
57
109
  return new URL(this.playwrightConfig.host);
58
110
  }
59
111
  }
112
+ function getDimensions(size) {
113
+ let [width, height] = size.split('x').map(Number);
114
+ return { width, height };
115
+ }
60
116
  After(async (world) => {
61
117
  await world.browserContext.close();
62
118
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightWorld.mjs","sources":["../src/PlaywrightWorld.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PlaywrightWorld.mjs","sources":["../src/PlaywrightWorld.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}