-
Notifications
You must be signed in to change notification settings - Fork 4
/
playwright.config.ts
121 lines (108 loc) · 2.76 KB
/
playwright.config.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import {
devices,
expect,
Locator,
PlaywrightTestConfig,
} from "@playwright/test";
type PseudoElement = "::before" | "::after";
expect.extend({
async toHaveStyle(
locator: Locator,
name: string,
expected: string,
pseudoElement?: PseudoElement
) {
const actual = await locator.evaluate(
(
element: HTMLElement | SVGElement,
{
expected,
name,
pseudoElement,
}: {
expected: string;
name: string;
pseudoElement: PseudoElement;
}
) => {
const computedStyle = getComputedStyle(element, pseudoElement);
switch (name) {
case "borderColor":
if (computedStyle.borderColor) return computedStyle.borderColor;
// Firefox
if (
computedStyle.borderTopColor ===
computedStyle.borderBottomColor &&
computedStyle.borderTopColor === computedStyle.borderLeftColor &&
computedStyle.borderTopColor === computedStyle.borderRightColor
)
return computedStyle.borderTopColor;
break;
case "borderRadius":
if (computedStyle.borderRadius) return computedStyle.borderRadius;
// Firefox
if (
computedStyle.borderTopLeftRadius ===
computedStyle.borderTopRightRadius &&
computedStyle.borderTopLeftRadius ===
computedStyle.borderBottomLeftRadius &&
computedStyle.borderTopLeftRadius ===
computedStyle.borderBottomRightRadius
)
return computedStyle.borderTopLeftRadius;
break;
case "inset":
if (computedStyle.inset) return computedStyle.inset;
// Firefox
if (
computedStyle.top === computedStyle.bottom &&
computedStyle.top === computedStyle.left &&
computedStyle.top === computedStyle.right
)
return computedStyle.top;
break;
case "opacity":
// Safari
return Number(computedStyle.opacity).toFixed(
(expected.split(".")[1] || []).length
);
default:
return computedStyle[name];
}
},
{
expected,
name,
pseudoElement,
}
);
if (actual === expected) return { pass: true };
return {
message: () => `actual: ${actual} expected: ${expected}`,
pass: false,
};
},
});
// https://playwright.dev/docs/test-configuration
const config: PlaywrightTestConfig = {
forbidOnly: !!process.env.CI,
// globalSetup: "./playwright.setup.ts",
projects: [
"Desktop Chrome",
"Desktop Firefox",
"Desktop Safari",
"Pixel 5",
"iPhone 13",
].map((name) => ({ name, use: devices[name] })),
retries: process.env.CI ? 2 : 0,
testDir: "./src",
use: { trace: "on-first-retry" },
webServer: process.env.CI
? {
command: "vite preview",
port: 4173,
reuseExistingServer: false,
}
: { command: "vite", port: 4173, reuseExistingServer: true },
};
export default config;