diff --git a/package.json b/package.json index e3faec6dd..767148bee 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "raw-body": "2.5.2", + "request-promise": "^4.2.6", "semver": "7.5.4", "tar": "6.1.13", "tough-cookie": "4.1.3", @@ -85,6 +86,7 @@ "bcrypt": "5.1.1" }, "devDependencies": { + "@playwright/test": "^1.40.1", "dompurify": "2.4.1", "grunt": "1.6.1", "grunt-chmod": "~1.1.1", @@ -114,6 +116,7 @@ "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.2", "nodemon": "2.0.20", + "playwright": "^1.40.1", "proxy": "^1.0.2", "sass": "1.62.1", "should": "13.2.3", diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index 80b559030..b626866f8 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -73,14 +73,14 @@ module.exports = { /** To password protect the Node-RED editor and admin API, the following * property can be used. See https://nodered.org/docs/security.html for details. */ - //adminAuth: { + // adminAuth: { // type: "credentials", // users: [{ // username: "admin", // password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.", // permissions: "*" // }] - //}, + // }, /** The following property can be used to enable HTTPS * This property can be either an object, containing both a (private) key @@ -90,10 +90,10 @@ module.exports = { */ /** Option 1: static object */ - //https: { + // https: { // key: require("fs").readFileSync('privkey.pem'), // cert: require("fs").readFileSync('cert.pem') - //}, + // }, /** Option 2: function that returns the HTTP configuration object */ // https: function() { @@ -122,8 +122,8 @@ module.exports = { * The `pass` field is a bcrypt hash of the password. * See https://nodered.org/docs/security.html#generating-the-password-hash */ - //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, - //httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, + // httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, + // httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, /******************************************************************************* * Server Settings @@ -481,6 +481,8 @@ module.exports = { */ functionGlobalContext: { // os:require('os'), + // env:process.env, + // playwright: require("playwright") }, /** The maximum number of messages nodes will buffer internally as part of their diff --git a/playwright-report/index.html b/playwright-report/index.html new file mode 100644 index 000000000..142a9d216 --- /dev/null +++ b/playwright-report/index.html @@ -0,0 +1,62 @@ + + + + + + + + + Playwright Test Report + + + + +
+ + + + \ No newline at end of file diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 000000000..b44a090ff --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,97 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + // reporter: 'html', + // reporter: [['json', { outputFile: 'report.json' }]], + // reporter: [ + + // // ['@skilbourn/playwright-report-summary', { outputFile: 'custom-summary.txt' }], + // ['html', { outputFile: 'playwright-report/index.html' }], // other reporters + // ['json', { outputFile: 'test-results/report.json' }], + // // ['dot'] + // ], + reporter: [ + + // ['@skilbourn/playwright-report-summary', { outputFile: 'custom-summary.txt' }], + ['html', { outputFile: 'index.html', outputFolder: 'playwright-report' }], // other reporters + ['json', { outputFile: 'test-results/report.json' }], + // ['dot'] + ], + // reporter:[ + // ['html'], + // ['./reporter.ts'] + // ], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, + +}); diff --git a/test-results/report.json b/test-results/report.json new file mode 100644 index 000000000..3d50331e9 --- /dev/null +++ b/test-results/report.json @@ -0,0 +1,214 @@ +{ + "config": { + "configFile": "E:\\Development\\node-red\\playwright.config.js", + "rootDir": "E:/Development/node-red/tests", + "forbidOnly": false, + "fullyParallel": true, + "globalSetup": null, + "globalTeardown": null, + "globalTimeout": 0, + "grep": {}, + "grepInvert": null, + "maxFailures": 0, + "metadata": { + "actualWorkers": 2 + }, + "preserveOutput": "always", + "reporter": [ + [ + "html", + { + "outputFile": "index.html", + "outputFolder": "playwright-report" + } + ], + [ + "json", + { + "outputFile": "test-results/report.json" + } + ] + ], + "reportSlowTests": { + "max": 5, + "threshold": 15000 + }, + "quiet": false, + "projects": [ + { + "outputDir": "E:/Development/node-red/test-results", + "repeatEach": 1, + "retries": 0, + "id": "chromium", + "name": "chromium", + "testDir": "E:/Development/node-red/tests", + "testIgnore": [], + "testMatch": [ + "**/*.@(spec|test).?(c|m)[jt]s?(x)" + ], + "timeout": 30000 + }, + { + "outputDir": "E:/Development/node-red/test-results", + "repeatEach": 1, + "retries": 0, + "id": "firefox", + "name": "firefox", + "testDir": "E:/Development/node-red/tests", + "testIgnore": [], + "testMatch": [ + "**/*.@(spec|test).?(c|m)[jt]s?(x)" + ], + "timeout": 30000 + }, + { + "outputDir": "E:/Development/node-red/test-results", + "repeatEach": 1, + "retries": 0, + "id": "webkit", + "name": "webkit", + "testDir": "E:/Development/node-red/tests", + "testIgnore": [], + "testMatch": [ + "**/*.@(spec|test).?(c|m)[jt]s?(x)" + ], + "timeout": 30000 + } + ], + "shard": null, + "updateSnapshots": "missing", + "version": "1.40.1", + "workers": 2, + "webServer": null + }, + "suites": [ + { + "title": "bw.spec.ts", + "file": "bw.spec.ts", + "column": 0, + "line": 0, + "specs": [ + { + "title": "Written with Testmation Recorder", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 120000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "status": "passed", + "duration": 14101, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2023-12-19T12:10:15.609Z", + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "df31e9e24deccc7f570a-5253974af1a1f224f0cf", + "file": "bw.spec.ts", + "line": 6, + "column": 7 + }, + { + "title": "Written with Testmation Recorder", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 120000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 1, + "status": "passed", + "duration": 19343, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2023-12-19T12:10:15.570Z", + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "df31e9e24deccc7f570a-45ea40b385464001b1d0", + "file": "bw.spec.ts", + "line": 6, + "column": 7 + }, + { + "title": "Written with Testmation Recorder", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 120000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 2, + "status": "timedOut", + "duration": 120009, + "error": { + "message": "\u001b[31mTest timeout of 120000ms exceeded.\u001b[39m" + }, + "errors": [ + { + "message": "\u001b[31mTest timeout of 120000ms exceeded.\u001b[39m" + }, + { + "location": { + "file": "E:\\Development\\node-red\\tests\\bw.spec.ts", + "column": 14, + "line": 24 + }, + "message": "Error: page.click: Test ended.\nCall log:\n \u001b[2m- waiting for locator('.navbar')\u001b[22m\n\u001b[2m - locator resolved to \u001b[22m\n\u001b[2m - attempting click action\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #1\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #2\u001b[22m\n\u001b[2m - waiting 20ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #3\u001b[22m\n\u001b[2m - waiting 100ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #4\u001b[22m\n\u001b[2m - waiting 100ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #5\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #6\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #7\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #8\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #9\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #10\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #11\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #12\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #13\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #14\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #15\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #16\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #17\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #18\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #19\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #20\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #21\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #22\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #23\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #24\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #25\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #26\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #27\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #28\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #29\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #30\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #31\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #32\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #33\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #34\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #35\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #36\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #37\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #38\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #39\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #40\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #41\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #42\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #43\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #44\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\u001b[2m - element is visible, enabled and stable\u001b[22m\n\u001b[2m - scrolling into view if needed\u001b[22m\n\u001b[2m - done scrolling\u001b[22m\n\u001b[2m -
from
subtree intercepts pointer events\u001b[22m\n\u001b[2m - retrying click action, attempt #45\u001b[22m\n\u001b[2m - waiting 500ms\u001b[22m\n\u001b[2m - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m - element is not stable - waiting...\u001b[22m\n\n\n\u001b[0m \u001b[90m 22 |\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 23 |\u001b[39m \u001b[90m// Click on