Showing posts with label QTP. Show all posts
Showing posts with label QTP. Show all posts

Saturday, 15 September 2012

Library Files

This is a continuation

In an automation framework architecture library files plays an important role. Normally people try to built most generalized function and place them at separate and common place.

I see that people always ask me questions which one is good to use Action or functions? I have personal view on these to use Functions instead of Actions. Of-course every aspects have its own pros and cons. Some people may feel comfortable to use Actions rather than Functions.

Whenever I create a functions I always have an intentions in my mind whether I can make this functions more generalized? I have developed an habit to have function's maximum usability. But be caution think to make generalized function should not change your motto of creating it ;)


A function doesn't meant to only have the VBscript codes, of-course you can always have QTP script codes . Functions are often treated as keywords in QTP, now a keyword can be placed separately in excel file, text file, or XML file. so that you can design keyword driven framework.

While automating (developing script) a particular workflow/E2E test case, first I create scripts in Linear manner in a particular action. Later on I break down these workflow in smaller script parts, of-course to divide these you need to know other test cases also so that you can easily identify commonality in functionality. Don't worry if you are not able to identify commonality, just go ahead and as you move ahead with framework designing you will be able to know it.

Now, the divided code is bundled under functions with a name which could make sense, for example NavigateTo(strURL), Login(strUserName, strPassword), NavigateToPageMenu(strMenuName), LogOut()

In an attempt to make execution faster and in terms of maintenance we load the functions runtime by leveraging power of "ExecuteFile" method. See, when you associate the ".qfl" file with script, so when you want to move complete framework folder, you will have to re-associate the library files. Of-course while script development you would require to associate library file for debugging purpose. Later on after your code is fully developed you can use "ExecuteFile" method to make all functions available in QTP run session during runtime.

I will update some more ideas in future, ofcourse many more ideas related to Library files.

Now Talking about our Framework development, presuming I have functional knowledge of AUT. I decide to place functions in appropriate library file. When I say appropriate library file . . . I meant only those library files containing specific functions which are relevant to a particular module or Test Case should be loaded. It doesn't make sense if you have numerous function written in a library file and in runtime load, these function are available which are of no use.

I have seen people writing function in an unorganized fashion and a single library files are flooded with many functions which are sometimes create problem during maintenance. Ofcourse no harm with that, but I believe this as to be the best practices.

See below image for a gist I am trying to convey . . .













 In above framework folder structure you can see some library files example placed. I guess no need to explain library files other than "GlobalFunctions.qfl"

GlobalFunctions.qfl :- This is one its kind, you know as the name suggest I place all those functions which 
  • are repetitively used
  • needs to have global scope
  • are very generalized
For example functions like
FrameworkInitializer, LoadModuleBasedTestData, LoadGlobalDataVariablesFromGlobalDataxls, CreateOutputDataFile, InitializeLogs, WriteCurrentLogInLogFile, ReportPassFail . . .

I have purposefully named these functions to be more meaningful to you ;)

GlobalFunctions.qfl file is associated with all QTP TestScript. The decision to put functions in which library files solely depends on you, you have to design the architecture, you have to design the workflow of you framework, you have to decide when to load which library files.

-Pankaj Dhapola 
Think on it

Tuesday, 26 June 2012

Some Utility Codes

Some Utility Codes

While working with Oracle DB's,  you require TNS entry file (tnsnames.ora) in your system whenever you fire a query to a particular DB.
So when you fire query using ADODB objects to oracle DB's , you may require to have the TNS entry in that file else you would find error stating "TNS entry missing".

I struggled this kind of scenario, to have someone from Admin team to replace file, due to lack of administrative privileges. Some organizations don't allow that. I thought to eliminate this, so Googled for TNS entrly less Connection String.

I saw that a TNS file have below type of information
................................................................
SomeRefrenceName=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP) (HOST = theDBHostServer.Companyname.com) (PORT = 1530))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SomeServiceName)
    )
  )
................................................................

So I thought can we enter this TNS Entry into our connection string? I found below solution.

Below provider is from MicroSoft for Oracle DB, This seemed to be reliable for me.

ConStr =  "provider=msdaora;" _ 
          & "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" _ 
          & "HOST=" & strHOST & ")" _
          & "(PORT="& strPORT & "))" _
          & "(CONNECT_DATA=(SERVICE_NAME="& strSERVICE & ")))" _
          & ";User Id=" & strUID & ";Password=" strPWD & ";"

