Active Topics Memberlist Calendar Search Help | |
Register Login |
One Stop Testing Forum : Testing Tools @ OneStopTesting : QuickTest Pro @ OneStopTesting |
Topic: Some useful QTP functions |
|
Author | Message |
Mithi25
Senior Member Joined: 23Jun2009 Online Status: Offline Posts: 288 |
Topic: Some useful QTP functions Posted: 23Oct2009 at 11:22pm |
How to check for the broken links (both textlinks and image links) on the page with VB script and not the checkpoints.
--------------------------------------------------------- set obj=Browser("name:=Blackboard.*").Page("title:=Blackboard.*").Frame("name:=main.*").object.all.tags("IMG") msgbox obj.length For each element in obj s1=element.nameProp If Browser().Page().Frame().Image("file name:="&s1,"index:=0").exist(0) then If Browser().Page().Frame().Image("file name:="&s1,"index:=0").Object.complete="True" then msgbox "pass" else msgbox "fail" end if end if Next --------------------------------------------------------- Multiple Exit ways ItÙs very easy to control the entry gate to an action or function - thereÙs only one way to enter them. However, the number of exit gates can vary widely from 1 to many according to the inner logic of the action/function. Today IÙm going to address managing multiple exit gates in actions and functions. When everything goes according to plan, an action flow tends to be very simple. There may be inner loops, If or Select switches, but for the most part, the flow just runs straight down to the last line. The problems usually appear when… well, problems appear. If an application error occurs, or even just an unexpected business logic behavior, there might be no escape from immediately exiting the action. ThereÙs no point trying to input 20 data fields, if the form theyÙre in didnÙt even open, is there?The function is something like the following: ‘.Action Code If CritialCondition = False Then ExitAction ‘.Continue Action But this is uninformative. So we add a reporter command: If CritialCondition = False Then Reporter.ReportEvent MicFail, "Something terrible has happened", "Aborting" ExitAction End If And we probably got some objects to remove from memory: If CritialCondition = False Then Reporter.ReportEvent MicFail, "Something terrible has happened", "Aborting" oFile.Close Set oFile = Nothing ExitAction End If ============================================ Ho wait, weÙve gathered some data we need to report back: If CritialCondition = False Then Reporter.ReportEvent MicFail, "Something terrible has happened", "Aborting" oFile.Close Set oFile = Nothing DataTable("out_EntityID", dtlocalsheet) = sEntityID ‘More here ExitAction End If ======================== Well, you probably get the picture. Pretty soon we get massive amounts of code in all the exit gates. This means we have duplicate code to maintain. Duplicate code is the digital manifestation of pure evil – and itÙs never a good idea to have pure evil in you actions. Seriously though, this is exactly the kind of things that produces untraceable bugs, and it must be avoided at all cost. So, how can we deal with this situation? One way is to create an exit gate function. ItÙs the ONLY function I ever put within an action, and not in an external file. HereÙs an example of my action template, with the function: Dim sResult ‘I store result data and values to be reported up the ‘action-call chain Dim sActionReport ‘Instead of flooding the log with inner-action messages, ‘I store them, and report all of them at the exit gate. ‘Errors are still reported on-the-fly ‘Action code goes here ‘All the exit gates execute only one command : ActionEnd. ‘It receives two parameters: Boolean for Pass/Fail, Ùstring for the exit reason If CriticalCondition = False Then Call ActionEnd(False, "Reason for exiting") ‘Rest of action ‘Even the normal successful action exit is managed through ActionEnd, Ùso the last line in every action is: Call ActionEnd(True, "Action successful") Sub ActionEnd(bStatus, sReason) ‘Report details Reporter.ReportEvent MicGeneral, "Inner Action Logs", sActionReport If bStatus = True Then Reporter.ReportEvent MicFail, "An error has occurred", sReason Else Reporter.ReportEvent MicPass, "Action successful", "See inner logs" End if ‘Plant datatable info for action-call chain DataTable("out_Status", dtlocalsheet) = bStatus DataTable("out_Result", dtlocalsheet) = sResult ‘More if needed ‘Close objects and set to nothing here ‘Other needed exit code ExitActionIteration End Sub With this mechanism, maintaining the exit code becomes very simple, and the logs are much more readable. Ok, so this solves the problem for actions, but what about functions? Well, obviously we can write an inner function within a function, but there is an alternative solution. ItÙs less elegant than the ActionEnd solution by far, and is harder to maintain, so I recommend using it only in a small number of very complex functions. The solution is based on the Execute command, so I recommend reading about it in QTPÙs help file in case youÙre not familiar with it. In a nutshell, the Execute command takes a string, and runs its contents as if it were VBScript code. So for instance the command Execute "msgbox(2)" will pop a message box with the number 2. HereÙs an example for the solution, applied to the ComplexFunc function: Function ComplexFunc Dim sExitCode Dim sResult Dim oFile ‘will be FSO textstream Ùseparate code lines by vbcrlf or ":" sExitCode = "oFile.Close" & vbcrlf & _ "Set oFile = Nothing" & vbcrlf & _ "ComplexFunc = sResult" ‘More exit code ‘Function code goes here ‘Exit Gate If CriticalCondition = False then sResult = "False, No Connection" Execute sExitCode Exit Function End if ‘More function code ‘Successful exit Execute sExitCode End Function Creating and Calling user define funtion Test Conditons: Creating and Calling user define funtion 1. Crate small add function and make it compile module. 2. calling that function in other test (using user defined data values) [ Pre Requesties : Nothing ] 1a. open win runner blank test and add this below data public function add(in a, in b) { return a+b; } 1b. Go to File menu --> Test Properties (Test Properties window will open) in General Tab --> Test Type= Compile module and ok 1c.Save the test in some location (Ex c:/tt ) 2a.Before writing code , you have to load the funtction in to your folder , globally available to all tests. 2b. Go to Tools menu --> General Options --- Select Folder option in the left pan. -- Search Path for called test below enter the path of compile module (c:/tt) and press "+" button to add in to. 2c. Write down the bleow code in the new test load("c:/tt"); l= create_input_dialog("Enter First value"); j=create_input_dialog("Enter Second Value"); k=add(l,j); report_msg(k); unload("c:/tt"); |
|
Post Resume: Click here to Upload your Resume & Apply for Jobs |
|
IP Logged | |
Forum Jump |
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |
© Vyom Technosoft Pvt. Ltd. All Rights Reserved.