DP in QTP Basics
-
Upload
basheer-perayipalle -
Category
Documents
-
view
227 -
download
0
Transcript of DP in QTP Basics
-
8/8/2019 DP in QTP Basics
1/23
Descriptive programming in QTP
Author(s): (1) tarun_lalwani
Written On: 15-Sep-2005
Keywords:
QTP, Quick Test, Quick Test Pro, Descriptive Programming, Programming Description
Introduction:
This document demonstrates the usage of Descriptive programming in QTP. It alsodiscusses situations where Descriptive programming can be used. Using DescriptiveProgramming automation scripts can be created even if the application has not beendeveloped.
Descriptive Programming:
Whenever QTP records any action on any object of an application, it adds somedescription on how to recognize that object to a repository of objects called objectrepository. QTP cannot take action on an object until unless its object description isin the Object Repository. But descriptive programming provides a way to performaction on objects which are not in Object repository
Object Identification:
To identify an object during the play back of the scripts QTP stores some properties
which helps QTP to uniquely identify the object on a page. Below screen shots showsan example Object repository:
mailto:[email protected]:[email protected]:[email protected] -
8/8/2019 DP in QTP Basics
2/23
Now to recognize a radio button on a page QTP had added 2 properties the name of the radio button and the html tag for it. The name the left tree view is the logicalname given by QTP for the object. This can be changed as per the convenience of the person writing the test case. QTP only allows UNIQUE logical name under same
level of hierarchy. As we see in the snapshot the two objects in Browser->Page nodeare WebTable and testPath, they cannot have the same logical name. But anobject under some other node can have the same name. Now with the currentrepository that we have, we can only write operation on objects which are in therepository. Some of the example operations are given below
Browser("Browser").Page("Page").WebRadioGroup ("testPath").Select "2"
cellData = Browser("Browser").Page("Page").WebTable("WebTable").GetCellData (1,1)
Browser("Example2").Page("Page").WebEdit("testPath").Set "Test text"
When and Why to use Descriptive programming?
Below are some of the situations when Descriptive Programming can be considereduseful:
1. The objects in the application are dynamic in nature and need specialhandling to identify the object. The best example would be of clicking a link
-
8/8/2019 DP in QTP Basics
3/23
which changes according to the user of the application, Ex. Logout.
2. When object repository is getting huge due to the no. of objects being added.If the size of Object repository increases too much then it decreases theperformance of QTP while recognizing a object.
3. When you dont want to use object repository at all. Well the first questionwould be why not Object repository? Consider the following scenario whichwould help understand why not Object repository
Scenario 1: Suppose we have a web application that has not been developedyet. Now QTP for recording the script and adding the objects to repositoryneeds the application to be up, that would mean waiting for the applicationto be deployed before we can start of with making QTP scripts. But if weknow the descriptions of the objects that will be created then we can stillstart off with the script writing for testing
Scenario 2: Suppose an application has 3 navigation buttons on each andevery page. Let the buttons be Cancel, Back and Next. Now recordingaction on these buttons would add 3 objects per page in the repository. For a10 page flow this would mean 30 objects which could have been represented
just by using 3 objects. So instead of adding these 30 objects to the repositorywe can just write 3 descriptions for the object and use it on any page.
4. Modification to a test case is needed but the Object repository for the same isRead only or in shared mode i.e. changes may affect other scripts as well.
5. When you want to take action on similar type of object i.e. suppose we have20 textboxes on the page and there names are in the form txt_1, txt_2, txt_3and so on. Now adding all 20 the Object repository would not be a goodprogramming approach.
How to use Descriptive programming?
There are two ways in which descriptive programming can be used1. By creating properties collection object for the description.2. By giving the description in form of the string arguments.
1. By creating properties collection object for the description.
To use this method you need first to create an empty description
Dim obj_Desc Not necessary to declareSet obj_Desc = Description.Create
Now we have a blank description in obj_Desc. Each description has 3properties Name, Value and Regular Expression.
obj_Desc(html tag).value= INPUT
-
8/8/2019 DP in QTP Basics
4/23
When you use a property name for the first time the property is added to thecollection and when you use it again the property is modified. By default eachproperty that is defined is a regular expression. Suppose if we have the followingdescription
obj_Desc(html tag).value= INPUTobj_Desc(name).value= txt.*
This would mean an object with html tag as INPUT and name starting with txt.Now actually that .* was considered as regular expression. So, if you want theproperty name not to be recognized as a regular expression then you need toset the regularexpression property as FALSE
obj_Desc(html tag).value= INPUTobj_Desc(name).value= txt.*
obj_Desc(name).regularexpression= txt.*
This is how of we create a description. Now below is the way we can use it
Browser(Browser).Page(Page).WebEdit(obj_Desc).set Test
When we say .WebEdit(obj_Desc) we define one more property for ourdescription that was not earlier defined that is its a text box (because QTPsWebEdit boxes map to text boxes in a web page).
If we know that we have more than 1 element with same description on the pagethen we must define index property for the that description
Consider the HTML code given below
Now the html code has two objects with same description. So distinguishbetween these 2 objects we will use the index property. Here is the descriptionfor both the object
For 1 st textbox:obj_Desc(html tag).value= INPUTobj_Desc(name).value= txt_Nameobj_Desc(index).value= 0
For 2 nd textbox:obj_Desc(html tag).value= INPUTobj_Desc(name).value= txt_Name
-
8/8/2019 DP in QTP Basics
5/23
obj_Desc(index).value= 1
Consider the HTML Code given below:
We can use the same description for both the objects and still distinguishbetween both of themobj_Desc(html tag).value= INPUTobj_Desc(name).value= txt_Name
When I want to refer to the textbox then I will use the inside a WebEdit objectand to refer to the radio button I will use the description object with theWebRadioGroup object.
Browser(Browser).Page(Page).WebEdit(obj_Desc).set Test Refers to thetext boxBrowser(Browser).Page(Page).WebRadioGroup(obj_Desc).set TestRefers to the radio button
But if we use WebElement object for the description then we must define theindex property because for a webelement the current description would returntwo objects.
Hierarchy of test description:
When using programmatic descriptions from a specific point within a test objecthierarchy, you must continue to use programmatic descriptionsfrom that point onward within the same statement. If you specify a test object byits object repository name after other objects in the hierarchy havebeen described using programmatic descriptions, QuickTest cannot identify theobject.
For example, you can use Browser(Desc1).Page(Desc1).Link(desc3), since it usesprogrammatic descriptions throughout the entire test object hierarchy.You can also use Browser("Index").Page(Desc1).Link(desc3), since it usesprogrammatic descriptions from a certain point in the description (startingfrom the Page object description).
However, you cannot use Browser(Desc1).Page(Desc1).Link("Example1"), sinceit uses programmatic descriptions for the Browser and Page objects butthen attempts to use an object repository name for the Link test object(QuickTest tries to locate the Link object based on its name, but cannotlocate it in the repository because the parent objects were specified usingprogrammatic descriptions).
-
8/8/2019 DP in QTP Basics
6/23
Getting Child Object:
We can use description object to get all the objects on the page that matches thatspecific description. Suppose we have to check all the checkboxes present on aweb page. So we will first create an object description for a checkboxe and thenget all the checkboxes from the page
Dim obj_ChkDesc
Set obj_ChkDesc=Description.Createobj_ChkDesc(html tag).value = INPUTobj_ChkDesc(type).value = checkbox
Dim allCheckboxes, singleCheckBox
Set allCheckboxes =Browse(Browser).Page(Page).ChildObjects(obj_ChkDesc)
For each singleCheckBox in allCheckboxes
singleCheckBox.Set ON
Next
The above code will check all the check boxes present on the page. To get all thechild objects we need to specify an object description i.e. we cant use the stringarguments that will be discussed later in the 2nd way of using the programmingdescription.
Possible Operation on Description Object
Consider the below code for all the solutionsDim obj_ChkDesc
Set obj_ChkDesc=Description.Createobj_ChkDesc(html tag).value = INPUTobj_ChkDesc(type).value = checkbox
Q: How to get the no. of description defined in a collectionA: obj_ChkDesc.Count Will return 2 in our case
Q: How to remove a description from the collectionA: obj_ChkDesc.remove html tag would delete the html tag property fromthe collection
Q: How do I check if property exists or not in the collection?
-
8/8/2019 DP in QTP Basics
7/23
A: The answer is that its not possible. Because whenever we try to access aproperty which is not defined its automatically added to the collection. The onlyway to determine is to check its value that is use a if statement if obj_ChkDesc(html tag).value = empty then.
Q: How to browse through all the properties of a properties collection?A: Two ways1st:
For each desc in obj_ChkDescName=desc.NameValue=desc.ValueRE = desc.regularexpression
Next2nd :
For i=0 to obj_ChkDesc.count - 1Name= obj_ChkDesc(i).Name
Value= obj_ChkDesc(i).ValueRE = obj_ChkDesc(i).regularexpressionNext
2. By giving the description in form of the string arguments.
You can describe an object directly in a statement by specifying property:=valuepairs describing the object instead of specifying an objectsname. The general syntax is:
TestObject("PropertyName1:=PropertyValue1", "..." ,"PropertyNameX:=PropertyValueX")
TestObjectthe test object class could be WebEdit, WebRadioGroup etc.
PropertyName:=PropertyValuethe test object property and its value. Each property:=value pair should be separated by commas and quotationmarks. Note that you can enter a variable name as the property value if youwant to find an object based on property values you retrieve during a runsession.
Consider the HTML Code given below:
Now to refer to the textbox the statement would be as given below
Browser(Browser).Page(Page).WebEdit(Name:=txt_Name,htmltag:=INPUT).set Test
-
8/8/2019 DP in QTP Basics
8/23
And to refer to the radio button the statement would be as given below
Browser(Browser).Page(Page).WebRadioGroup(Name:=txt_Name,htmltag:=INPUT).set Test
If we refer to them as a web element then we will have to distinguish between the2 using the index property
Browser(Browser).Page(Page).WebElement(Name:=txt_Name,htmltag:=INPUT,Index:=0).set Test Refers to the textboxBrowser(Browser).Page(Page).WebElement(Name:=txt_Name,htmltag:=INPUT,Index:=1).set Test Refers to the radio button
Reference:1. Mercury QuickTest Professional, Users Guide
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This article would go over some general issues people face while using
Descriptive Programming (DP) in QTP.
Using strings with Pattern
Lets assume we want to click a link "Logout (Tarun)" on my web page.Two possible methods that can be used are
Method 1
Browser ("miccclass:=Browser" ).Page ("micclass:=Page" ). _ Link ("text:=Logout (Tarun)" ).Click
-
8/8/2019 DP in QTP Basics
9/23
Method 2
Set oDesc = Description .CreateoDesc ("text" ).Value = "Logout (Tarun)"
Browser ("miccclass:=Browser" ).Page ("micclass:=Page" ).Link (oDesc ).Click
Now both the above methods will fail giving below mentioned error
Cannot identify the object "[ Link ]" (of class Link). Verify that this object's properties match an object currently displayed in your application.
Looking through the naked eyes on the web page the link does exist indeed
-
8/8/2019 DP in QTP Basics
10/23
So what went wrong? The problem was with the characters "(" and ")" present in the text of the link we used. By default QTP treats all DP properties as regular expression (r.e.) patterns and "(xxx)" is considered as agroup of patter xxx. The text "Logout (Tarun)" when treated as a r.e. gets aliteral meaning of "Logout Tarun", and since there is no such link on theweb page QTP throws an error. To avoid such situations we need to escapethe regular expression characters using the escape character "\". Now wehave three different solutions to correct the problem
Method 1
Browser ("miccclass:=Browser" ).Page ("micclass:=Page" ). _ Link ("text:=Logout \(Tarun\)" ).Click
Method 2
Set oDesc = Description .CreateoDesc ("text" ).Value = "Logout \(Tarun\)"Browser ("miccclass:=Browser" ).Page ("micclass:=Page" ).Link (oDesc ).Click
-
8/8/2019 DP in QTP Basics
11/23
Method 3
Set oDesc = Description .CreateoDesc ("text" ).Value = "Logout (Tarun)"
'Do not treat the value as regular expression.oDesc ("text" ).RegularExpression = False
Browser ("miccclass:=Browser" ).Page ("micclass:=Page" ).Link (oDesc ).Click
IMO Method 3 should be preferred for a neater coding as we are using theactual text of the link.
Overpopulated description while identifying objects
An overpopulated description does not help in recognizing the object. Weshould use minimum no. of properties which are stable enough to recognizethe object on every single run. Consider the below overpopulated description
Set oDesc = Description .CreateoDesc ("html tag" ).Value = "TABLE"
oDesc ("micclass" ).Value = "WebTable"oDesc ("innertext" ).Value = "abcde"oDesc ("outertext" ).Value = "abcde"oDesc ("innerhtml" ).Value = "abcde"oDesc ("outerhtml" ).Value ="abcde"oDesc ("rows" ).Value = 1oDesc ("cols" ).Value = 1
Consider the following advices while create such a description
rows and cols are dynamic properties which might change if the tablegets updated. These properties should be avoided
Only one of the properties from innertext, outertext, outerhtml andinnerhtml should be used
-
8/8/2019 DP in QTP Basics
12/23
outerhtml and innerhtml properties should be avoided as they containsvarious tags and difficult to express
When using Browser().Page().WebTable(oDesc) we can skipspecifying the micclass and html tag properties also because as soonas we enclose oDesc with the WebTable() test object these two
properties are mostly implied.
Considering the above points we can reduce our description to just
Set oDesc = Description .CreateoDesc ("outertext" ).Value = "abcde"
Underpopulated description while using ChildObjects
Though we reduced the no. of properties in the description object whenidentified a table in the last section but while using ChildObjects method weshould make sure the following
Maximum description properties should be used to reduce the finalresult set. Though we should still follow the advices specified inearlier section of overpopulated descriptions except the last one(Where we ignore micclass and HTML tag).
When using ChildObjects to find WebElements, "html tag" shouldalways be provided to avoid errors.
Property names used in description should be as the same case provided in the QTP help file. IMO changing the case sometimescauses general run error during script run. Though there is nodocumentation proving that description names are case sensitive
Using "Class Name" instead of "micclass"
Dont know why by Mercury/HP preferred to show micclass as "Class Name" in the object spy. This misleads many DP user to create a descriptionwith non-existent property class name
-
8/8/2019 DP in QTP Basics
13/23
'Below is the wrong wayBrowser ("Class Name:=Browser" )
'Below is the right wayBrowser ("micclass:=Browser" )
'Below is the wrong waySet oDesc = Description .CreateoDesc ("Class Name" ).Value = "Browser"
-
8/8/2019 DP in QTP Basics
14/23
oDesc ("title" ).Value = "My title"
'Below is the right waySet oDesc = Description .Create
oDesc ("micclass" ).Value = "Browser"oDesc ("title" ).Value = "My title"
These are few general issues that people face.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
DP Part 2 - Converting OR Based scripts to DP
This article discusses how we can convert an Object repository based scriptto DP based script. For this we will do a simple recording of entering sometext on Google.com search text box and clicking the Google search button
The QTP generated script would look something like below
SystemUtil .Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE"Browser ("Browser" ).Page ("Page" ).SyncBrowser ("Browser" ). Navigate "http://www.google.com"Browser ("Browser" ).Page ("Google" ).WebEdit ("q" ).Set "KnowledgeInbox"Browser ("Browser" ).Page ("Google" ).WebButton ("Google Search" ).Click
All the names used between "" are logical name of the objects in the ObjectRepository ("Browser", "Page", "Google", "q", "Google Search") as shownin below image
-
8/8/2019 DP in QTP Basics
15/23
Now lets look the below statement and try and convert it to DPBrowser("Browser").Page("Google").WebButton("Google Search").Click
Converting WebButton("Google Search")
The Google Search object present in the OR has following propertiestype = submit
name = Google Search
html tag = INPUT
-
8/8/2019 DP in QTP Basics
16/23
-
8/8/2019 DP in QTP Basics
17/23
String Description Object DescriptionUses less memory as strings are used Requires more memory as objects are created.
Object creation is as such a overheadIncreases statement length in case
more than one property is to be used
Increase lines of code due to object creation
overhead and property assignmentPreferred when property value have regular expression characters which needs to be treatedliterally(explained in one of the later articles)
DP Converted script
SystemUtil .Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
Browser ("micclass:=Browser" ).Page ("Page" ).SyncBrowser ("micclass:=Browser" ). Navigate "http://www.google.com"
Browser ("micclass:=Browser" ).Page ("micclass:=Page" ).WebEdit ("name:=q").Set _ "KnowledgeInbox"
Browser ("micclass:=Browser" ).Page ("micclass:=Page" ) _ .WebButton ("type:=Submit" , "name:=Google Search" , "htmltag:=A" ).Click
Note: We will discuss more in details about micclass used above in later articles
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Description
-
8/8/2019 DP in QTP Basics
18/23
Enables you to control the recovery scenario mechanism programmatically during the runsession. The recovery scenario mechanism enables you to instruct QuickTest to recover from unexpected events and errors that occur in your testing environment during a runsession.
Activate
Description
Explicitly activates the recovery scenario mechanism at a specific point in the run.
Note: The Activate method only works if the recovery mechanism is enabled, and onlyactivates those recovery scenarios that are currently enabled.
If the recovery mechanism is currently disabled, the Activate method does not activateany recovery scenarios. You can use the Recovery object's Enabled property to change
the status of the recovery mechanism.
Syntax
Recovery.Activate
Example
The following example uses the Activate method to explicitly activate recovery scenariosthree timesthe first time it explicitly activates the three scenarios associated with thecurrent test; the second time it activates only the first and third scenario, since the second
scenario is disabled; the third time it does not activate any scenarios, since the entirerecovery mechanism is disabled.
msgbox Recovery.Count,, "Number of Recovery Scenarios"
msgbox Recovery,, "Is Recovery enabled?"
for Iter = 1 to Recovery.Count
Recovery.GetScenarioName Iter, ScenarioFile, ScenarioName
Position = Recovery.GetScenarioPosition( ScenarioFile, ScenarioName )
msgbox Recovery.GetScenarioStatus( Position ),, "Is scenario " & _ ScenarioName & " from " & ScenarioFile & " enabled ?"
ScenarioFile = Empty
ScenarioName = Empty
-
8/8/2019 DP in QTP Basics
19/23
Next
Recovery.Activate
Recovery.SetScenarioStatus 2, False
Recovery.Activate
Recovery = False
Recovery.Activate
GetScenarioName
Description
Retrieves the name and source file of a recovery scenario, according to the specified position in the list of recovery scenarios associated with the test.
Syntax
Recovery.GetScenarioName Position, out_ScenarioFile, out_ScenarioName
Argument Type Description
Position Number The index position of the recovery scenario in the list.Index position values begin with 1.
out_ScenarioFile String Variable that stores the retrieved name of the recoveryscenario.
out_ScenarioName String Variable that stores the retrieved source file path of therecovery scenario.
GetScenarioPositio
Description
Returns the index position of a recovery scenario in the list of recovery scenariosassociated with the test, according to the specified name and source file.
Syntax
Recovery.GetScenarioPosition ( ScenarioFile, ScenarioName)
-
8/8/2019 DP in QTP Basics
20/23
Argument Type Description
ScenarioFile String The source file path of the recovery scenario.
ScenarioName String The name of the recovery scenario.
Return Value
Number
GetScenarioStatus
Description
Returns the status of a recovery scenario (True = enabled or False = disabled), accordingto the specified index position in the list of recovery scenarios associated with the test.
Syntax
Recovery.GetScenarioStatus Position
Argument Type Description
Position Number The index position of the recovery scenario in the list.Index position values begin with 1.
Return Value
Boolean
SetScenarioStatus
Description
Enables or disables the specified recovery scenario, according to its index position in thelist of recovery scenarios associated with the test.
Syntax
Recovery.SetScenarioStatus Position, Status
Argument Type Description
Position Number The index position of the recovery scenario in the list.Index position values begin with 1.
-
8/8/2019 DP in QTP Basics
21/23
Status Boolean The status to set for the specified scenario (True = enabled or False= disabled).
Count
Description
Returns the number of recovery scenarios associated with the current test.
Syntax
Recovery.Count
Return Value
Number
Enabled
Description
Recovery default property. Retrieves or sets the status of the recovery scenariomechanism for the current test.
Syntax
To retrieve the recovery scenario mechanism status:
Recovery.Enabled
or
Recovery
To set the recovery scenario mechanism status:
Recovery.Enabled =Status
or
Recovery =Status
-
8/8/2019 DP in QTP Basics
22/23
Argument Type Description
Status Boolean The status of the specified scenario (True = enabled or False =disabled).
ReportEvent Method
Description
Reports an event to the test results.
Syntax
Reporter.ReportEvent EventStatus , ReportStepName , Details [, ImageFilePath ]
Argument Type Description EventStatus Number or
pre-definedconstant
Status of the Test Results step:0 or micPass: Causes the status of this step to be passedand sends the specified message to the Test Resultswindow.1 or micFail: Causes the status of this step to be failedand sends the specified message to the Test Resultswindow. When this step runs, the test fails.2 or micDone: Sends a message to the Test Resultswindow without affecting the pass/fail status of the test.3 or micWarning: Sends a warning message to the TestResults window, but does not cause the test to stoprunning, and does not affect the pass/fail status of thetest.
ReportStepName String Name of the step displayed in the Test Results window.
Details String Description of the Test Results event. The string will bedisplayed in the step details frame in the Test Resultswindow.
ImageFilePath String Optional . Path and filename of the image to be
displayed in the Results Details tab of the Test Resultswindow. Images in the following formats can bedisplayed: BMP, PNG, JPEG, and GIF.Notes:
Images cannot be loaded from Quality Center. Including large images in the test results may
-
8/8/2019 DP in QTP Basics
23/23
impact performance.
If an image is specified as a relative path,QuickTest will first search the Results folder for the image and then the search paths specified inthe Folders pane of the Options dialog box.
Examples
The following examples use the ReportEvent method to report a failed step.
Reporter.ReportEvent 1, "Custom Step", "The user-defined step failed."
or
Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."
The following example uses the ReportEvent method to include a captured bitmap in thetest results.
Browser("Browser").Page("WebPage").Image("MyLogo").CaptureBitmap("MyLogo.bm p")
Reporter.ReportEvent micDone, "Display Logo", "This is my logo", "MyLogo.bmp"