Thursday, November 14, 2013

Mobile - Native vs Web vs Hybrid App

Mobile - Native vs Web vs Hybrid App

Native apps live on the device and are accessed through icons on the device home screen. Native apps are installed through an application store (such as Google Play or Apple’s App Store). They are developed specifically for one platform, and can take full advantage of all the device features–they can use the camera, the GPS, the accelerometer, the compass, the list of contacts, and so on. They can also incorporate gestures (either standard operating-system gestures or new, app-defined gestures). And native apps can use the device’s notification system and can work offline.

Web apps are not real apps; they are really websites that, in many ways, look and feel like native applications. They are run by a browser and typically written in HTML5.  Users first access them as they would access any web page: they navigate to a special URL and then have the option of “installing” them on their home screen by creating a bookmark to that page.

Web apps became really popular when HTML5 came around and people realized that they can obtain native-like–functionality in the browser. Today, as more and more sites use HTML5, the distinction between web apps and regular web pages has become blurry.

Hybrid apps are part native apps, part web apps. (Because of that, many people incorrectly call them “web apps”).  Like native apps, they live in an app store and can take advantage of the many device features available. Like web apps, they rely on HTML being rendered in a browser, with the caveat that the browser is embedded within the app.

Often, companies build hybrid apps as wrappers for an existing web page; in that way, they hope to get a presence in the app store, without spending significant effort for developing a different app. Hybrid apps are also popular because they allow cross-platform development: that is, the same HTML code components can be reused on different mobile operating systems, reducing significantly the development costs. Tools such as PhoneGap and Sencha Touch allow people to design and code across platforms, using the power of HTML.


Thursday, August 29, 2013

Selenium 3


Yes, you heard it right. It is almost two years with the release of the Selenium 2, now the team is focusing on the Mobile testing. Developers from the projects Appiumios-driver and selendroid are working to create a suite that support mobile platform.

For more information, select this link.


Monday, August 12, 2013

Selebium v2.34.0 is ready for download

Download from this link.

Updated with the following items.

* Updated Firefox native event components to support Firefox 22.
* Update synthesized mouse implementation. Mouse moves are
implemented using nsIDOMWindowUtils.
* Finding in a slightly more intelligent way: Check that
dlopen actually succeeds, if not found in one of the fixed paths,
look in the LD_LIBRARY_PATH.
* Added ExpectedConditions to check for the visibility of all
WebElements in a List
* Updated the wgxpath library.
* Updated our copy of the Closure compiler and library to the most
recent versions.
* Updated the atoms library, including support for MS pointer events
and refinements to element visibility tests.
* Close all open connections when stopping the SafariDriver server.
* Fall back to a loopback address if the current machine does not
have an external IP address (as will be the case when there is no
internet connection).
* Remove sizzle dependency from the firefox driver. We only needed
this for versions of firefox prior to 3.5, which we no longer
* Fixed Select.escapeQuotes method.
* Added SafariOptions and support for custom Safari extensions.
* Moved Mouse, Keyboard and TouchScreen to the interactions package
where they belong. This has the benefit of also making our build
files simpler once we delete the original versions which have been
* Deprecated the HasTouchScreen interface.
* Fixed condition in Select.select_by_index method to fix case when
selection is performed by index on a multiple select element.
* Implemented an alpha version of a Marionette (WebDriver implemented
natively in Firefox) driver.
* Deprecated IPhoneDriver.
* Added support for the HTML5 "hidden" attribute. If an element, or
ancestor, has hidden attribute make, it is not shown.
* FIXED: 2285: Allow setting default logLevel for standalone-server.
* FIXED: 5609: Adding the ability to redirect firefox process output
to file.
* FIXED: 5669: Add Driver#remote_status for the Ruby remote driver.
* FIXED: 5715: Adding toString method for the event firing

WebDriver JS:
* When capturing console output, guard against user scripts that
redefine the console global.
* Improved logging in the test client.
* Use goog.labs.testing.assertThat for the assertThat library.
* Improved stack trace handling
* Defined a webdriver.Capabilities class for webdriverjs.
* Added native ChromeDriver support to WebDriverJs.
* Mark discarded tasks as cancelled to prevent hanging on
asynchronously scheduled callbacks.
* Include the webdriverjs tests in the built npm package. Updated
the README with instructions for running the tests using npm.
* Add native PhantomJS support to webdriverjs.

* Update grid for change in behavior of WebDriver's new session
* Fixed handling of JSON conversion errors at node.
* FIXED: 5942: Fix hang of hub when node machine is not available.

