Monday, May 21, 2012

Some experience with QTP 11

I have encountered many QTP's issues since working with AUT (dot Net 4.0) both 32 bit and 64 bit, QTP will intend to crash after long run ...solution I found here it: update latest hotfix for QTP.






Monday, December 19, 2011

Select custom button in SwfToolbar

/[TestComplete JScript]==============================
// Function:    SelectMainMenu
// Description: selects a menu item from Infragistic Main menu
// Parameters:
//  -pProcess  - process of the application
//  -oMenu     - main menu, object
//  -sMenuItem - menu item to select, string 
// Return: <none>
// NOTES: menu items should be splitted with "|" symbol, e.g. "File|Options", "Administration|Edit|Account Roles" 
function SelectMainMenu(pProcess, oMenu, sMenuItem)
{
  var aMenu = sMenuItem.split("|");
  var i, j; // counter
  var iX = 0, iY = 0; // coordinates for clicking
  var iCount; // menu items count for each toolbar/popup menu
  var obj; // temporary object for different menuitems
  var iLevels = aMenu.length-1;
  
  // * * * Selecting top level menu item...
  iCount = oMenu.ToolbarsManager.Toolbars.Item(0).Tools.Count; // number of menu items in main menu
  for(i = 0; i < iCount; i++)
  {
    obj = oMenu.ToolbarsManager.Toolbars.Item(0).Tools.Item(i);
    Log.Message("Checking menu '" + obj.CaptionResolved.OleValue + "'");
    if(obj.CaptionResolved.OleValue.match(aMenu[0]))
    {
      oMenu.Click(iX + obj.WidthResolved/2, iY + obj.Height/2);
      break;
    }
    else
    {
      iX += obj.WidthResolved*obj.VisibleResolved;
    }
  }
  
  // * * * After top level menu selected selecting other menus...
  //for(j = iLevels; j > 0; j--)
  for(j = 1; j <= iLevels; j++)
  {
  iX = 0; iY = 0;
  obj = pProcess.WinFormsObject("DropDownForm", "", 1).WinFormsObject("PopupMenuControlTrusted", "");
  iCount = obj.MenuAgent.MenuItems.Count;
  for(i = 0; i < iCount; i++)
  {
    Log.Message("Checking menu item '" + obj.MenuAgent.MenuItems.Item(i).Text.OleValue + "'");
    if(StrTran (obj.MenuAgent.MenuItems.Item(i).Text.OleValue, "&", "").match(aMenu[j]))
    {
      obj.Click(iX + 10, iY + 10);
      break;
    }
    else
    {
      iY += 25;
    }
  }
  } // j= iLevels...
}

Sunday, December 18, 2011

Select all rows in Infragistics.Win.UltraWinGrid.UltraGrid

I have found the way to select all rows in table and check whether all that rows is selected or not.


Public Function Swf_SelectAllItems(ByRef objSwfTable)
Dim strStep: strStep= "Swf_SelectAllItems()"
Dim numRows,i
If objSwfTable.GetROProperty("enabled") Then
numRows = objSwfTable.RowCount

objSwfTable.Type micLCtrlDwn

For i = 0 to numRows-1
objSwfTable.SelectRow i
objSwfTable.Type micDwn
Next
objSwfTable.Type micLCtrlUp
Dim iSelectedRows: iSelectedRows = objSwfTable.Object.Selected.Rows.Count
If  numRows = iSelectedRows Then
            reporter.ReportEvent micDone,strStep,"Success: Successfully Select All Items"
Swf_SelectAllItems=True
        Else
            reporter.ReportEvent micWarning,strStep, "Fail: Does NOT select All Items"
Swf_SelectAllItems=False
End If
Else
reporter.ReportEvent micWarning,strStep, "The : table is NOT ENABLE."
End If

End Function

Wednesday, December 7, 2011

Sending mails using Outlook and SMTP

Here we will see how we can send the mail after the test run using outlook and also using SMTP. First let us see how to send the mail using Outlook. This method though useful has the following drawbacks:
1. The system or machine where you are running the scripts should have outlook configured in it
2. The email will be sent in the name of the person whose email has been configured in the outlook. 
3. Finally, outlook throws up a security message when you try to send an automated mail and to take care of this you will have to download a third party software called expressclick.

Well, if you still prefer to go by this method, then here is the code 

systemutil.Run "C:\Program Files\Express ClickYes\ClickYes.exe"
wait 5
set oMailobj=CreateObject("Outlook.Application")

