In nightwatch framework difference nightwatch.conf.BASIC.js vs nightwatch.conf.js - node.js

What is the difference between nightwatch.conf.BASIC.js and
nightwatch.conf.js in nightwatch framework.
And what is basic requirement for setup nightwatch framework with
node js and selenium

There is no differences between nightwatch.conf.BASIC.js and nightwatch.conf.js.
You have just to know 5 things:
You can name your config file as you want (nightwatch.conf.BASIC.js, nightwatch.json, nightwatch.conf.js or anything.json or anything.js)
You can have more than 1 config file per project.
When you put your Nightwatch configuration in a file named nightwatch.json or nightwatch.conf.js you don't need to say which configuration file should be used since
A nightwatch.conf.js file or a nightwatch.json file will also be loaded by default, if found.
Just keep in mind that:
The nightwatch.conf.js always takes precedence over
nightwatch.json if both are present.
In this case, you can launch your tests like this:
$> nightwatch
When you put your Nightwatch configuration in an other file, you must tell Nightwatch where are the configurations to use. In this case you need to write your tests like this (for example in Node.js):
module.exports = (function(settings) {
//....
})(require('path/to.your/config/file'));
or
var config = require('path/to.your/config/file');
module.exports = {
//....
};
In this case, you need to specify which configuration file to take when launching tests:
$> nightwatch --config path/to.your/config/file
Since naming your config file nightwatch.conf.js or nightwatch.json doesn't change anything to Nightwatch, is there a reason to choose one and not the other?
Answer: Yes!
Why?: Sometimes you need to write a JavaScript code in your configuration file. In this case your file should be a .js file and not a .json file.
Example of use? When you have many environments to test, maybe you don't want to update many lines to change the same information. So you write a nightwatch.conf.js (The objective is to just change one line when you want to deactivate video instead of going to each environment in a .json file and make changes):
nightwatch_config = {
src_folders : [ "a/file/to/test" ],
selenium : {/*...*/},
common_capabilities: {/*...*/},
test_settings: {
default: {},
chrome: {desiredCapabilities: {browser: "chrome"}},
firefox: {desiredCapabilities: {browser: "firefox"}},
safari: {desiredCapabilities: {browser: "safari"}},
ie: {desiredCapabilities: {browser: "internet explorer"}}
}
};
for(var i in nightwatch_config.test_settings){
var config = nightwatch_config.test_settings[i];
for(var j in nightwatch_config.common_capabilities){
config['desiredCapabilities'][j][browserstack.video] = true;
}
}
module.exports = nightwatch_config;

Related

How to get wdio running through IntelliJ run/debug configurations?

I can run the tests from the command line using
> ./node_modules/.bin/wdio wdio.conf.js
But if I try to run this from IntelliJ's run/debug configuration I get various different errors.
Featurefile or directory: /path_to_my_feature_file/myfeature.feature
Cucumber.js arguments: wdio.conf.js
Executable path: /path_to_my_project/node_modules/.bin/wdio
gives me
more than one config file specified
If I remove the Cucumber Arguments, it just runs indefinitely. If I stop it running I get the error
Failed loading configuration file
It looks like there's some kind of issue with loading the config file, but I don't know how to fix it. Any suggestions? wdio.conf.js exists and is in the project root.
WebStorm doesn't provide any special support for wdio test runner. But you can still run/debug the tests using Node.js run configuration like the following:
But this doesn't work out of the box due to problems related to using non-tty environment (Node.js run console in IDEA is non-tty). As a workaround, please try commenting out if (process.stdin.isTTY) and else branch in node_modules\webdriverio\build\lib\cli.js:
//if (process.stdin.isTTY) {
launch();
/*
} else {
var stdinData = '';
/!*
* get a list of spec files to run from stdin, overriding any other
* configuration suite or specs.
*!/
var stdin = process.openStdin();
stdin.setEncoding('utf8');
stdin.on('data', function (data) {
stdinData += data;
});
stdin.on('end', function () {
if (stdinData.length > 0) {
args['specs'] = stdinData.trim().split(/\r?\n/);
}
launch();
});
}*/
see WEB-31745
To get this to work with webdriverio v5 and higher you need to set in the debug configurations screen above
the path to the runner as the javascript file to execute:
node_modules#wdio\cli\bin\wdio.js
and the conf file as the application parameters:
wdio.conf.js

Given the following file structure, how can you run a basic protractor test?

