It is time again for an extensive tutorial. This time, a tiny test application for passive and active information gathering. After the instruction you are welcome to improve the application with more features! Okay let’s start…
What should it do?
The security tester selects a information gathering method first. As second step the testers insert the URL or IP in a testfield and press a button. The result should printed out in a text area. The GUI should look like this:
How it is implemented?
The prefered language is Python 2.7. So it is portable to different OS and for the most of methods are already packages available. The GUI is done with Tkinter. Tkinter provides all objects which are needed as widgets and ranges for this scope out completely. The file and folder structure look like:
With DalekJS you can automate your functional GUI tests very easy. This article describe how to prepare the test environment on CentOS.
Setup
First, the necessary packages are installed.
# install EPEL (Extra Packages for Enterprise Linux)
$ yum install -y epel-release
# check repositories
$ yum repolist
# update all
$ yum -y update
# install packages
$ yum install -y vim nodejs npm bzip2 freetype fontconfig
# check versions of nodejs and npm
$ node --version
$ npm --version
# change to tmp folder
$ cd /tmp/
# download PhantomJS and unzip
$ curl -O https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2
$ tar xvf phantomjs-1.9.2-linux-x86_64.tar.bz2
# copy binary, delete unneeded files and check version
$ cp phantomjs-1.9.2-linux-x86_64/bin/phantomjs /usr/local/bin/
$ rm -fr phantomjs-1.9.2-linux-x86_64
$ rm -f phantomjs-1.9.2-linux-x86_64.tar.bz2
$ phantomjs --version
# install dalek-cli (global) and check version
$ npm install dalek-cli -g
$ dalek --version
It is also possible to compile PhantomJS itself, but this takes a lot of time.
Prepare test project
Once all is installed without any issues you can start to create the test project.
# change to home folder
$ cd ~/
# create project folder and change into
$ mkdir DalekTest && cd DalekTest
# create package.json interactively
$ npm init
# install dalekjs on project
$ npm install dalekjs --save-dev
Create test case
Now it is time for the first Test Case. I have used the example from Dalek website.
# create test case file
$ touch test_title.js
# insert content
$ vim test_title.js
module.exports = {'Page title is correct': function (test) {
test
.open('http://google.com')
.assert.title().is('Google', 'It has title')
.done();
}
};
Run test
By default DalekJS use PhantomJS as browser. For running the test case simple use dalek command and as argument the test case file (*.js).
# change the permission
$ chmod 750 MyProject/cgi-bin/test.py
Run CGIHTTPServer
# change to project folder
$ cd MyProject/
# run CGIHTTPServer
$ python -m CGIHTTPServer
Now open the browser and call URL: “http://localhost:8000/cgi-bin/test.py“
Python 3
In Python 3.3, the replacement for python -m CGIHTTPServer is python3 -m http.server --cgi.
Other examples
# show help
$ python3 -m http.server --help
# run server in Python 3
$ python3 -m http.server 8080
# run server in Python 3 on loopback interface
$ python3 -m http.server 8080 --bind 127.0.0.1
Mac OS X latest Yosemite comes with Python version 2.7, but not with pip (package manager). If you have Command Line Tools installed, the installation of pip is very simple.
Installation
# install command line tools (if not installed)
$ xcode-select --install
# install pip via easy_install
$ sudo easy_install pip
# show current pip version (optional)
$ pip --version
Upgrade
# show current pip version (optional)
$ pip --version
# upgrade pip
$ sudo pip install --upgrade pip
In case you need to install and manage different versions of Python, I can recommend to read this article.
There are several HAR file viewers online but sometimes you need the HAR viewer offline. It is very simple for Mac OS X user to get a local instance running.
Now download the latest Harviewer.zip and unzip into the user “Sites” folder. Rename the folder and setting up the permissions.
# go into Downloads
$ cd ~/Downloads/
# create new folder
$ mkdir harviewer
# unzip into new folder
$ unzip harviewer-2.0-15.zip -d harviewer
# move folder into user sites
$ mv harviewer ~/Sites/
# go into sites and change access rights
$ cd ~/Sites/
$ chmod +x harviewer/
Result
Now open a browser and call URL like: “http://localhost/~<user>/harviewer/“. As last step drag the generated HAR file into the browser. You should see something like this:
For various reasons screenshots for webpages are needed. If automated test scripts fail, documentations must be created or in some other situations. With PhantomJS it is very easy to create these screenshots very fast by command-line. All what is needed a small JavaScript like this.
JavaScript
var phantom;
var console;
var system = require('system');
var fs = require('fs');
var page = require('webpage').create();
var Info = {
isDate: function () {
'use strict';
var mydate = new Date().toDateString();
return mydate;
},
isTime: function () {
'use strict';
var mytime = new Date().getTime();
return mytime;
}
};
var Target = {
isLocation: function () {
'use strict';
var args = system.args,
mylocation = 'http://google.com';
if (args.length > 1) {
mylocation = system.args[1];
console.log('[LOG] use argument location');
} else {
console.log('[LOG] use default location');
}
return mylocation;
},
isSaveFolder: function () {
'use strict';
var folder = 'log';
if (!fs.exists(folder)) {
console.log('[LOG] creat directory ' + folder);
fs.makeDirectory(folder);
}
if (!fs.isWritable(folder)) {
console.error('[LOG] ' + folder + ' is not writable!');
phantom.exit(1);
}
return folder;
}
};
page.open(Target.isLocation(), function (status) {
'use strict';
switch (status) {
case 'success':
console.log('[LOG] page open successfully' + Info.isDate());
var folder = Target.isSaveFolder();
page.render(folder + fs.separator + Info.isTime() + '.png');
phantom.exit(0);
break;
case 'fail':
console.error('[LOG] page not open successfully');
phantom.exit(1);
break;
default:
console.error('[LOG] fail to open with unknown status:' + status);
phantom.exit(1);
break;
}
});
After save the script you can run it like:
# screenshot of softwaretester.info
$ phantomjs screenshot.js "http://softwaretester.info"