* Fixed RC tests failing in Firefox beta builds. This has been fixed
in two ways:

* Rely on the automation atoms where possible.
* Obtain the document and window from the element the event is
firing from.

In the course of fixing this, all but one usage of "triggerEvent"
was replaced. Because of this, the method has been inlined to the last
call site.
* FIXED: 1646: UTF-8 encoded user-extensions.js support.


Wednesday, August 7, 2013

HP UTF (Unified Functional Testing)

HP is new version of the QTP software is UTF (Unified Functional Testing).
I am attending demo offered by HP, post all the details later. Need to see how it can compete with the popular open source tool Selenium.
Mean while go through the following links and video for an overview of the HP UFT.

HP UTF link


Friday, August 2, 2013

Programming Languages Popularity

The TIOBE Programming Community index is an indicator of the popularity of programming languages.
For more details select this link.


Monday, July 29, 2013

SeleniumWebdriver programming Languages

Selenium Supported Programming Languages


Monday, April 29, 2013

WebDriver's Build System

WebDriver's Build System

I was trying to understand how to build the Webdriver and came across the following content(Build Doctor) which can help us understand the Webdriver build system.

WebDriver creator Simon Stewart knows a thing or two about building code. So I was intrigued when he mentioned that he’d written a grammar for Rake, to enable building Java code.

Replacing Ant with Rake has been a compelling idea for some years now. Until now I wasn’t convinced that you weren’t going to have the same issues as Ant – poorly factored builds that rapidly evolve into a project specific DSL. This may change things.

The build system, or grammar as Simon calls it allows you to break a typical monolithic build file down into a collection of fragments. Each fragment can have one or more targets declared, and each target has some attributes. More at CrazyFunBuild.

Simon is undergoing an exceptionally drawn-out email interview on the process:

Your build tool is one of a few new players. What was your motivation for adding to the build gene pool? Were you scratching an itch, or do you have a broader motive?

Definitely scratching an itch. WebDriver started off as a simple java
project, but it quickly became obvious that it’d also be useful to
have language bindings for things like C#, ruby and python. I could
have settled on a separate build tool for each language, but there are
places where a Java component depends on a DLL (for example) Switching
build tools repeatedly when constructing a single logical unit seemed
wasteful, so I started looking around for a build tool that would
provide support for all the languages I wanted to use.

I failed, but settled on rake because it had poor support for everything 

The next problem was that as the project grew, so did the Rakefile. It
ended up being obscenely long and increasingly fragile, and in the end
I was about the only person who would confidently hack around in
there. An obviously sub-optimal state of affairs. The first step in
fixing this was to break out common tasks into functions (because a
Rakefile is just a ruby script in disguise) This still left a pretty
large build file to deal with, so the next stage was to allow us to
break the script into pieces. The obvious issue is that if you do
this, where are paths relative to? The location of the top-level
Rakefile? Or the fragment of code in the subdirectory? Worse, it’d be
unwise to have duplicate task names (“test”) but detecting those while
writing a fragment of a build file would be troublesome at best.