set oSendmail=oMailobj.CreateItem(0)
oSendmail.To=""
'oSendmail.Cc=""
oSendmail.Subject="Test"
oSendmail.Body="Hi" & vbcrLf & vbCrlf & "PFA the Smoke Test Automation Results" & vbCrlf & vbCrlf & "Thanks" & vbcrlf & "Automation Team"
sAttachment = "D:\Results.zip"
If (sAttachment <> "") Then
oSendmail.Attachments.Add(sAttachment)

Else
Reporter.ReportEvent micInfo,"Sending mail:","Unable to send attachment,please verify your attachment file"
End If
oSendmail.Send
wait 3
set oSendmail=Nothing
set oMailobj=Nothing
SystemUtil.CloseProcessByName "ClickYes.exe"

All these problems can be overcome by using SMTP mail. The only thing that you need to know is the SMTP server name and the machine should be in the network. Once you use this code you will never go back to using Outlook.

Set oMessage = CreateObject("CDO.Message")

oMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'SMTP Server
oMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") ="servername or ip"

oMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

oMessage.Configuration.Fields.Update
oMessage.Subject = "Test"
oMessage.Sender = "" ' any non-existing mail id will also work.
oMessage.To =""
'oMessage.CC = ""
'oMessage.BCC = ""

oMessage.AddAttachment "D:\Results.zip"
oMessage.TextBody = "Hi" & vbcrLf & vbCrlf & "PFA the Smoke Test Automation Results & vbCrlf & vbCrlf & "Thanks" & vbcrlf & "Automation Team" & vbCrlf & vbCrlf & vbCrlf &"*********************************************************************************************************" & vbcrlf & "This is an auto-generated email. Please do not reply to this email." & vbcrlf &"*********************************************************************************************************"
oMessage.Send

Set oMessage = Nothing



Source: http://qtp-learnings.blogspot.com/2010/08/sending-mails-using-outlook-and-smtp.html

How to send email with attachment from outlook using qtp


 Code:
Text1 ="The information contained in this message " _
    & "constitutes privileged and confidential information " _
    & "and is intended only for the use of and review by " _
    & "the recipient designated above."
 
Text2= "The information contained in this message " _
    & "constitutes privileged and confidential information " _
    & "and is intended only for the use of and review by " _
    & "the recipient designated above."
 
'Multiline body
Body= Text1 & vbCrLf & Text2
 
'path of the file sample.txt  to be attached
path="D:\sample.txt"
 
'Usage of Function  "Send_Testresults"
'Multiple email Id can be used  with  semicolon as Seperator
Send_Testresults"xx@mail.com;yy@abc.com","zz@xyz.com",,"Mail from QTPWorld.com",Body,path
 
'Function  to send email
Function  Send_Testresults(sTo,sCC,sBCC,sSubject,sBody,sAttachment)
 
'Open outlook if Outlook is not open
   systemUtil.Run "OUTLOOK.EXE"
   wait (10)
 'Create Outlook Object
Set oMail = CreateObject("Outlook.Application")
 
set  Sendmail=oMail.CreateItem(0)
      Sendmail.To=sTo
      Sendmail.CC=sCC
      Sendmail.BCC=sBCC
      Sendmail.Subject=sSubject
      Sendmail.Body=sBody
          If (sAttachment <> "") Then
         Sendmail.Attachments.Add(sAttachment)
         End If 
 
       Sendmail.Send
 
oMail.quit
 
set  Sendmail=Nothing
set oMail=Nothing
 
End Function









Source: http://qtpworld.com/index.php?cid=89

Tuesday, October 4, 2011

Generate Logfile in HTML


There are a lot of different solutions for improved reporting in QTP (for example, our very own ReporterManager). However, sometimes, you simple wish to export the entire report into a single HTML file, in order to copy / mail / archive it. Here’s a neat trick that will help you do that:
Open the registry editor, and go to
HKLM->SOFTWARE->Mercury Interactive->QuickTest Professional->Logger->Media->Log
There’s an item named “Active” under that key. Change it to 1 (it should be 0)
Now when you run a test (you need to restart QTP after the change), the results folder will include a LOG folder, with the entire log as a single HTML file. It’s a concise report, but it’s quite enough for most user.
Source:  http://www.advancedqtp.com/2008/08/save-qtp-report-as-a-single-html-file/

Saturday, September 17, 2011

4 ways to get & count objects in QTP


4 ways to get & count objects in QTP

Imagine simple and practical QTP tasks:
  • How to count all links on Web page?
  • How to get them and click each link?
  • How to get all WebEdits and check their values?

