Sunday 28 July 2013

QTP Object Recognition Issues

THINGS TO TRY WHEN QTP DOES NOT RECOGNIZE AN OBJECT


What do you do when QuickTest Professional (QTP) doesn’t automatically recognize an object in your application? In my experience, these are the first six things to try/check:
1. Check the loaded add-ins:
It’s pretty basic, but be sure you have the correct add-ins selected. If QTP is only recognizing your objects as standard WinObject this may be a sign that you need to use an add-in. Sometimes QTP’s ‘Display Add-in’ Manager on start-up option, under Tools\Options\General may not be selected. This setting may cause you to start QTP on a machine and mistakenly assume that all of the correct add-ins have been chosen. Double-check by opening your script and selecting File\Settings under Properties ‘Associated add-ins:’ verifying that all the needed add-ins are listed. Also make sure QTP is started before the application under test. QTP will sometimes not recognize a web application if the browser was opened before QTP.
Add-Ins
Research the issue. If your add-ins are fine, the next step is to search theHP’s Knowledge base. Again, this may seem obvious, but a surprising number of people fail to do this. There’s nothing worse than spending hours on a script only to discover later that there is a patch (for example see patch that resolves some QTP 11 object issues) available or a posted solution that will solve the problem. I’m sometimes hailed as an automation genius by fixing something that an engineer may have been struggling with for days, based on information I found in the KB. Often, even after I tell the engineer how I solved the issue, they still don’t check the KB the next time they have a problem. Do me a favor — don’t be that guy (or gal)! Check the KB. (If nothing is found in the KB, another great resource to check is SQAForums.
3. Using .Object:
Look at all the available object’s operations (both the “identification properties” and “native properties” methods). You’ll be surprised what you’ll find lurking around in an object’s properties that may help to automate it. Using .Object try as many operations as possible–even ones that may not seem remotely relevant to the action you want to perform. For example: I was having a problem recognizing text on an application’s custom .NET grid. After spying on the object and trying several different methods that sounded promising, I ended up trying an odd one, called GetViewStyleInfo, and surprisingly it worked!


4. Try GetVisibleText:
Sometimes QTP does not recognize text in an object using the GetROProperty(“text”) method. As a last resort, try using the GetVisibleText, GetTextLocation and Type methods. These methods really helped me automate some old proprietary controls. Using a combination of QTP’s TYPE method and GetTextLocation, I created a very reliable rich edit box object function. For example:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
RichEditBoxICW "0","ENTER","=>","T","From date:" 
wait 1
RichEditBoxICW "0","ENTER","Through","T^20","Through date:" 
wait 1
RichEditBoxICW "0","ENTER","No=>","N","Do you want to queue this activity?" 
'***********************************
'* RICHEDITBOX
'**********************************
'************************
'* ICW
'* @Documentation  Used to perform valid actions on RichEdit objects.
'************************
Function RichEditBoxICW(index,action,lineText,valueToEnter,comment)
  
On Error Resume Next
  
'*****************************************
' SET OR PATH BASED ON ENV
'***************************************** 
set strICWPath = Browser("CF").Page("CF").Frame("WorkSpace").SwfObject("IEController")
strParse = strings("PARSE",valueToEnter,"LEFT","","") 'this would return False string does not contain ^
  
Select Case UCASE(action)
 Case "ENTER"
   intXY = getTextXY(lineText)
   arrXY = Split(intXY,"^")
   strICWPath.WinObject("regexpwndclass:=RichEdit20A").Click arrXY(0),arrXY(1)
     
     If strParse = "False"  Then
      Reporter.Filter = rfEnableAll
      strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type micRight
      strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type valueToEnter
      strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type micReturn
      strReportMsg = "ENTERED ->" & valueToEnter
     ELSE
      strEnterValue = geString("PARSE",strValueToEnter,"LEFT","","")'Get Value to Enter
      strRightCount = geString("PARSE",strValueToEnter,"RIGHT","","")'Get # of right keys to press before entering text
      
     for nTabs = 1 to strRightCount
       strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type micRight
     next
        
       strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type strEnterValue
       strICWPath.WinObject("regexpwndclass:=RichEdit20A").Type micReturn 
                       
      strReportMsg = "ENTERED ->" & strEnterValue
   end select 
End Function
'---------------------------------------------------------
'@Function Name:   getTextXY
'@Documentation    Return X and Y coordinates of text
'@Parameters:        The text to find
'@Created By:        Joe Colantonio
'@Return Values:     X & Y coord separated by a ^
'@Example:            intXY = getTextXY(strLineText)
'-------------------------------------------------------------
Function getTextXY(strTextToFindXYFor)
  
set strICWPath = Browser("CF").Page("CF").Frame("WorkSpace").SwfObject("IEController")
  
  l = -1
  t = -1
  r = -1
  b = -1
 rc = strICWPath.WinObject("regexpwndclass:=RichEdit20A").GetTextLocation(strTextToFindXYFor, l, t, r, b)
  
 getTextXY = r & "^" & t
  
End function
5. Developers are your friend:
The application’s developers can help you. Ask your developers to expose a method or add a property that will make automation easier. But before you ask — make sure you’ve exhausted all the above suggestions. Developers can be a tough bunch, and you really don’t want to annoy them with things you could have resolved on your own. I work with some awesome programmers, and as long as I’m able to clearly explain to them what I need and why, they never hesitate to help.
6. Make sure there is not a patch that will help.
 Sometimes there are known issues with object recognition that only a  QTP  patch will resolve. Also new patches sometime include support for newer version of  AUT like .NET or Browsers.
For an updated list of all patches available for QTP 11 check out the Patches section in my article:QTP 11 Support Matrix with Patch Updates
These are my top 6 suggestions – what are yours?
Tip 6.1 – From Mike G Marshall “Another thing to check is “Record and Run” setting under Automation menu. If you try and identify an object in an application that doesn’t match the rules here, it will show as a standard Windows object.”
Tip 6.2 – From Michael te Wierik – “I don’t know how many times I have slaved away to find a solution to an object identification issue, and then remembered to use “Low level recording” from the Automation menu when recording. Its a massive timesaver.”

1 comment:

  1. Congrats on your first blogging! Contents are very informative. Wish to see more blogs on the go. Happy blogging!

    ReplyDelete