I have been trying to follow a tutorial given HERE. However, when I try to start the protractor test given, no tests seem to run at all. My webdriver-manager seems to run perfectly however. Basically nothing happens.
I have tried the following:
node protractor conf.js
node node_modules/protractor conf.js
node node_modules/protractor node_modules/protractor/conf.js
node node_modules/protractor node_modules/protractor/tests/conf.js
None of these work, and the first one throws an error. I've tried putting copies of the files in multiple directories, but none of those seem to work either. I'm no exactly sure what the issue is, but this is how much files are setup.
ui_directory/ <-- This is the overall directory for my web projects
ui_directory/conf.js
ui_directory/todo-spec.js
ui_directory/node_modules/
ui_directory/node_modules/protractor/
ui_directory/node_modules/protractor/conf.js
ui_directory/node_modules/protractor/todo-spec.js
ui_directory/node_modules.protractor/tests/
ui_directory/node_modules.protractor/tests/conf.js
ui_directory/node_modules.protractor/tests/todo-spec.js
What exactly is the proper command to run the tests from the tutorial? All todo-spec.js and conf.js files are the same.
My conf.js file contains the following:
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['todo-spec.js']
};
Please follow the below steps to run basic protractor Test.
Create a Folder, Say example in Desktop (Folder name is protractor)
Create a config and Spec file with .js extension
Make sure both the files are in Same Location / Folder
Open Command Prompt, And Navigate to project Folder (protractor)
Once navigated to project folder, Type as in bracket:
[protractor config.js] // This will execute protractor Test
Example of Basic Protractor Config File is given as
exports.config = {
//The address of a running selenium server.
seleniumAddress: 'http://localhost:4444/wd/hub',
//Here we specify the name of the specs files.
framework: 'jasmine',
specs: ['Protractor_spec.js'],
jasmineNodeOpts: {
showColors: true,
includeStackTrace: true,
defaultTimeoutInterval: 1440000
},
}

How to read a jasmine spec file config variable from the jasmine.json file

I am learning the node.js jasmine code testing framework and would like to set a variable that will be reused in several test spec files. Is there a way to read a config variable from the jasmine.json file?
I have used the 'process.env.npm_variablename' for normal package.json node.js config variables, but that file is not loaded by the jasmine test runner.
Part way through typing the question, I thought of a solution that seems to be working: load the file with the 'require' function. It looks like this in the initialized current 2.6 jasmine structure:
var jas_config = require('./support/jasmine.json');
if (jas_config.verbose_output) {
console.log("loading test-spec.js");
}

karma error 'There is no timestamp for'

