How do you load multiple chrome extensions when running nightwatch tests? - javascript

I've figured out how to run one chrome extension by using the following:
{
"src_folders" : ["test"],
"webdriver" : {
"start_process": true,
"server_path": "node_modules/.bin/chromedriver",
"cli_args": ["--verbose"],
"port": 9515
},
"test_settings" : {
"default" : {
"desiredCapabilities": {
"browserName": "chrome",
"chromeOptions" : {
"args": [
"--load-extension=/pathToFirstExtension",
]
}
}
}
}
}
However, running two extensions is not working.
I've tried the following:
"args": [
"--load-extension=/pathToFirstExtension, /pathToSecondExtension",
]
And this:
"args": [
"--load-extension=/pathToFirstExtension",
"--load-extension=/pathToSecondExtension",
]
And this:
"args": [
"--load-extension=/pathToFirstExtension /pathToSecondExtension",
]
And also base64 encoded strings comma separated in a list like this:
chromeOptions: {
extensions: [
keywords.base64,
avgPrice.base64
]
}
I'm using module.exports in individual js files where the base64 encoded strings are in objects with a key of base64
How do you load more than one chrome extension for nightwatch tests?

The cuplrit was the space between the comma separated strings!
In case anyone finds this useful - this is now working for me:
const chromedriver = require('chromedriver');
module.exports = {
src_folders : ["test"],
test_settings: {
default: {
webdriver: {
start_process: true,
server_path: chromedriver.path,
port: 4444,
cli_args: ['--port=4444']
},
desiredCapabilities: {
browserName: 'chrome',
javascriptEnabled: true,
acceptSslCerts: true,
chromeOptions: {
args: [
"--load-extension=/pathToExtensionOne,/pathToExtensionTwo",
"window-position=2560,0",
"window-size=400,300"
]
}
}
},
chrome: {
webdriver: {
server_path: chromedriver.path
},
desiredCapabilities: {
browserName: 'chrome',
javascriptEnabled: true,
acceptSslCerts: true,
chromeOptions: {
args: []
}
}
}
}
};
I'm also able to set the window size / position.
FWIW, I'm using a nightwatch.conf.js instead of nightwatch.json
In my package.json:
"scripts": {
"nightwatch": "nightwatch -c ./nightwatch.conf.js"
}
To run this, execute the following in the terminal:
npm run nightwatch

Related

firebase ESLINT questions

I am having some small issues with ESlint
here is the code snip:
module.exports = {
root: true,
env: {
es6: true,
node: true,
},
extends: [
"eslint:recommended",
"google",
],
rules: {
quotes: ["error", "double"],
},
parserOptions: {
ecmaVersion: 8, // or 2017
},
};
questions::
I have a max of 80 characters per line, how do I remove this?
I can't use let to run a for loop, it always changes to const
for ( let userData in chatUsersData) {
if ( userData["userId"]!=senderUserId) {
receiverUserId = userData["userId"];
}
}

How can I get full HTML mochawesome report using codeceptjs running test in parallel mode?