At the same time, I like my builds to be as declarative as possible,
only breaking through the “fourth wall” to scripting when necessary.
Encouraging people to leave lots of little scripts that are the pieces
of a larger application as build files seemed like the worst way of
achieving that goal of “declarativeness”. So, I wrote a parser for a
sub-set of ruby (which mutated into a subset of python) using ragel
that parses build files and generates rake targets based on the path
to the build file and the name of the target in that file. It’s by no
means an original idea: the only thing I can take even a crumb of
credit for is the current implementation (and it’s pretty much
designed to work with selenium, so there are lots of corners cut in

By clearly defining the build grammar, there’s also a chance to
clearly define how paths are interpreted, so that neatly side-steps
that problem. I also provided an “escape hatch” so that you can call
out to other rake tasks as required. Better this is just a thin skin
around other build tools (the java parts delegate to ant controlled
programatically, and the .net pieces use visual studio) but it means
that anyone can read the build files and understand how the source
code, regardless of language, is transformed into a binary.

So, yeah, scratching the itch of “I want a single, declarative build
tool that allows someone not familiar with the other build tools used
to understand how the system works, and which can work with multiple
languages”. Right now, it’s specific to the project, and I’m
comfortable with that: I want to write a browser automation framework,
not a build grammar or (worse) a build tool. 


Friday, March 22, 2013

Bug Life Cycle - TFS

Bug Life Cycle - TFS


Saturday, March 16, 2013

DDoS Attacks: How to Prepare and Respond

Friday, March 1, 2013

Rapid file duplicator or copier

Recently, I was given a task to check the document processing capability of an application. The objective of the test was to check whether system can consume 2 million documents in one hour duration.

System is configured to consume the documents from the specified folder, but the question is how to create 2 million documents in a folder. Manually copying the files take lot of time and test need to be repeated multiple times. Windows file system don't work optimally when a folder contain more than 5000 files, so need to create sub-folders, each sub-folder containing 4000 files and in total 2 million files.

I have created simple VB script program that use copy method to create duplicate files, it took nearly 20 hours. Then I started redesigning the program that will run the copy method in multiple threads, so that task can be accomplished in 1 hour by utilizing the 100% CPU capacity.

It consists of two programs. Initiator program calls the duplicator program multiple times, so that each program runs in different thread and task is accomplished quickly. Program settings need to be tweaked as per the system configuration, so that threads run in an optimal way, not too many or too less threads.

Program download link


'Make sure you have enough space on the system, this program run in multiple threads by utilizing 100% cpu
'Just copy the files in any folder, it will automatically create subfolders
'Perform file partations in the optimal way.

FileName = "test.docx" 'Make sure file exist in the folder
NumberOfCopies = 100 'Make sure division with the below number gives reminder 0 -  1000000 (Actual Test)
NumberOfPartations = 10 'Number Of partaions or blocks for the above said file copies  - 10000  (Actual Test)
TimeStampGenerationAfterCopies = 10 'Generate time stamp in the log file after creating som many files - 1000 (Actual Test)
NumberOfFilesInFolder = 4 'Number of files inside each folder - 3000 (Actual Test)


'For appending zeros to the file name, so that files are sorted sequently
Zeros = len(NumberOfCopies)

Const ForAppending = 8
count = NumberOfCopies/NumberOfPartations

Set wshShell = CreateObject( "WScript.Shell" )
set fso=CreateObject("Scripting.FileSystemObject")
WorkingDirectory = fso.GetParentFolderName(Wscript.ScriptFullName)

'Check folder exist, else create the folder
strFolder = WorkingDirectory & "\Duplicates\"
If Not fso.FolderExists(strFolder) Then
End If

strFolder = WorkingDirectory & "\log\"
If Not fso.FolderExists(strFolder) Then
End If

Set MyFile = fso.OpenTextFile(WorkingDirectory & "\log\log.txt", ForAppending, True)
MyFile.WriteLine("File Duplication Launch Start:"  & funGetTimeStamp())
MyFile.WriteLine("Total Launches:"  & count)

Start = 1
End1 = NumberOfPartations

for count1 = 1 to count

strFileName =  WorkingDirectory & "\FileDuplicater.vbs" & " " & Start & " " & End1 & " " & count1 & " " & TimeStampGenerationAfterCopies & " " & NumberOfFilesInFolder & " " & FileName & " " & Zeros
wshShell.Run "wscript " & strFileName, 1, False
WScript.Sleep 3000

Start = Start + NumberOfPartations
End1 = End1 + NumberOfPartations


MyFile.WriteLine("File Duplication Launch  End:"  & funGetTimeStamp())

Set fso = Nothing
Set wshShell = Nothing

Function funGetTimeStamp()
sDateTIme = Now()

iDate = Datepart("d",sDateTime)
iLen = Len(iDate)
If iLen = 1 Then
iDate = "0" & iDate
End If

sMonth=  mid(MonthName(Datepart("m",sDateTime)),1,3)

iYear = Datepart("yyyy",sDateTime)

iHour = Datepart("h",sDateTime)
iLen = Len(iHour)
If iLen = 1 Then
iHour = "0" & iHour
End If

iMinute = Datepart("n",sDateTime)
iLen = Len(iMinute)
If iLen = 1 Then
iMinute = "0" & iMinute
End If

iSec = Datepart("s",sDateTime)
iLen = Len(iSec)
If iLen = 1 Then
iSec = "0" & iSec
End If

funGetTimeStamp =  sMonth & "_" &  iDate & "_" & iYear & "_" & iHour & "_" & iMinute & "_" & iSec

End Function


'This program need to be called by Initiator.vbs that pass the necessary command line parameters
Set objArgs = WScript.Arguments
StartIndex = clng(objArgs(0))
EndIndex = clng(objArgs(1))
LaunchID = clng(objArgs(2))
TimeStampGenerationAfterCopies = clng(objArgs(3))
NumberOfFilesInFolder = clng(objArgs(4))
FileName = objArgs(5)
Zeros = clng(objArgs(6))
Set objArgs = Nothing

FolderIndex = 1
FileCount = 1

TimeStampGenerationAfterCopies1 = TimeStampGenerationAfterCopies

set fso=CreateObject("Scripting.FileSystemObject")
WorkingDirectory = fso.GetParentFolderName(Wscript.ScriptFullName)

strFolder = WorkingDirectory & "\Duplicates\" & LaunchID & "_" & FolderIndex & "\"
If Not fso.FolderExists(strFolder) Then
End If

Length = len(FileName)
JustFileName = Mid(FileName,1,Length-5) '.docx len 5
JUstFileExt = Mid(FileName,Length-4) 'docx len 4

LogFile = "\log\log_" & LaunchID & ".txt"

OrginalFileNamePath = WorkingDirectory & "\" & FileName

Set MyFile = fso.OpenTextFile(WorkingDirectory & LogFile, ForAppending, True)
MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "Start:" & funGetTimeStamp())
MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "StartIndex:" & StartIndex)
MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "  EndIndex:" & EndIndex)
MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "  TimeStamp Generated after number of files:" & TimeStampGenerationAfterCopies)