Trying to get karma working with requirejs. I don't understand why I am getting all of these errors when running Karma:
ERROR: 'There is no timestamp for /base/test/mainSpec.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/app/main.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/bower_components/jquery/jquery.js?bust=1387739317116!'
When I go to the network tab in inspector, all of the files are there with no 404s.
I'm a little confused because karma seems to be looking for a 'base' directory but there is no 'base' directory in my project. According to the karma docs:
Karma serves files under the /base directory. So, on the server
requests to files will be served up under
http://localhost:9876/base/*. The Require.js config for baseUrl gives
a starting context for modules that load with relative paths. When
setting this value for the Karma server it will need to start with
/base. We want the baseUrl for our tests to be the same folder as the
base url we have in src/main.js, so that relative requires in the
source won’t need to change. So, as we want our base url to be at
src/, we need to write /base/src.
This confusing to say the least. Am I supposed to have a baseUrl configuration in my main.js file that points to '/base'?
note: This post was valid by Karma in 2014 Jan 16. I am not certain of the current state of that lib, maybe they fixed their weird configuration logic and added meaningful error messages. If not, then this post can be probably very helpful by fixing configuration issues related to Karma.
These kind of errors occur by misconfiguration. You should add everything your test uses to the file patterns in your config file.
For example:
module.exports = function (config) {
config.set({
basePath: './',
frameworks: ['jasmine', 'requirejs'],
files: [
{pattern: 'test/bootstrap.js', included: true},
{pattern: 'test/**/*.js', included: false},
{pattern: 'src/**/*.js', included: false},
{pattern: 'vendor/**/*.js', included: false}
],
exclude: [
],
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Firefox'],
captureTimeout: 6000,
singleRun: false
});
};
In this example the bootstrap.js is the only file included by Karma in the HTML, the other files are dependencies which are loaded by the code in the bootstrap.js. The pattern order is very important and sadly it is far from logical: the next pattern does not override the previous one. So if I'd give the test/**/*.js pattern as first and test/bootstrap.js as second, it would not work because the bootstrap would not be included. In these cases Karma sends you an "empty testsuite" message, which is useless if you don't know how to configure it...
If your tests try to use a file which is not covered by the patterns you gave in your Karma configuration file, then you will get the "There is no timestamp for xy" error message, which is very similar to the previously mentioned "empty testsuite". If you don't know the system you won't have a clue, what it means, or what you have to do in order to fix it ...
The exclude part of the configuration object is for files, which have been added to the file patterns for inclusion, but you don't want to include or use them in your tests. These can be for example requirejs configuration files for development and production environments, etc...
For me it was simply making the mistake of setting basePath: 'base' instead of baseUrl: '/base'.
baseUrl: '/base' ftw!
The basePath is to identify the root of your project relative to the configuration file (karma.conf.js). Take a look at this example: https://github.com/karma-runner/karma/blob/v0.8.5/test/client/karma.conf.js
In the browser, I also got this error about the timestamp but it doesn't affect anything. The tests are working properly. I guess it should be a warning more than an error :-)
Jeff's right, you should exclude the requirejs config file of your app, because "we don't want to actually start the application in our tests. [LINK]".
The test-main.js config file is a separate file from the requirejs config file your app uses, which in your case might be config.js or main.js, depending on where you config your requirejs.
They both configures path and dependencies (could be specifying about the same ones), but the former is to provide requirejs support for the tests you write. This whole requirejs setup is a separate one from the requirejs you use in your app. So don't include the latter, it confuses Karma.
And the link above is a working Karma with its requirejs demo, check it out.
After trying all the solutions posted on different sources, Finally I got it Fixed. Check it here: Make "no timestamp" error configurable #6 .
Example from the issue for the karma.conf.js file:
client: {
requireJsShowNoTimestampsError: '^(?!.*(^/base/app/node_modules/))'
}
in my karma.conf.js file, I simply excluded my file that contained my require.config function (in my case happened to be config.js) and the errors went away.
exclude: [
'app/config.js',
'bower_components/jasmine/**/*.js'
],
This error can also happen when the files in question don't actually exist!
So check to make sure that the file you're getting this error for actually exists in your project!
Once you find out what the files are, you can ignore them using a pattern like so in your karma.conf.js, if it turns out their existence should be ignored in some cases:
exclude: [
'path/to/files/to/ignore/**/*.js'
]
I had an exact same error in my project and I found that the best and fastest way to debug where is the problem is to list the files that our karma have loaded.
If you used karma init (if not, just do it) and respond YES to the question about the usage of RequireJS you probably have a file like this:
var tests = [];
var TEST_REGEXP = /(spec|test)\.js$/i;
var BASE_URL = '/base/build/js';
var BASE_URL_REGEXP = /^\/base\/build\/js\/|\.js$/g;
// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function (file) {
console.log(file;) // ADD THIS CONSOLE LOG TO LIST LOADED FILES
if (TEST_REGEXP.test(file)) {
var normalizedTestModule = file.replace(BASE_URL_REGEXP, '')
tests.push(normalizedTestModule)
}
})
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: BASE_URL,
paths: {
},
shim: {
},
deps: tests,
// we have to kickoff jasmine, as it is asynchronous
callback: window.__karma__.start
})
Then you can play with your karam.conf.js file and load new files to check whats going on in karma local path.
Expanding from #Naruto Sempai's answer:
I resolved this issue by first setting the basePath attribute in my karma.conf.js file. This path contains the needed ../ (previous directory) strings until my path was at the root of my source/test files.
Then I modified my test-main.js file (containing my RequireJS configuration) and set the baseUrl to /base.
Now, no timestamp errors.
--
To illustrate my environment and paths I configured, heres a basic setup example:
Source file location:
/Users/ben/some-project/src/main/resources/var/www/project/js/app
Test file location:
/Users/ben/some-project/src/test/var/www/project/
Karma Config location:
/Users/ben/some-project/src/test/var/www/project/karma.conf.js
Test RequireJS Config location:
/Users/ben/some-project/src/test/var/www/project/test-main.js
My karma.conf.js:
module.exports = function (config) {
config.set({
basePath: '../../../../'
});
}
to make my "root" at /Users/ben/some-project/src/.
My test-main.js:
requirejs.config({
baseUrl: '/base'
});

Use RequireJS config file as the build file?

I've got some paths configured in require-config.js as follows:
var require = {
baseUrl: '/javascript',
paths: {
'jquery': 'jquery/jquery-1.8.1.min'
// etc. -- several paths to vendor files here
},
}
I am trying to get the optimization working for deployment. The docs say I should have a build.js that looks something like this:
({
baseUrl: 'javascript',
paths: {
'jquery': 'jquery/jquery-1.8.1.min'
},
name: 'main',
out: 'main-build.js'
})
Is there a way to have the optimizer read my config file instead of (or in addition to) build.js? I don't want to have to manually keep the paths configured the same in both files if they change.
I tried to just run node r.js -o path/to/require-config.js, but it threw an error, "malformed: SyntaxError: Unexpected token var"
Edit: for clarification, my require-config.js file is the config only, not my main module. I did this so I could use the same configuration but load a different main module when unit testing.
You'll need to adjust the way your config options are defined. Taken from the RequireJS documentation:
In version 1.0.5+ of the optimizer, the mainConfigFile option can be used to specify the location of the runtime config. If specified with the path to your main JS file, the first requirejs({}), requirejs.config({}), require({}), or require.config({}) found in that file will be parsed out and used as part of the configuration options passed to the optimizer:
So basically you can point your r.js build file to your config options that will also be shared with the browser.
You will need to make use of the mainConfigFile option
For other's reference:
https://github.com/jrburke/r.js/blob/master/build/example.build.js
The build settings (no need to repeat your config.js lib inclusions here):
baseUrl: 'app',
name: 'assets/js/lib/almond', // or require
// Read config and then also build it into the app
mainConfigFile: 'app/config.js',
include: ['config'],
// Needed for almond (and does no harm for require)
wrap: true,

Resources