You can use other providers as well like
Provider=MSDAORA.1 
provider=OraOLEDB.Oracle.1


-Pankaj Dhapola 
Let's Think on it

An Example of DotNetFactory in QTP

An Example of DotNetFactory in QTP

Function DotnetUIDPWDForm(strDetails)
 'Creating instances of DotNetfactory objects
Set frmProd = DotNetFactory.CreateInstance("System.Windows.Forms.Form", "System.Windows.Forms")
Set lblDBDetails  = DotNetFactory.CreateInstance("System.Windows.Forms.Label", "System.Windows.Forms")
Set lblUID = DotNetFactory.CreateInstance("System.Windows.Forms.Label", "System.Windows.Forms")
Set txtUID = DotNetFactory.CreateInstance("System.Windows.Forms.TextBox", "System.Windows.Forms")
Set lblPWD = DotNetFactory.CreateInstance("System.Windows.Forms.Label", "System.Windows.Forms")
Set txtPWD = DotNetFactory.CreateInstance("System.Windows.Forms.TextBox", "System.Windows.Forms")
Set btnSubmit = DotNetFactory.CreateInstance("System.Windows.Forms.Button", "System.Windows.Forms")

Set oPoint = DotNetFactory.CreateInstance("System.Drawing.Point", "System.Drawing", x, y)

oPoint.x = 10
oPoint.y = 10
lblDBDetails.Location = oPoint
lblDBDetails.Width = 350
lblDBDetails.Height = 70
lblDBDetails.Text = strDetails

oPoint.x = 10
oPoint.y = 80
lblUID.Location = oPoint
lblUID.Text = "PROD User ID"

oPoint.x = 10
oPoint.y = 110
lblPWD.Location = oPoint
lblPWD.Text = "PROD Password."

oPoint.x = 150
oPoint.y = 80
txtUID.Location = oPoint
txtUID.Width = 100

oPoint.x = 150
oPoint.y = 110
txtPWD.Location = oPoint
txtPWD.Width = 100
txtPWD.UseSystemPasswordChar=true

oPoint.x = 150
oPoint.y = 150
btnSubmit.Location = oPoint
btnSubmit.Width = 100
btnSubmit.Text = "Submit"
     
'Add Controls
frmProd.Controls.Add lblDBDetails
frmProd.Controls.Add lblUID
frmProd.Controls.Add txtUID
frmProd.Controls.Add lblPWD
frmProd.Controls.Add txtPWD
frmProd.Controls.Add btnSubmit
frmProd.CancelButton=btnSubmit
frmProd.Text = "This is a PROD RUN"

frmProd.Height = 250
frmProd.Width = 350
frmProd.ShowDialog
DotnetUIDPWDForm = txtUID.Text & ":" & txtPWD.Text

Set frmProd=Nothing
Set lblDBDetails=Nothing
Set lblUID=Nothing
Set txtUID=Nothing
Set lblPWD=Nothing
Set txtPWD=Nothing
Set btnSubmit=Nothing
Set oPoint=Nothing
End Function


-Pankaj Dhapola 
Let's Think on it

Friday, 15 June 2012

Entry point in your Automation Framework

*getGlobalDataxlsPath()shall return the complete path of "GlobalData.xls" file

This is a small part to understand  getGlobalDataxlsPath()


Now the logic behind having an entry point for your Automation framework is whenever you execute any script, your framework structure should be available in Execution QTP environment. Since "GlobalData.xls" itself contain the structure, how you gonna access this excel sheet seamlessly.

One Idea, let's leverage QTP's Enviroment("TestDir") variable.

So your function called getGlobalDataxlsPath() Should return a path like for example 
"C:\\whereveryouhaveplaced\GlobalData.xls"
Colored path is what we need to extract.

Look at below code

Function  getGlobalDataxlsPath()
                 getGlobalDataxlsPath = Mid(Environment("TestDir"), 1, instr(1,Environment("TestDir"), "Framework")+10)
End Function

I hope you got dat!!!

Notice the dependency, your Framework Base folder should contain the word "Framework".

-Pankaj Dhapola
Let's Think on it

Monday, 23 April 2012