I'm going to show 4 approaches how to get lists of UI controls and process them (for example get their count).
As an example, I will work with links on Google Labs page. My goal is to get the list of links and count them.

I've added Google Labs page to my Object Repository and now it looks like:
I use Object Repository (OR) to simplify my demo-scripts.
Since the browser & the page were added to OR, we can use them later like:
Browser("Google Labs").Page("Google Labs").

Now we are ready to start!

  1. QTP Descriptive Programming (QTP DP) and ChildObjects QTP function
    The approach uses Description object, which contains a 'mask'
     for objects we would like to get.
    QTP script is:
    Set oDesc = Description.Create()
    oDesc("micclass").Value = "Link"
    Set 
    Links = Browser("Google Labs").Page("Google Labs").ChildObjects(oDesc)
    Msgbox "Total links: " & Links.Count
    The result of this QTP script is:
    ChildObjects returns the collection of child objects matched the description ("micclass" is "Link") and contained within the object (Page("Google Labs")).

  2. Object QTP property and objects collections
    QTP can work with DOM:
    Set Links = Browser("Google Labs").Page("Google Labs").Object.Links
    Msgbox "Total links: " & Links.Length
    I use Object property of Page object. It represents the HTML document in a given browser window.
    This document contains different collections - formsframesimageslinks, etc.
    And we use Length property to get the number of items in a collection.

    The result is the same as for the previous QTP script:

  3. Object QTP property and GetElementsByTagName method
    Again, we can get access to 
    the HTML document and use its GetElementsByTagName method
    As the name says, 
    GetElementsByTagName method returns a collection of objects with the specified tag.
    Since we are going to get all link, we should use "a" tag.

    QTP script is:

    Set Links = Browser("Google Labs").Page("Google Labs").Object.GetElementsByTagName("a")
    Msgbox "Total links: " & Links.Length
    The result is the following:

    Note: There is another way how to select objects by tag name:
    Set Links = Browser("Google Labs").Page("Google Labs").Object.all.tags("a")
    Msgbox "Total links: " & Links.Length
    The result will be the same. 69 link will be found.

  4. XPath queries in QTP
    The idea of this approach is to use XPath queries on a source code of Web page.
    For example, "//a" XPath query returns all "a" nodes (= links) from XML file.

    There is one problem. Web page contains HTML code, which looks like XML code but actually it is not.
    For example:
    • HTML code can contain unclosed img or br tags, XML code cannot.
    • HTML code is a case-insensitive markup language, XML is a case-sensitive markup language, etc
      More details here.

    So, we have to convert HTML source code into XML. The converted code is named as XHTML.

    You can convert HTML documents into XHTML using an Open Source HTML Tidy utility.
    You can find more info about how to convert HTML code into XHTML code here.

    I will use the final QTP script from this page, a bit modified:

    ' to get an HTML source code of Web page
    HtmlCode = Browser("Google Labs").Page("Google Labs").Object.documentElement.outerHtml

    ' save HTML code to a local file
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateTextFile("C:\HtmlCode.html"True, -1)
    f.Write(HtmlCode)
    f.Close()

    ' run tidy.exe to convert HTML to XHTML 
    Set oShell = CreateObject("Wscript.shell")
    oShell.Run "C:\tidy.exe --doctype omit -asxhtml -m -n C:\HtmlCode.html", 1, True ' waits for tidy.exe to be finished

    ' create MSXML parser
    Set objXML = CreateObject("MSXML2.DOMDocument.3.0")
    objXML.Async = False 
    objXML.Load("C:\HtmlCode.html")

    XPath = "//a" ' XPath query means to find all links
    Set Links = objXML.SelectNodes(XPath)
    Msgbox "Total links: " & Links.Length
    Note: you can download tidy.exe here for above QTP script.

    This QTP script leads to the same results - 69 links found:
    (Click the image to enlarge it)

  5. Bonus approah 
    Why don't you count all Wen page objects manually? :) Open a source code of the page and start counting :)
    Just joking :)

Summary:
  • I shown 4 practical approaches how to count Web page links.Similarly you can process images, webedits, etc
  • Each approach gets a list of objects.
  • First approach (QTP DP + ChildObjects) is the most easy
  • Second & third approaches (Object + collectionsObject + GetElementsByTagName) will work on Internet Explorer, because they use DOM methods
  • Fours approach is biggest but it is more powerful. It allows to use complex XPath queries.

Source: http://motevich.blogspot.com/2008/11/4-ways-to-get-count-objects-in-qtp.html