artes 1.2.29 → 1.3.1

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 CHANGED
@@ -126,6 +126,7 @@ npx artes [options]
126
126
  | 🎭 `--dryRun` | Perform a dry run without executing tests | `artes --dryRun` |
127
127
  | 📈 `--percentage` | Set minimum success percentage to pass test run (default is 0) | `artes --percentage 85` |
128
128
  | 🌍 `--browser` | Specify browser to use (`chromium`, `firefox`, or `webkit`) | `artes --browser chromium` |
129
+ | 📱 `--device` | Emulate specific device (e.g., "iPhone 13") | `artes --device "iPhone 13"` |
129
130
  | 🔗 `--baseURL` | Set base URL for the tests | `artes --baseURL "https://example.com"` |
130
131
  | 🖥️ `--maxScreen` | Maximize browser window on launch | `artes --maxScreen` |
131
132
  | 📏 `--width` | Set browser width (default is 1280) | `artes --width 1920` |
@@ -589,6 +590,13 @@ Artes supports environment-specific configurations through environment variables
589
590
  | `viewport` | `{ width: 1280, height: 720 }` | Browser viewport size. |
590
591
  | `headless` | `true` | Run browser in headless mode (`true` or `false`). |
591
592
 
593
+ ### Device Configuration
594
+
595
+ | Option | Default Value | Description |
596
+ | ------------- | ------------------------------ | ------------------------------------------------------ |
597
+ | `device` | `""` | [Device List](./docs/emulationDevicesList.md) |
598
+
599
+
592
600
  ## 📊 Report Generation
593
601
 
594
602
  Artes can generate Allure reports. After running tests with the `-r` flag, the reports will be stored in the `report` folder in HTML format. You can view them in your browser after the tests complete.