Automation Framework Architecture using QTP

Automation Framework Architecture using QTP

Every one knows about the different types of framework
I'm not going to explain you about these framework (Many Authors have done that), I would like to visualize you how you can start off with designing of your framework . . .
I'll try my best to share with clarity and understanding


Well first off all, you should make a mind map (or simply draw a DFD) of the structure of your framework, for example
1) The flow of input data from a storage into your application
2) How you will arrange the output of the application and display/store results?
3) How your execution of scripts would be arranged both locally and in QC?
4) How is your reporting and logger functionality will work?

All this questions definitely come after experience, but people with great Visualization would grasp it easily.

Now their are some aspects of any framework

1) Library files:- which is bundle of functions in .qfl, .vbs, and/or .txt files.
2) Test Data: - The required inputs in your application, which may be stored in excel(mostly), txt, CSV etc
3) Test Scripts: - A place where all Scripts are stored functional and sub functional wise.
4) Results:- A place where your application results/output will be generated. Note that this place can be different in QC and Local folder structure
5) Object Repository: - A place where Global OR is placed if any.
6) Recovery Scenario: - A place to store recovery scenario.
7) Re-Usable Actions: - A place to keep your re-usable actions, if any.

you may also have some other folder to include depending on project.

And now . . . Bundle these aspects under one roof, i.e your framework like below folder structure


Now the layout is ready, how do you let QTP know about these folder structure path, how will you keep this folder called "MyFramework" independent of a place, where-ever you put, it should run seamlessly, either in Company Shared Drive or your desktop, etc.

In short how will you make it Portable or keep integrity of relevant aspects intact.

I have a solution ("GlobalData.xls"), write down the path name of all this structure in an excel file.

See below screenshots.











The Cell formula for "BasePath" is
"=LEFT(CELL("filename",A1),FIND("[",CELL("filename",A1),1)-1)"

Now you might have question why did I Named this excel file as "GlobalData.xls"
I think I gotcha!!!

Put all your data which will be used across your script execution, the data which you would need persistent throughout your script execution like AUT URL, User-ID, Password, all function library file path, etc

See what is the advantage . . .
Put this folder wherever you want, your excel file keep the integrity of the Framework Structure path. I have seen some framework which have many configuration issues if it is migrated to another PC for execution, and time is lost while debugging.

I came up with this intact solution.

Up to me A framework should leverage Re-Usability and should be good in maintenance.

I will tell you how you will bring these data in your QTP "Environment" ;)

Taking about next thing . . . . .
LibraryFiles

What do you think about Managing Object Repository

What kind of Results/Logs do you Generate?

-Pankaj Dhapola

Sunday, 22 January 2012

Descriptive Programming in QTP

What do you mean by Descriptive Programming (DP in Short)?

In QTP, An Automation script developer can write script codes using Object Repository or Descriptive Programming. Descriptive Programming is nothing but working with Object's property name and property value. As we all know QTP identify objects on the basis of object properties which is ultimately known as Descriptions.

Now in QTP, How do we write scripts in DP to perform an action like entering string in text field, clicking button etc. . .?

Ummm . . .

To Identify object uniquely we need to find descriptions or properties of an Object. How do we find properties? It's Object Spy. Descriptive code can be written in two ways

  • Mention your Descriptions using QTP inbuilt programmed Description Object. (Note here Description object is different than the GUI objects like WebButton, WinButton etc, Description Object is programming concept.)
  • Another way is to mention your description in string format.

Let's take an example . . .

I have adjacent html WebPage that I developed during my college days when I first learned HTML ;)

I have to write a script to enter firstname, lastname and then click on Submit button.

Now, to write script using Description Object you would require to create a description object and use its add method to add "propertyname -propertyvalue" pair, for that write below code

Set objDesc = Description.Create
objDesc.add "propertyname1", "propertyvalue1"
objDesc.add "propertyname2", "propertyvalue2"


Use this code to write script for object
QTPObject(objDesc )



Wait this is not the end, I want to uniquely identify the TextBox besides "First Name" Label. so for this I need the properties of the "First Name" TextBox and for that naturally I will use QTP object spy.

Let's see what Object spy has to say. . .
Look at the 3 property and value pair for First Name WebEdit (or Text Box)
class = fntxtclass
html tag = INPUT
name = fntxt 

