@argos-ci/puppeteer 1.1.2 → 1.1.4
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/dist/index.cjs +8 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.mjs +142 -0
- package/package.json +2 -2
package/dist/index.cjs
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ElementHandle, Page, ScreenshotOptions } from "puppeteer";
|
|
2
|
+
import { ViewportOption } from "@argos-ci/browser";
|
|
3
|
+
type ArgosScreenshotOptions = Omit<ScreenshotOptions, "encoding" | "type" | "omitBackground" | "path"> & {
|
|
4
|
+
/**
|
|
5
|
+
* ElementHandle or string selector of the element to take a screenshot of.
|
|
6
|
+
*/
|
|
7
|
+
element?: string | ElementHandle;
|
|
8
|
+
/**
|
|
9
|
+
* Viewports to take screenshots of.
|
|
10
|
+
*/
|
|
11
|
+
viewports?: ViewportOption[];
|
|
12
|
+
};
|
|
13
|
+
declare function argosScreenshot(page: Page, name: string, { element, viewports, ...options }?: ArgosScreenshotOptions): Promise<void>;
|
|
14
|
+
export { ArgosScreenshotOptions, argosScreenshot };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { mkdir, readFile } from 'node:fs/promises';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { resolveViewport } from '@argos-ci/browser';
|
|
5
|
+
import { getScreenshotName, writeMetadata, readVersionFromPackage } from '@argos-ci/util';
|
|
6
|
+
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
/**
|
|
9
|
+
* Inject Argos script into the page.
|
|
10
|
+
*/ async function injectArgos(page) {
|
|
11
|
+
const fileName = require.resolve("@argos-ci/browser/global.js");
|
|
12
|
+
const content = await readFile(fileName, "utf-8");
|
|
13
|
+
await page.addScriptTag({
|
|
14
|
+
content
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function getPuppeteerVersion() {
|
|
18
|
+
const pkgPath = require.resolve("puppeteer/package.json");
|
|
19
|
+
return readVersionFromPackage(pkgPath);
|
|
20
|
+
}
|
|
21
|
+
async function getArgosPuppeteerVersion() {
|
|
22
|
+
const pkgPath = require.resolve("@argos-ci/puppeteer/package.json");
|
|
23
|
+
return readVersionFromPackage(pkgPath);
|
|
24
|
+
}
|
|
25
|
+
function getViewport(page) {
|
|
26
|
+
const viewport = page.viewport();
|
|
27
|
+
if (!viewport) {
|
|
28
|
+
throw new Error("Can't take screenshots without a viewport.");
|
|
29
|
+
}
|
|
30
|
+
return viewport;
|
|
31
|
+
}
|
|
32
|
+
async function getBrowserInfo(page) {
|
|
33
|
+
const rawVersion = await page.browser().version();
|
|
34
|
+
const [browserName, browserVersion] = rawVersion.split("/");
|
|
35
|
+
return {
|
|
36
|
+
browserName,
|
|
37
|
+
browserVersion
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function argosScreenshot(page, name, { element, viewports, ...options } = {}) {
|
|
41
|
+
if (!page) {
|
|
42
|
+
throw new Error("A Puppeteer `page` object is required.");
|
|
43
|
+
}
|
|
44
|
+
if (!name) {
|
|
45
|
+
throw new Error("The `name` argument is required.");
|
|
46
|
+
}
|
|
47
|
+
const screenshotFolder = resolve(process.cwd(), "screenshots/argos");
|
|
48
|
+
const [originalViewport] = await Promise.all([
|
|
49
|
+
getViewport(page),
|
|
50
|
+
// Create the screenshot folder if it doesn't exist
|
|
51
|
+
mkdir(screenshotFolder, {
|
|
52
|
+
recursive: true
|
|
53
|
+
}),
|
|
54
|
+
// Inject Argos script into the page
|
|
55
|
+
injectArgos(page)
|
|
56
|
+
]);
|
|
57
|
+
const fullPage = options.fullPage !== undefined ? options.fullPage : element === undefined;
|
|
58
|
+
await page.evaluate(({ fullPage })=>window.__ARGOS__.prepareForScreenshot({
|
|
59
|
+
fullPage
|
|
60
|
+
}), {
|
|
61
|
+
fullPage
|
|
62
|
+
});
|
|
63
|
+
async function collectMetadata() {
|
|
64
|
+
const [colorScheme, mediaType, puppeteerVersion, argosPuppeteerVersion, { browserName, browserVersion }] = await Promise.all([
|
|
65
|
+
page.evaluate(()=>window.__ARGOS__.getColorScheme()),
|
|
66
|
+
page.evaluate(()=>window.__ARGOS__.getMediaType()),
|
|
67
|
+
getPuppeteerVersion(),
|
|
68
|
+
getArgosPuppeteerVersion(),
|
|
69
|
+
getBrowserInfo(page)
|
|
70
|
+
]);
|
|
71
|
+
const viewport = getViewport(page);
|
|
72
|
+
const metadata = {
|
|
73
|
+
url: page.url(),
|
|
74
|
+
viewport: {
|
|
75
|
+
width: viewport.width,
|
|
76
|
+
height: viewport.height
|
|
77
|
+
},
|
|
78
|
+
colorScheme,
|
|
79
|
+
mediaType,
|
|
80
|
+
test: null,
|
|
81
|
+
browser: {
|
|
82
|
+
name: browserName,
|
|
83
|
+
version: browserVersion
|
|
84
|
+
},
|
|
85
|
+
automationLibrary: {
|
|
86
|
+
name: "puppeteer",
|
|
87
|
+
version: puppeteerVersion
|
|
88
|
+
},
|
|
89
|
+
sdk: {
|
|
90
|
+
name: "@argos-ci/puppeteer",
|
|
91
|
+
version: argosPuppeteerVersion
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
return metadata;
|
|
95
|
+
}
|
|
96
|
+
async function stabilizeAndScreenshot(name) {
|
|
97
|
+
await page.waitForFunction(()=>window.__ARGOS__.waitForStability());
|
|
98
|
+
const screenshotPath = resolve(screenshotFolder, `${name}.png`);
|
|
99
|
+
const metadata = await collectMetadata();
|
|
100
|
+
await writeMetadata(screenshotPath, metadata);
|
|
101
|
+
const screenshotOptions = {
|
|
102
|
+
path: screenshotPath,
|
|
103
|
+
type: "png",
|
|
104
|
+
fullPage,
|
|
105
|
+
...options
|
|
106
|
+
};
|
|
107
|
+
// If no element is specified, take a screenshot of the whole page
|
|
108
|
+
if (element === undefined) {
|
|
109
|
+
await page.screenshot(screenshotOptions);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// If a string is passed, take a screenshot of the element matching the selector
|
|
113
|
+
if (typeof element === "string") {
|
|
114
|
+
await page.waitForSelector(element);
|
|
115
|
+
const handle = await page.$(element);
|
|
116
|
+
if (!handle) {
|
|
117
|
+
throw new Error(`Unable to find element ${element}`);
|
|
118
|
+
}
|
|
119
|
+
await handle.screenshot(screenshotOptions);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// If an element is passed, take a screenshot of it
|
|
123
|
+
await element.screenshot(screenshotOptions);
|
|
124
|
+
}
|
|
125
|
+
// If no viewports are specified, take a single screenshot
|
|
126
|
+
if (!viewports) {
|
|
127
|
+
await stabilizeAndScreenshot(name);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Take screenshots for each viewport
|
|
131
|
+
for (const viewport of viewports){
|
|
132
|
+
const viewportSize = resolveViewport(viewport);
|
|
133
|
+
await page.setViewport(viewportSize);
|
|
134
|
+
await stabilizeAndScreenshot(getScreenshotName(name, {
|
|
135
|
+
viewportWidth: viewportSize.width
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
// Restore the original viewport
|
|
139
|
+
await page.setViewport(originalViewport);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { argosScreenshot };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@argos-ci/puppeteer",
|
|
3
3
|
"description": "Visual testing solution to avoid visual regression. Puppeteer commands and utilities for Argos visual testing.",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.4",
|
|
5
5
|
"author": "Smooth Code",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"argos-upload": "pnpm exec argos upload screenshots --build-name \"argos-puppeteer-e2e-node-$NODE_VERSION-$OS\"",
|
|
63
63
|
"e2e": "pnpm run test && pnpm run argos-upload"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "c84011dc3a2aefc6bbdf75958020b0a8910612dd"
|
|
66
66
|
}
|