@@ -163,6 +163,9 @@ module.exports = {
163
163
  browserType: process.env.BROWSER
164
164
  ? JSON.parse(process.env.BROWSER)
165
165
  : artesConfig?.browser || "chrome",
166
+ device: process.env.DEVICE
167
+ ? JSON.parse(process.env.DEVICE)
168
+ : artesConfig?.device || null,
166
169
  viewport: {
167
170
  width: process.env.WIDTH
168
171
  ? Number(process.env.WIDTH)
@@ -0,0 +1,153 @@
1
+ # Emulation Supported Devices
2
+
3
+ > **Important:** Device names must be written **exactly as listed** and enclosed in double quotes (`""`) when used.
4
+ > Example:
5
+ >
6
+ > ```bash
7
+ > npx artes --device "iPhone 13"
8
+ > ```
9
+
10
+ > ⚠️ Make sure to **copy the names exactly** including spaces, capital letters, and parentheses when using them.
11
+
12
+ ---
13
+
14
+ ## Mobile Devices
15
+
16
+ - Blackberry PlayBook
17
+ - Blackberry PlayBook landscape
18
+ - BlackBerry Z30
19
+ - BlackBerry Z30 landscape
20
+ - Galaxy Note 3
21
+ - Galaxy Note 3 landscape
22
+ - Galaxy Note II
23
+ - Galaxy Note II landscape
24
+ - Galaxy S III
25
+ - Galaxy S III landscape
26
+ - Galaxy S5
27
+ - Galaxy S5 landscape
28
+ - Galaxy S8
29
+ - Galaxy S8 landscape
30
+ - Galaxy S9+
31
+ - Galaxy S9+ landscape
32
+ - Galaxy Tab S4
33
+ - Galaxy Tab S4 landscape
34
+ - iPad (gen 5)
35
+ - iPad (gen 5) landscape
36
+ - iPad (gen 6)
37
+ - iPad (gen 6) landscape
38
+ - iPad (gen 7)
39
+ - iPad (gen 7) landscape
40
+ - iPad Mini
41
+ - iPad Mini landscape
42
+ - iPad Pro 11
43
+ - iPad Pro 11 landscape
44
+ - iPhone 6
45
+ - iPhone 6 landscape
46
+ - iPhone 6 Plus
47
+ - iPhone 6 Plus landscape
48
+ - iPhone 7
49
+ - iPhone 7 landscape
50
+ - iPhone 7 Plus
51
+ - iPhone 7 Plus landscape
52
+ - iPhone 8
53
+ - iPhone 8 landscape
54
+ - iPhone 8 Plus
55
+ - iPhone 8 Plus landscape
56
+ - iPhone SE
57
+ - iPhone SE landscape
58
+ - iPhone X
59
+ - iPhone X landscape
60
+ - iPhone XR
61
+ - iPhone XR landscape
62
+ - iPhone 11
63
+ - iPhone 11 landscape
64
+ - iPhone 11 Pro
65
+ - iPhone 11 Pro landscape
66
+ - iPhone 11 Pro Max
67
+ - iPhone 11 Pro Max landscape
68
+ - iPhone 12
69
+ - iPhone 12 landscape
70
+ - iPhone 12 Pro
71
+ - iPhone 12 Pro landscape
72
+ - iPhone 12 Pro Max
73
+ - iPhone 12 Pro Max landscape
74
+ - iPhone 12 Mini
75
+ - iPhone 12 Mini landscape
76
+ - iPhone 13
77
+ - iPhone 13 landscape
78
+ - iPhone 13 Pro
79
+ - iPhone 13 Pro landscape
80
+ - iPhone 13 Pro Max
81
+ - iPhone 13 Pro Max landscape
82
+ - iPhone 13 Mini
83
+ - iPhone 13 Mini landscape
84
+ - iPhone 14
85
+ - iPhone 14 landscape
86
+ - iPhone 14 Plus
87
+ - iPhone 14 Plus landscape
88
+ - iPhone 14 Pro
89
+ - iPhone 14 Pro landscape
90
+ - iPhone 14 Pro Max
91
+ - iPhone 14 Pro Max landscape
92
+ - iPhone 15
93
+ - iPhone 15 landscape
94
+ - iPhone 15 Plus
95
+ - iPhone 15 Plus landscape
96
+ - iPhone 15 Pro
97
+ - iPhone 15 Pro landscape
98
+ - iPhone 15 Pro Max
99
+ - iPhone 15 Pro Max landscape
100
+ - Kindle Fire HDX
101
+ - Kindle Fire HDX landscape
102
+ - LG Optimus L70
103
+ - LG Optimus L70 landscape
104
+ - Microsoft Lumia 550
105
+ - Microsoft Lumia 550 landscape
106
+ - Microsoft Lumia 950
107
+ - Microsoft Lumia 950 landscape
108
+ - Nexus 10
109
+ - Nexus 10 landscape
110
+ - Nexus 4
111
+ - Nexus 4 landscape
112
+ - Nexus 5
113
+ - Nexus 5 landscape
114
+ - Nexus 5X
115
+ - Nexus 5X landscape
116
+ - Nexus 6
117
+ - Nexus 6 landscape
118
+ - Nexus 6P
119
+ - Nexus 6P landscape
120
+ - Nexus 7
121
+ - Nexus 7 landscape
122
+ - Nokia Lumia 520
123
+ - Nokia Lumia 520 landscape
124
+ - Nokia N9
125
+ - Nokia N9 landscape
126
+ - Pixel 2
127
+ - Pixel 2 landscape
128
+ - Pixel 2 XL
129
+ - Pixel 2 XL landscape
130
+ - Pixel 3
131
+ - Pixel 3 landscape
132
+ - Pixel 4
133
+ - Pixel 4 landscape
134
+ - Pixel 4a (5G)
135
+ - Pixel 4a (5G) landscape
136
+ - Pixel 5
137
+ - Pixel 5 landscape
138
+ - Pixel 7
139
+ - Pixel 7 landscape
140
+ - Moto G4
141
+ - Moto G4 landscape
142
+
143
+ ---
144
+
145
+ ## Desktop Devices
146
+
147
+ - Desktop Chrome HiDPI
148
+ - Desktop Edge HiDPI
149
+ - Desktop Firefox HiDPI
150
+ - Desktop Safari
151
+ - Desktop Chrome
152
+ - Desktop Edge
153
+ - Desktop Firefox
package/executer.js CHANGED
@@ -7,6 +7,7 @@ const {
7
7
  generateReport,
8
8
  cleanUp,
9
9
  } = require("./src/helper/executers/exporter");
10
+ const { logPomWarnings } = require("./src/helper/controller/pomCollector");
10
11
  const fs = require("fs");
11
12
  const path = require("path");
12
13
 
@@ -43,6 +44,7 @@ const flags = {
43
44
  dryRun: args.includes("--dryRun"),
44
45
  percentage: args.includes("--percentage"),
45
46
  browser: args.includes("--browser"),
47
+ device: args.includes("--device"),
46
48
  baseURL: args.includes("--baseURL"),
47
49
  maximizeScreen: args.includes("--maxScreen"),
48
50
  width: args.includes("--width"),
@@ -61,6 +63,7 @@ const retry = args[args.indexOf("--retry") + 1];
61
63
  const rerun = args[args.indexOf("--rerun") + 1];
62
64
  const percentage = args[args.indexOf("--percentage") + 1];
63
65
  const browser = args[args.indexOf("--browser") + 1];
66
+ const device = args[args.indexOf("--device") + 1];
64
67
  const baseURL = args[args.indexOf("--baseURL") + 1];
65
68
  const width = args[args.indexOf("--width") + 1];
66
69
  const height = args[args.indexOf("--height") + 1];
@@ -120,6 +123,9 @@ flags.percentage ? (process.env.PERCENTAGE = percentage) : "";
120
123
  flags.browser && console.log("Running browser:", browser);
121
124
  flags.browser ? (process.env.BROWSER = JSON.stringify(browser)) : "";
122
125
 
126
+ flags.device && console.log("Running device:", device);
127
+ flags.device ? (process.env.DEVICE = JSON.stringify(device)) : "";
128
+
123
129
  flags.baseURL ? (process.env.BASE_URL = JSON.stringify(baseURL)) : "";
124
130
 
125
131
  flags.maximizeScreen
@@ -142,6 +148,9 @@ function main() {
142
148
  if (flags.create) return createProject(flags.createYes, flags.noDeps);
143
149
 
144
150
  runTests();
151
+
152
+ logPomWarnings();
153
+
145
154
  if (
146
155
  flags.reportWithTrace ||
147
156
  artesConfig.reportWithTrace ||
package/index.js CHANGED
@@ -39,7 +39,6 @@ module.exports = {
39
39
  time,
40
40
  page,
41
41
  request,
42
- api,
43
42
  keyboard,
44
43
  mouse,
45
44
  frame,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "artes",
3
- "version": "1.2.29",
3
+ "version": "1.3.1",
4
4
  "description": "The simplest way to automate UI and API tests using Cucumber-style steps.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,4 +1,4 @@
1
- const { chromium, firefox, webkit } = require("playwright");
1
+ const { chromium, firefox, webkit, devices } = require("playwright");
2
2
  const cucumberConfig = require("../../../cucumber.config.js");
3
3
 
4
4
  const invokeBrowser = async () => {
@@ -19,14 +19,17 @@ const invokeBrowser = async () => {
19
19
  args: [cucumberConfig.browser.maximizeScreen ? "--start-maximized" : ""],
20
20
  };
21
21
 
22
- const browserType =
23
- cucumberConfig.browser.browserType.toLowerCase() || "chrome";
22
+ const browserType = cucumberConfig.browser.device ? "webkit" : cucumberConfig.browser.browserType.toLowerCase() || "chrome";
24
23
 
25
24
  const browserContextOptions = {
26
25
  baseURL: baseURL,
27
- viewport: cucumberConfig.browser.maximizeScreen
28
- ? null
29
- : cucumberConfig.browser.viewport,
26
+ ...(cucumberConfig.browser.device
27
+ ? {}
28
+ : {
29
+ viewport: cucumberConfig.browser.maximizeScreen
30
+ ? null
31
+ : cucumberConfig.browser.viewport,
32
+ }),
30
33
  recordVideo: {
31
34
  dir: "./test-results/visualReport/",
32
35
  size: cucumberConfig.browser.viewport,
@@ -50,7 +53,11 @@ const invokeBrowser = async () => {
50
53
  );
51
54
  }
52
55
 
53
- const context = await browser.newContext(browserContextOptions);
56
+
57
+ const context = await browser.newContext({
58
+ ...(cucumberConfig.browser.device ? devices[cucumberConfig.browser.device] : {}),
59
+ ...browserContextOptions,
60
+ });
54
61
 
55
62
  return {
56
63
  browser: browser,
@@ -2,6 +2,8 @@ const { addElements } = require("./elementController");
2
2
  const cucumberConfig = require("../../../cucumber.config");
3
3
  const fs = require("fs");
4
4
  const path = require("path");
5
+ const { moduleConfig } = require("../../helper/imports/commons");
6
+
5
7
 
6
8
  const duplicateWarnings = [];
7
9
  const keyRegistry = {};
@@ -34,10 +36,26 @@ function pomCollector() {
34
36
 
35
37
  addElements(parsed);
36
38
  });
39
+
40
+ const duplicationFilePath = path.join(moduleConfig.projectPath,"node_modules","artes","pomDuplicateWarnings.json")
41
+
42
+ if (duplicateWarnings.length > 0) {
43
+ fs.mkdirSync(path.dirname(duplicationFilePath), { recursive: true });
44
+ fs.writeFileSync(
45
+ duplicationFilePath,
46
+ JSON.stringify(duplicateWarnings, null, 2),
47
+ "utf8"
48
+ );
49
+ }
37
50
  }
38
51
 
39
52
  function logPomWarnings() {
40
- if (duplicateWarnings.length === 0) return;
53
+
54
+ if (!fs.existsSync(path.join(moduleConfig.modulePath,"pomDuplicateWarnings.json"))) return;
55
+
56
+ const duplicateWarnings = JSON.parse(
57
+ fs.readFileSync(path.join(moduleConfig.modulePath,"pomDuplicateWarnings.json"), "utf8")
58
+ );
41
59
 
42
60
  console.warn(
43
61
  "\n\x1b[33m[WARNING] POM DUPLICATE KEY WARNINGS: This may break your tests or cause flaky behavior."
@@ -76,6 +76,9 @@ function showHelp() {
76
76
  🌐 --browser Specify browser to use (chromium, firefox, webkit)
77
77
  Usage: artes --browser chromium
78
78
 
79
+ 📱 --device Emulate specific device (e.g., "iPhone 13")
80
+ Usage: artes --device "iPhone 13"
81
+
79
82
  🌐 --baseURL Set base URL for the tests
80
83
  Usage: artes --baseURL "https://example.com"
81
84
 
@@ -43,11 +43,11 @@ function createProject(createYes, noDeps) {
43
43
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
44
44
 
45
45
  const config = `module.exports = {
46
- headless: false, // Set to true for headless browser mode
46
+ headless: false, // Set to true for headless browser mode
47
47
 
48
48
  // Configuration options:
49
49
  // env: "", // string - Environment name for tests
50
- // testPercentage: 0, // number - Minimum success rate percentage(Default: 0)
50
+ // testPercentage: 0, // number - Minimum success rate percentage(Default: 0)
51
51
  // baseURL: "", // string - Base URL for API tests
52
52
  // paths: [], // string[] - Paths to feature files
53
53
  // steps: "", // string - Step definitions files
@@ -55,7 +55,7 @@ function createProject(createYes, noDeps) {
55
55
  // timeout : 0, // number - Test timeout in seconds
56
56
  // slowMo: 0, // number - Slow down test execution (Default: 0 seconds)
57
57
  // parallel: 0, // number - Number of parallel workers
58
- // report: true / boolean - Generate report
58
+ // report: true // boolean - Generate report
59
59
  // reportSuccess: false, // boolean - Add screenshots and video records to report also for success test cases
60
60
  // trace: false, // boolean - Enable tracing
61
61
  // reportWithTrace: false, // boolean - Include trace in report
@@ -66,6 +66,7 @@ function createProject(createYes, noDeps) {
66
66
  // backtrace: false, // boolean - Show full backtrace for errors
67
67
  // dryRun: false, // boolean - Prepare test run without execution
68
68
  // browser: "chrome", // "chrome", "firefox", "webkit"
69
+ // device: "", // string - Emulate specific device (e.g., "iPhone 13", for more devices look at the documentation)
69
70
  // width: 1280, // number - Browser width
70
71
  // height: 720, // number - Browser height
71
72
  // maximizeScreen: true // boolean - Maximize browser window
@@ -1,6 +1,5 @@
1
1
  const { spawnSync } = require("child_process");
2
2
  const { moduleConfig } = require("../imports/commons");
3
- const path = require("path");
4
3
 
5
4
  function runTests() {
6
5
  try {
@@ -35,7 +35,7 @@ const moduleConfig = {
35
35
  stepsPath: path.join(projectPath, "/tests/steps/*.js"),
36
36
  pomPath: path.join(projectPath, "/tests/POMs"),
37
37
  cleanUpPaths:
38
- "allure-result allure-results test-results @rerun.txt testsStatus EXIT_CODE.txt",
38
+ "allure-result allure-results test-results @rerun.txt testsStatus EXIT_CODE.txt pomDuplicateWarnings.json",
39
39
  };
40
40
 
41
41
  module.exports = {
@@ -336,7 +336,7 @@ const assert = {
336
336
  expect(elementInteractions.textContent(selector)).toContain(substring);
337
337
  },
338
338
  shouldContainEqual: (selector, expected) => {
339
- expect(elementInteractions.textContent(selector)).toContainEqual(element);
339
+ expect(elementInteractions.textContent(selector)).toContainEqual(expected);
340
340
  },
341
341
  shouldEqual: (selector, expected) => {
342
342
  expect(Number(elementInteractions.textContent(selector))).toEqual(expected);
@@ -455,7 +455,7 @@ const assert = {
455
455
  shouldNotContainEqual: (selector, expected) => {
456
456
  expect(
457
457
  Number(elementInteractions.textContent(selector)),
458
- ).not.toContainEqual(element);
458
+ ).not.toContainEqual(expected);
459
459
  },
460
460
  shouldNotEqual: (selector, expected) => {
461
461
  expect(Number(elementInteractions.textContent(selector))).not.toEqual(
@@ -1,4 +1,6 @@
1
1
  const { element, resolveVariable } = require("../imports/commons");
2
+ const { frame } = require("./frameActions");
3
+
2
4
 
3
5
  const keyboard = {
4
6
  press: async (selector, key) => {
@@ -233,6 +233,8 @@ AfterAll(async () => {
233
233
  await projectHooks.AfterAll();
234
234
  }
235
235
 
236
+ logPomWarnings();
237
+
236
238
  if (!fs.existsSync(statusDir)) return;
237
239
 
238
240
  const files = fs.readdirSync(statusDir);
@@ -5,6 +5,7 @@ const {
5
5
  element,
6
6
  extractVarsFromResponse,
7
7
  context,
8
+ resolveVariable,
8
9
  } = require("../helper/imports/commons");
9
10
  const { assert, frame } = require("../helper/stepFunctions/exporter");
10
11
  const Ajv = require("ajv");