According to hierarchy of "First Name TextBox" Object, with little knowledge of DOM I realized that to reach this textbox I need to identify Browser(MyFirsthtmlcode) first and then Page(MyFirsthtmlcode) and then WebEdit(fntxt)

okay let me go with First Name Textbox or WebEdit(fntxt)


Can you relate things in browser, HTML source page and object spy? Try to understand how are WebObjects being interpreted in QTP environment.

Now I decide to use these 3 properties for identifying the "First Name" TextBox (or WebEdit) in our description object.
Let's see how do i do that . . .

Set objFirstNameTextBoxDescription = Description.Create
objFirstNameTextBoxDescription.add "class","fntxtclass"
objFirstNameTextBoxDescription.add "html tag","INPUT"
objFirstNameTextBoxDescription.add "name","fntxt"

now this object is mentioned in WebEdit object as

WebEdit(objFirstNameTextBoxDescription)


Lets use the same process to identify Browser and page, I figured out below code for both Browser and Page Object


Set objMyBrowserDescription = Description.Create
objMyBrowserDescription.add "name","MyFirsthtmlcode"

As

Browser(objMyBrowserDescription


Set objMyPageDescription = Description.Create
objMyPageDescription .add "class","fntxtclass"

As 

Page(objMyPageDescription)



Now lets see whether we have uniquely identify or not, for that I used highlight method for each objects.
Notice hierarchy in the code as well.

Browser(objMyBrowserDescription).highlight
Browser(objMyBrowserDescription).Page(objMyPageDescription).highlight
Browser(objMyBrowserDescription).
Page(objMyPageDescription).
 WebEdit(objFirstNameTextBoxDescription).highlight

guess what!!! "First Name" TextBox was highlighted

And then I used the most common method of WebEdit object i.e. set() method to enter value in our text box.

Browser(objMyBrowserDescription).Page(objMyPageDescription).
 WebEdit(objFirstNameTextBoxDescription).Set "Pankaj Dhapola"

Now Another way without using Description Object is to enter Description properties in String format like this
QTPObject("PropertyName1:=PropertyValue1","PropertyName2:=PropertyValue2", . . . .)

Above equivalent code in String format is



Browser("name:=MyFirsthtmlcode").Page("name:=MyFirsthtmlcode").
WebEdit("class:=fntxtclass","html tag:=INPUT","name:=fntxt").Set "Pankaj Dhapola"



Try it yourself friends.
But notice the case sensitivity inside the String and Description object where you provide the Descriptions or "PropertyName:=Value" pair.
-Pankaj Dhapola

Sunday, 8 January 2012

Object Repository in QTP

Wooah!!! Let get into deep understanding of Object Repository (OR in Short)

As the name suggest "A place where Object is stored", but don't get confused. Object in QTP world is basically "PropertyName-PropertyValue" pair. QTP Object Repository is a Graphical representation Various Test Objects and their properties along with hierarchical relationship with other objects as well.

Their are some more functionality available in Object Repository window like . . .
 Add Objects to Repository
 Object Spy
 Associate Other Repository from file
 Highlight Selected Test Object in Application

These are very few enlisted above with Icon Image.

Now lets see how does an Object Repository GUI window looks like.

Left Pane shows the total Test Objects what is going be used by QTP during Test Run. Now these object can be added manually or by QTP itself while recording a script rather I should say a workflow.
Two thing keep in mind to get familiarize with OR.
1) Notice the hierarchical relationships among objects. People who can understand HTML DOM (Document Object Model) can easily figure out why these objects are placed in such order.
2) Notice the Icon and Name of each Object.

Right Pane shows an Object properties and its values.

Lets take an example of our Test Object having Name "Google Search"
Notice the Icon, its a WebButton and the name "Google Search" 
Look at the Right Pane now 3 Description properties are displayed like type, name and html tag.
QTP have itself added these 3 properties to uniquely identify a particular object in application.

Now you will ask me what do you mean "QTP has itself added these properties"? (Note that I am talking about object properties and not Object because I have manually added all those objects in OR, but QTP have itself added all the required properties of each object.)

When I click on Icon         QTP vanishes and Object Spy Hand  appears and placed on the object (Google Search Button) then QTP fetch all the available object properties from the application and using Object Identification Mechanism it filters out that it require above 3 properties to uniquely identify Google Search Button in Google landing page. 