I am using codeceptjs library in order to develop and run automated tests. Currently I'm in process of run those tests in paralell using NodeJS` workers. CodeceptJS proposes this opportunity and mention it in its documentation - https://codecept.io/parallel/#parallel-execution-by-workers.
Also I'm using such reporters as the Mochawesome, mocha-junit-reporter and codeceptjs-cli-reporter that I can use all-in-one with the help of Mocha-multi package.
Command which I use in order to run my tests is
codeceptjs run-workers --suites 4 --reporter mocha-multi
My codecept.conf.js file looks like that:
// Инициализация расширения dotenv, чтобы переменные из файла .env были доступны в тестах через объект process.env
require('dotenv').config();
const { setHeadlessWhen } = require('#codeceptjs/configure');
const { devices } = require('playwright');
const { BASE_URL, API_URL } = require('./utils/endpoints');
// Для запуска тестов в headless-режиме (как в bamboo) выполняется команда
// yarn e2e:ci
// Для запуска тестов в окне браузера выполняется команда
// yarn e2e
setHeadlessWhen(process.env.HEADLESS === 'true');
exports.config = {
tests: './e2e/*/*.test.js',
output: './output',
helpers: {
Playwright: {
url: `https://${BASE_URL}`,
show: true,
browser: 'chromium',
waitForNavigation: 'domcontentloaded',
waitForTimeout: 3000,
getPageTimeout: 10000,
emulate: devices['iPhone 6'],
},
REST: {
endpoint: `https://${API_URL}`,
},
Auth: {
require: './helpers/auth.js',
},
DataGenerator: {
require: './helpers/data-generator.js',
},
Cabinet: {
require: './helpers/cabinet.js',
},
Moderation: {
require: './helpers/moderation.js',
},
Advert: {
require: './helpers/advert.js',
},
User: {
require: './helpers/user.js',
},
Faker: {
require: './helpers/faker.js',
},
ChaiWrapper: {
require: 'codeceptjs-chai',
},
Mochawesome: {
uniqueScreenshotNames: true,
},
},
include: {
I: './steps_file.js',
// pages
SubmitPage: './pages/kaspi/Submit.js',
IndexPage: './pages/kaspi/Index.js',
AdvertPage: './pages/kaspi/AdvertPage.js',
EditAdvertPage: './pages/kaspi/EditAdvert.js',
CabinetActive: './pages/kaspi/CabinetActive.js',
// steps
EditAdvertStep: './steps/kaspi/EditAdvert.js',
AdvertPageStep: './steps/kaspi/AdvertPage.js',
CabinetStep: './steps/kaspi/Cabinet.js',
},
bootstrap: null,
mocha: {
reporterOptions: {
'codeceptjs-cli-reporter': {
stdout: '-',
options: {
verbose: true,
steps: true,
},
},
mochawesome: {
stdout: '-',
options: {
reportDir: './output',
reportFilename: 'report',
},
},
'mocha-junit-reporter': {
stdout: '-',
options: {
mochaFile: './output/report.[hash].xml',
attachments: true,
},
},
},
},
name: 'market-spa',
plugins: {
pauseOnFail: {},
retryFailedStep: {
enabled: true,
},
tryTo: {
enabled: true,
},
screenshotOnFail: {
enabled: true,
},
},
};
The problem is that when I get an HTML report created by Mochawesome it contains only results of the last NodeJS` worker. In other words, I expect that my HTML report will contain results of all of my 20 automated tests, but it only contains the results of 5 tests (those 15 tests were also running, but left no results).
By the way, the xml results that mocha-junit-reporter generates are doing well - it generates 4 different files with the results of each test suit.

Nuxt/ESLint - Parsing error: Must use import to load ES Module

I am using Nuxt 2.15.7 in VS Code, using Node version 14.17.1 and the eslint extension.
The problem
I started seeing a red squiggly line under the 1st character of every file. When hovering over it, this is the error I see:
require() of ES modules is not supported.
require() of C:\Users\SR Gears\Documents\work\my-website\node_modules\eslint\node_modules\eslint-scope\lib\definition.js
from C:\Users\SR Gears\Documents\work\my-website\node_modules\babel-eslint\lib\require-from-eslint.js
is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename definition.js to end in .cjs,
change the requiring code to use import(),
or remove "type": "module" from
C:\Users\SR Gears\Documents\work\my-website\node_modules\eslint\node_modules\eslint-scope\package.json.eslint
What I have tried so far
First, I tried renaming the appropriate files as listed above in the error, and restarting the eslint server, but the error remains.
So, I went over to the eslint extension in VS Code and read the following:
The approval flow to allow the execution of a ESLint library got reworked. Its initial experience is now as follows:
- no modal dialog is shown when the ESLint extension tries to load an ESLint library for the first time and an approval is necessary. Instead the ESLint status bar item changes to ESLint status icon indicating that the execution is currently block.
- if the active text editor content would be validated using ESLint, a problem at the top of the file is shown in addition.
The execution of the ESLint library can be denied or approved using the following gestures:
- clicking on the status bar icon
- using the quick fix for the corresponding ESLint problem
- executing the command ESLint: Manage Library Execution from the command palette
Okay, so I tried the above suggestions:
clicking on the status bar icon (it isn't there in my status bar)
using the quick fix for the corresponding ESLint problem (shows no quick fix available)
executing the command ESLint: Manage Library Execution from the command palette (I get a message that this request is unknown)
Potential Fix with error
So, I navigated over to eslintrc.js I hovered over module.exports = { on line 1, and got the lightbulb icon show. The Quick Fix says Convert to ES6 module. When I click this, the file is updated. All variable keys within the options are updated to have export in front of them. This does remove the error line at the top of the files, but gives a new error for export const extends: [] variable:
'extends' is not allowed as a variable declaration name.. My eslintrc.js file (before updating to ES6 module) is here:
eslintrc.js
module.exports = {
root: true,
env: {
browser: true,
node: true
},
parserOptions: {
parser: 'babel-eslint'
},
extends: [
'plugin:nuxt/recommended',
'plugin:vue/recommended',
'eslint:recommended',
// 'prettier/vue',
'plugin:prettier/recommended'
],
globals: {
$nuxt: true,
page: true,
browser: true,
context: true,
jestPuppeteer: true
},
plugins: ['nuxt', 'vue', 'prettier'],
rules: {
'new-cap': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'vue/component-name-in-template-casing': ['off', 'PascalCase'],
'vue/attribute-hyphenation': ['warn'],
'vue/no-unused-components': ['warn'],
'vue/html-self-closing': [
'error',
{
html: {
void: 'any',
normal: 'always',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/max-attributes-per-line': 'off',
'vue/no-v-html': 'off',
'no-unused-vars': ['warn'],
eqeqeq: ['warn'],
'no-lonely-if': ['warn'],
'require-await': ['warn'],
'handle-callback-err': ['warn'],
'space-before-function-paren': 0
}
}
One other potential fix - but not for me
For anyone else with the same errors, there is a fix here, (that also worked for me): ESlint - Error: Must use import to load ES Module `
I cannot use this fix though, as my team suggested that adjusting babel settings can create errors elsewhere.
As that cannot be my solution, would anyone else know how to manage this error? Here is my nuxt.config file. If you need to see something else, I can update it here too.
nuxt.config
import { storyblokConfig, localeMessages } from './config'
export default {
// Target: https://go.nuxtjs.dev/config-target
target: 'server',
ssr: true,
dev: false,
// Global page headers: https://go.nuxtjs.dev/config-head
head: {
title: '',
htmlAttrs: {
lang: 'en'
},
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' }
],
link: [
{
rel: 'icon',
sizes: '192x192',
href: '/favicon/android-chrome-192x192.png'
},
{
rel: 'icon',
sizes: '512x512',
href: '/favicon/android-chrome-512x512.png'
},
{
rel: 'apple-touch-icon',
sizes: '180x180',
href: '/favicon/apple-touch-icon.png'
},
{ rel: 'icon', sizes: '16x16', href: '/favicon/favicon-16x16.png' },
{ rel: 'icon', sizes: '32x32', href: '/favicon/favicon-32x32.png' },
{ rel: 'icon', type: 'image/x-icon', href: '/favicon/favicon.ico' },
{ rel: 'manifest', href: '/favicon/site.webmanifest' }
]
},
// Global CSS: https://go.nuxtjs.dev/config-css
css: [
'~assets/styles/main.css',
'~assets/fonts/fabrikat/stylesheet.css',
'~assets/fonts/pangram/stylesheet.css'
],
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: [
{ src: '~/plugins/logger.js' },
{ src: '~/plugins/nujek-ui.js' },
{ src: '~/plugins/validation.js' },
{ src: '~/plugins/utils.js' },
{ src: '~/plugins/vue-tailwind.js' },
{ src: '~/plugins/rich-text-renderer.js' },
{ src: '~/plugins/defaultButton.js' }
],
// Auto import components: https://go.nuxtjs.dev/config-components
components: [{ path: '~/components', pathPrefix: false, prefix: '' }],
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
buildModules: [
// https://go.nuxtjs.dev/eslint
'#nuxtjs/eslint-module',
// https://go.nuxtjs.dev/tailwindcss
'#nuxtjs/tailwindcss',
'#nuxtjs/composition-api/module',
'#nuxtjs/tailwindcss',
[
'#nujek/ui',
{
withConsole: true,
storeTemplates: {
nav: true
}
}
],
['#nujek/storyblok']
],
nujekStoryblok: {
storyblokConfig,
withConsole: false,
debug: true
},
// Modules: https://go.nuxtjs.dev/config-modules
modules: ['nuxt-i18n', '~/modules/nuxt-storyblok-queries/lib/module.js'],
storyblokQueries: storyblokConfig,
i18n: {
locales: [
{
code: 'en',
iso: 'en-US'
},
{
code: 'de',
iso: 'de-DE'
}
],
defaultLocale: 'de',
strategy: 'prefix_except_default',
detectBrowserLanguage: {
useCookie: true,
cookieKey: 'i18n_redirected',
redirectOn: 'root'
},
vueI18n: {
fallbackLocale: 'de',
silentTranslationWarn: true,
messages: localeMessages
},
vuex: {
syncLocale: true,
syncMessages: true
}
},
// publicRuntimeConfig: {
// accessToken: process.env.SB_CLIENT_ACCESS_TOKEN
// },
// Build Configuration: https://go.nuxtjs.dev/config-build
build: {
transpile: ['vee-validate', '#marvr/storyblok-rich-text-vue-renderer']
}
}
c:/users/user/AppData/Roaming/Code/User/settings.json
{
"workbench.colorTheme": "Default Dark+",
"terminal.integrated.defaultProfile.windows": "Git Bash",
"editor.wordWrap": "on",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.validate": ["javascript"]
}
I met this error today on a fresh installation of nuxt.
It would npm run dev fine on the first time, but whenever I changed a file, the hot reloading would give an eslint error, as if trying to lint my eslint files.
I solved it by updating Nodejs and npm to their latest version and creating a new nuxt app.
It's probably not the answer you've been looking for, but maybe it will help others.