TimeStampCounter = TimeStampGenerationAfterCopies + StartIndex

if StartIndex = 1 then
StartIndex = StartIndex - 1
end if
Const ForAppending = 8

for count = StartIndex to EndIndex
'Logic to append zeros
FileIndexLength = len(count)
FileIndex = count
for count1 = 1 to (Zeros - FileIndexLength)
FileIndex = "0" & FileIndex

DuplicateFileNamePath = strFolder & JustFileName & "_" & FileIndex & JUstFileExt
fso.CopyFile OrginalFileNamePath, DuplicateFileNamePath , True

if TimeStampCounter = count then
MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "Total Files Duplicated:" & TimeStampGenerationAfterCopies1 & "---" & funGetTimeStamp())
TimeStampCounter = TimeStampCounter + TimeStampGenerationAfterCopies
TimeStampGenerationAfterCopies1 = TimeStampGenerationAfterCopies1 + TimeStampGenerationAfterCopies
end if

if FileCount = NumberOfFilesInFolder then
FileCount = 0
FolderIndex = FolderIndex + 1
strFolder = WorkingDirectory & "\Duplicates\" & LaunchID & "_" & FolderIndex & "\"
If Not fso.FolderExists(strFolder) Then
End If
End If
FileCount = FileCount + 1


MyFile.WriteLine("LaunchID:" & LaunchID & "---" & "  End:" & funGetTimeStamp())
Set MyFile = Nothing

'wscript.echo "File Duplication Completed. Total Files:" & NumberOfCopies

Set fso = Nothing

Function funGetTimeStamp()
sDateTIme = Now()

iDate = Datepart("d",sDateTime)
iLen = Len(iDate)
If iLen = 1 Then
iDate = "0" & iDate
End If

sMonth=  mid(MonthName(Datepart("m",sDateTime)),1,3)

iYear = Datepart("yyyy",sDateTime)

iHour = Datepart("h",sDateTime)
iLen = Len(iHour)
If iLen = 1 Then
iHour = "0" & iHour
End If

iMinute = Datepart("n",sDateTime)
iLen = Len(iMinute)
If iLen = 1 Then
iMinute = "0" & iMinute
End If

iSec = Datepart("s",sDateTime)
iLen = Len(iSec)
If iLen = 1 Then
iSec = "0" & iSec
End If

funGetTimeStamp =  sMonth & "_" &  iDate & "_" & iYear & "_" & iHour & "_" & iMinute & "_" & iSec

End Function

Folder structure (Create below folders at any location in your file system)


Monday, January 14, 2013

Eclipse - Failed to create Java Virtual Machine

Eclipse - Failed to create Java Virtual Machine.

I have downloaded eclipse and opened the IDE many times. Recently I was performing selenium webdriver setup on my friends machine and came across the following error.

In order to resolve this issue, I have updated the eclipse.ini file located in the eclipse folder, replaced      the  "-vmargs" with "-vm C:\Program Files\Java\jdk1.7.0_09\bin\javaw.exe", this solved the issue.

The order way is to create a short cut for  eclipse.exe and open the properties windows using right click and update the target path as shown below. This is similar to passing the command line arguments while opening the eclipse.