QTP self assign a name ("Google Search") to Google Search button object so that automation tester can use this name as reference in his code.
Now let's around with this object, 
1. Click on highlight button  and then Google Search Button gets highlight
2. Delete  some property and see that whether you can identify (or highlight) object, I deleted property "html tag" and guess what I was able to highlight Google Search Button. And I again deleted property "type" and I was able to highlight Google Search Button. And I again deleted property "name" and guess what QTP showed me 

What did I concluded here.
QTP sometimes take extra precaution to uniquely identify object hence add some more properties without which it can still identify object uniquely.
I have learned that the more number of properties you add, QTP will take more time to analyze object. Hence I started deleting properties.

Okay pals try yourself . . .
Happy Learning . . . :)

-Pankaj Dhapola



Monday, 19 December 2011

QTP object identification process

How does QTP identify an object?

Well being a technical guy this question has been wondering me a lot before knowing it.

When I learned that QTP identify objects on the basis of properties and I was knowing that each and every object in DOM or Web Page has been assigned with properties (attributes) and its values. So I went into flashback when I used to create HTML pages . . .
For each web element frame, form, button, text box etc we assigned properties/attributes and value inside tags, u remember?
something like below figure . . .

Notice the tags and the attributes that html dveloper have assigned to each object in the html page.

These are the properties that QTP leverage to Identify a particular object.













This would be very interesting afterwards.


Let's go into some theory,
To be very specific QTP has grouped properties under 3 categories
1) Mandatory(or base) Properties:- These are most important properties which are required to identify
objects.
Example:- In a WebPage, how come a particular object is identified as button or textbox? its because of its mandatory property like object type of Class Name, whether it is WebButton or WebEdit. 

Note that:- sometimes it is possible to identify object without this property.

2) Assistive Properties: - Sometimes Mandatory property is not enough to identify an object uniquely, so
this property is used. Hence the name is given Assistive. example:- name, text, value etc

3) Ordinal identifiers:-    If above both fails then ordinal identifier are used to identify object. These are
like  Location and index (or order) of object.


"Now don't ask me how QTP extract the properties from application. That shall be another blog."


QTP identification process works exactly same as human like filtration process. Now to understand this you will have to think like a machine or AI. 


Example:- You might have seen Rajnikant's Robot movie right? 
Now suppose you have a family photo of Aishwarya Rai and you ask Chitti (the Robot) to Identify Sana (Aishwarya) from this photo. Now what does Chitti do?

He opens up his informational database regarding Sana and list out all properties or features.
Now he scan the photo and in first step process he figure it out the their are 2 males and 2 females. Now according to his informational database Sana is Female, so he filter out 2 males from photo and concentrate on 2 female. Here the property "female" is Mandatory or base filter property.  ok?

In the next step process he identifies that skin color which turn out to be same for both female, here the assistive property "skincolor" is not enough but again look for next property like Age.
This time he figure out that his informational database age and the visible age in photo and filter out the other women and uniquely identify Sana from the photo using assistive property "Age".

In this way objects are filtered out on the basis of Object properties.

Sometimes it may happen that due to lack of above two types of unique property Chitti fails to identify Sana. Now this time he uses the ordinal identifier property like location. for example, he scan his whole image database and finds that Sana Always stand on left hand side of photo in a group of 4. So he assumes that in this photo also she might have been standing in extreme left and says "Person in extreme right is Sana".

Now you might ask me so why QTP uses Mandatory and Assistive property then, why not use Ordinal directly? Suppose in other photo Aishwarya stands in the middle instead or extreme left, now chitti fail to identify Sana. That's why I mentioned the word "Assumes" and Chitti said  "Person in extreme right is Sana", he did not even said female on extreme left. Ordinal Identifier are not the reliable properties to Identify Objects many a times.

Their is Concept call Smart Identification feature- Sometimes what happens is while identifying objects QTP lacks exact property of object, so in this case QTP assumes that which object is very much near to the exact property provided. Not much to talk on this.

Their an inbuilt tool called Object Spy which is available in QTP menu with this Icon.
Object spy look like a window having properties and values column with a button having image of hand point to left.