TypeError ERR_UNESCAPED_CHARACTERS on testing Vue project using Nightwatch

I have a problem trying to setup my Nightwatch environment with Vue CLI. At this point, I just want to make it work with Chrome (we'll see for Firefox soon) but when I run a simple test, It doesn't work.
Here is my test file:
module.exports = {
'default e2e tests': browser => {
browser
.url("http://localhost:8080")
.waitForElementVisible('#app', 5000)
.assert.ok(true)
.end()
}
}
throwing the folowing error:
Error while running .isElementDisplayed() protocol action: TypeError [ERR_UNESCAPED_CHARACTERS]: Error while trying to create HTTP request for "/wd/hub/session/28a21f6ed7009d54e70663e3ed407eb6/element/[object Object]/displayed": Request path contains unescaped cha
racters
at new ClientRequest (_http_client.js:115:13)
at Object.request (http.js:42:10)
at HttpRequest.createHttpRequest (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\http\request.js:138:55)
at HttpRequest.send (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\http\request.js:217:29)
at Promise (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\transport\transport.js:193:15)
at new Promise (<anonymous>)
at Selenium2Protocol.sendProtocolAction (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\transport\transport.js:191:12)
at Selenium2Protocol.runProtocolAction (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\transport\jsonwire.js:61:17)
at Object.isElementDisplayed (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\transport\actions.js:54:10)
at Selenium2Protocol.executeProtocolAction (C:\Users\john.doe\Desktop\Développement\App\vue\node_modules\nightwatch\lib\transport\transport.js:239:48)
I get this error when I provide a valid selector. I tried with a non existing selector and, in this case, I get a simple ... expected "visible" but got: "not found".
Here is my Nightwatch configuration file:
module.exports = {
"src_folders": ["tests/e2e/specs"],
"output_folder": "tests/e2e/reports",
"page_objects_path": "tests/e2e/page-objects",
"custom_assertions_path": "tests/e2e/custom-assertions",
"custom_commands_path": "tests/e2e/custom-commands",
"test_workers": {
"enabled": true,
"workers": "auto"
},
"selenium" : {
"start_process" : true,
"server_path" : "./node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-3.141.59.jar",
"log_path" : "tests/e2e/logs",
"host" : "127.0.0.1",
"port" : 4444,
"cli_args" : {
"webdriver.chrome.driver" : "./node_modules/chromedriver/lib/chromedriver/chromedriver.exe"
}
},
"test_settings" : {
"default" : {
"launch_url": 'https://www.google.com',
"selenium_port": 4444,
"selenium_host": "localhost",
"silent": true,
"screenshots": {
"enabled": true,
"path": ""
},
"desiredCapabilities": {
"browserName": "chrome",
"javascriptEnabled": true,
"acceptSslCerts": true
}
},
"chrome": {
"desiredCapabilities": {
"browserName": "chrome",
"chromeOptions": {
"w3c": false
}
},
"webdriver": {
"use_legacy_jsonwire": false
}
},
"firefox": {
"desiredCapabilities": {
"browserName": "firefox",
"alwaysMatch": {
"acceptInsecureCerts": true,
"moz:firefoxOptions": {
"args": []
}
}
}
}
}
};
Any ideas of what could produce this error?
Let me know if I should provide other files from the node_modules folder for instance.
Following the link of Estus Flask solved my problem:
Simply add this lines in the default configuration
"chromeOptions": {
"w3c": false
}

good module is not working as expected

I have registered good plugin in hapi server and all of my responses are getting logged in. But when I do a console.log, console.error, console.warn, console.info all the logs are getting printed in plain text but not in the good plugin way.
Can anyone help me with what I might have missed.
I have read following documentation:
https://github.com/hapijs/good/blob/HEAD/API.md
https://hapijs.com/tutorials/getting-started?lang=en_US
console.log naturally goes to console. If you want to print things to console use something like:
request.server.log(['error', 'contentFetch'], err);
This is my good plugin configuration maybe you can ditch and find something works for you.
logging: {
$filter: 'env',
production: {
reporters: {
file: [{
module: 'good-squeeze',
name: 'Squeeze',
args: [{error: '*', log: ['error'], ops: '*'}]
}, {
module: 'good-squeeze',
name: 'SafeJson',
args: [
null,
{separator: '\n'}
]
}, {
module: 'rotating-file-stream',
args: [
'error.log',
{
size: '10M', // rotate every 10 MegaBytes written
interval: '1d', // rotate daily
compress: 'gzip', // compress rotated files
path: './logs'
}
]
}]
}
},
$default: {
ops: {
interval: 1000
},
reporters: {
console: [{
module: 'good-squeeze',
name: 'Squeeze',
args: [{log: '*', response: '*'}]
}, {
module: 'good-console'
}, 'stdout']
}
}
},
Registering like this
{
plugin: {
register: 'good',
options: Config.get('/logging')
}
}

Categories