dp in qtp basics

Upload: basheer-perayipalle

Post on 10-Apr-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

  • 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"