Coming back to my flashback's HTML page and its code, I went home and searched out that HTML page and place the Object spy hand in it. I was surprised to see the properties in Object Spy of the WebEdit that I had created.

Below is the screenshot with marking.


Isn't this amazing? Are you actually able to relate things properly? Give a close look at the red and blue boxes.


Try it now!!! 
-Pankaj Dhapola

Tuesday, 13 December 2011

QTP Environment Variables and or Objects

How Can I make a variable/Object environmentally available i.e. throughout execution?


QTP has Environment Object which has Execution wide or global scope.

To Store your variable.

Environment.Value("MyVariable") = "MyValue"

or you can write this way

Environment("MyVariable") = "MyValue"


To Access Variable Value

strValue = Environment.Value("MyVariable")

or

strValue = Environment("MyVariable")

Do you know apart from storing simple values (like String, integer etc ), we can also store objects like dictionary, array etc.

Suppose I have defined a Dictionary Object

Set oDic = CreateObject("Scripting.Dictionary")

Following are the key-values pair defined
oDic.Add "Key1", "Value1"
oDic.Add "Key2","Value2"


Now Somewhere in code, I will store this dictionary object in Environment.

Environment("MyDictionaryObj") = oDic


How will I access it now? Here it is . . .

MyValue1 = Environment("MyDictionaryObj")("Key1")

Now try to understand the above line, the Blue background will evaluate to Dictionary Object that we had stored. Now see below Debug viewer Window to make you visualize about these objects.


Similarly we can also store array
MyArray = Array("Pankaj", "Anand", "Hussain")
Environment("MyEnviroArray") = MyArray

So How will I retrieve the value, below screenshot is self explanatory.





This was all about the programmatic approach to play with Environment Object.
Now let's see what QTP has in Environment Object.

Well their are 2 types of QTP Environment object.
1. In built
2. User Defined

Under QTP IDE, go to file--> Settings

Now whatever environment variable we defined in code will be User Defined type of Environment Variables.

QTP has inbuilt defines Variables which can be leveraged in your code from Framework designing perspective like "TestDir", "TestName", "UserName" etc . . .
Below is the screenshot of debug viewer that is during run time this variables are also available

Now Talking about User Defined Variable
You can also define variable initially also. like this . . .



Now Below is the screenshot of "Test Settings" Window during Run Time.
All user defined variables can be seen in this window.
Can you see it? . . . Open your QTP- try it

And Last but not the least you can also take bunch of Environment variable in an XML file and import in QTP. Create XML file like below fig and then use import functionality which is available in File--> Settings window.


Below is the figure after importing XML based Environment Variables


So, go ahead and try it . . .
Have a great time.

-Pankaj Dhapola

Friday, 9 December 2011

QTP - Why Analysis and Planning is important before you start with framework designing.

Of course everyone knows why planning is important.

Now The question is what shall I do for framework designing. What are the points do I need to remember while designing a framework?
Well well well . . .
Framework designing is not a simple thing where you learn this blog or learn material from internet and you start off with it. It require work experience in various framework, but this is not the end.

Their is a great saying I heard from one my close friend Srimaya Mahapatra
"Wise people are those who learn from their mistakes and Wisest people are those who learn from other's mistake."
Seems to be a powerful statement enough to change one's life.

Coming back to business . . .

Before you start designing a framework in QTP, below are the question you need to ask yourself.
1) Do I know the functionality of each module for AUT?
2) Do I know what are the input data into this application and what are the outputs?
3) What would be my design flow right from initialization of script to result display?
4) What kind of framework I shall use? Mostly people use hybrid one.
5) Whether to use DataTable or ADODB or both?
5) Whether to use OR or DP or both?
6) Whether to use Reporter object for reporting or Custom based results?
7) Whether to Multiple actions or Function library?
8) What kind of recovery scenario, error handling should I need to include?
9) How about synchronization?

All this question can only be answered by YOU.

To decide all these, you must have experience enough to understand usage of all these concepts.
It is advisable to go over these once, so that you could be familiar with these concepts.
It's long journey my frnds, but don't worry each journey would be refreshing. :)

I shall Go over these with an understanding where novice people can understand and people with astonishment will ask themselves "Oooooo! QTP aisa kaam karta hai kya!!!" i.e. Do really QTP work internally like this?

Thanks and Warm Regards
Pankaj Dhapola