db_qtp 发表于 2012-4-3 14:50:45

QTP Function Design_Ask help

本帖最后由 db_qtp 于 2012-4-3 18:47 编辑

Need desgin a function as below scenario:

Step 1: Navigate to Grid Page. (This information can be extracted from below excel sheet)

SR#        Grid Page        Max Rows
1        Draft 1        8
2        Draft 2        3

Step 2: Identify Filter/Sort Fields(Columns) in the screen
Step 3: Store the data in the Column into local variable

Column 1        Column 2        Column3        …
Value 1        …        …        …
Value 2        …        …        …
Value 3        …        …        …
Value 4        …        …        …

Step 4: Filter all columns and validate
Step 5: Sort all columns (ASC/DSC) and validate

db_qtp 发表于 2012-4-3 22:25:49

本帖最后由 db_qtp 于 2012-4-4 11:54 编辑

waitting for the answer

db_qtp 发表于 2012-4-4 11:53:44

Can any one start from Step 2/3 firstly?

lifr 发表于 2012-4-4 14:58:24

回复 3# db_qtp


希望你能有诚意的问问题.

1) 你对解决这个问题是否自己已经有了尝试?
我认为你首先应该尝试去解决问题, 在解决问题的过程中遇到了什么具体的问题.那么可以在论坛里提问.而不是像这样, 直接贴出整个问题.别人也没有办法帮助你.

2) 如果你的电脑有中文输入法, 那么请输入中文.
因为这是中文论坛. 而且你翻译为中文, 可以得到更好的帮助

db_qtp 发表于 2012-4-4 15:27:19

本帖最后由 db_qtp 于 2012-4-5 13:43 编辑

回复 4# lifr


    谢谢你的回复, 个人感觉是带着诚意来这里提问题的,可能由于时间的仓促,这个键盘输入中文的不方便以及初学qtp和VB导致提问题的方式方法有所欠缺在此说声抱歉.对于我所提的问题我都尝试过了并且在等待回答的同时一直在尝试,只是感觉自己的写的代码很糟所以也不太好意思贴上来就把问题直接贴了上来想快速参考这里经验较丰富的回答. 下面归纳了些在设计这个function时所碰到的问题:

db_qtp 发表于 2012-4-4 15:50:37

本帖最后由 db_qtp 于 2012-4-5 14:03 编辑

在step 2中,尝试用下面的方法去识别 Filter/Sort 的值并把他们储存到local variables 但一直在"setobjChild=Browser("").Page("").WebTable("").Childobjects(ObjDesc)"这行报错
set objDesc=Description.create(). 报错信息为:"General run error.
Line (62): "set objChild=Browser("").Page("").WebTable("").Childobjects(ObjDesc)"

objDesc("micclass").value="WebElement"
          setobjChild=Browser("").Page("").WebTable("").Childobjects(ObjDesc)
                                        For i=0 to objChild.count-1               
                             RO=Browser("").Page(" ").WebTable("").Childobjects(ObjDesc).GetROProperty("innertext")
                   datatable.GetSheet("Action1").GetParameter("Check").ValueByRow(2)=RO
                        next

db_qtp 发表于 2012-4-5 15:52:50

up

lifr 发表于 2012-4-5 17:00:21

回复 6# db_qtp


在debug窗口,按照下面的顺序, 检查元素是否存在.
Browser("")
Browser("").Page("")
Browser("").Page("").WebTable("")

db_qtp 发表于 2012-4-5 18:15:40

回复 8# lifr


   谢谢你的回复. 有什么方法可以识别系统里的Filter/Sort Fields(Columns) 并且把这些值存储到本地的datasheet 里?
Column 1      Column 2      Column3      …
Value 1      …      …      …
Value 2      …      …      …
Value 3      …      …      …
Value 4      …      …      …

我尝试了下面的办法但不行
Dim oDesc

Set MyDescription = Description.Create()
MyDescription("micclass").Value = "WebElement"


For i=0 to checkboxes.count-1               
   Dim RO
        RO=Browser("Name:=").Page("title:=").Childobjects(MyDescription).GetROProperty("innertext")
                           msgbox RO
                                   '
                     colcount=newsheet.UsedRange.Columns.Count 'Add to Header
                                 For i = 1 To colcount
                                    param=newsheet.Cells(1,i)
                                    DataTable.GetSheet("Action1").AddParameter param,""
                                 next

                         rowcount=newsheet.UsedRange.Rows.Count
                         colcount=newsheet.UsedRange.Columns.Count

                                 For i = 2 To rowcount
                                    DataTable.GetSheet("Action1").SetCurrentRow i-1
                                          For j =1 To colcount
                                           param=newsheet.Cells(i,j)
                                           DataTable.value(j,"Action1")=param   
                                           Next
                                 Next
                   datatable.GetSheet("Action1").GetParameter("Check").ValueByRow(2)=RO
                        next

db_qtp 发表于 2012-4-6 12:25:54

up

lotus 发表于 2012-4-6 17:00:27

你的问题描述不清晰,无法重现,呵...
很提问的都是做测试的,确无法清晰表述自己的问题,担心你们提交的bug开发人员能重现修改不,
唉,良好的测试人员的基本条件,清楚表述呀

db_qtp 发表于 2012-4-6 18:48:16

回复 11# lotus

感谢你的回复,个人感觉问题已经很清晰了,就是我的script实现不了下面的function. 如果这里有人曾经遇到过相同/类似的情况希望可以共享一下脚本。

Step 2: Identify Filter/Sort Fields(Columns) in the screen
Step 3: Store the data in the Column into local variable

Column 1      Column 2      Column3      …
Value 1      …      …      …
Value 2      …      …      …
Value 3      …      …      …
Value 4      …      …      …

Step 4: Filter all columns and validate
Step 5: Sort all columns (ASC/DSC) and validate

lifr 发表于 2012-4-6 21:00:29

本帖最后由 lifr 于 2012-4-6 21:03 编辑

回复 12# db_qtp
看得出你QTP经验和编程经验都不太多.经验多少没有关系, 关键是解决问题的思路要清晰.

你的代码的有一个问题是一个函数要解决的问题太多, 结果把好多东西都混杂在一起. 出错了都不知道在哪里出错.

我给你一个思路
1. 定位要操作的table
通过QTP的对象spy找出此table, 然后用"column names"属性来定位此table

2. 把数据从table里提取出来
从你的要求来看, 保存Table里的数据使用 Dictionary数据结构, key是column name, value是一个Array. 其中Array的值是所有行在此column的cell的值.
也就是像下面的样子
{column =>

注意: 没有必要用DataTable. 除非有把此数据持久化保存的要求, 否则不用DataTable.

3. 对其中的某一个column, 验证sort功能
首先对Dictionary中此column对应的Array进行排序, 这个是expected result.

对页面上Table中的column排序(click on head?), 把column的值提取出来(调用step2的函数), 这个是actual result.

比较expected result和actual result.

具体的操作, 给你一段代码参考.
' get text from a cell.
'
' @return value of input box if in cell is an input box
Function GUI_Table_GetCellText(objTbl, rowIdx, colIdx)

      idx = 0
      strVal = Empty
      Do
            Set ele = objTbl.ChildItem(rowIdx, colIdx, "WebElement", idx)
            If ele is Nothing Then Exit Do End If

            If ele.getROProperty("html tag") = "INPUT" Then
                strVal = ele.getROProperty("Value") ' editable param table
                Exit Do
            ' first visiable SPAN
            ElseIf ele.getROProperty("html tag") = "SPAN" And LCase(ele.object.style.display)<>"none" Then
                strVal = ele.getROProperty("innertext") ' cell with span
                Exit Do
            Else
                ' Not ok
            End If
            idx = idx + 1
      Loop

      If IsEmpty(strVal) Then
            strVal = objTbl.GetCellData(rowIdx, colIdx) 'plain cell
      End If

      GUI_Table_GetCellText = Trim(strVal)
End Function

' read table content into [{rowIdx=1; key1=val1; ..}, ...]
'
' Note a special key "rowIdx" added for each row
Function GUI_Table_Read(tbl)
      
      Dim itemAry()
      ReDim itemAry(tbl.RowCount - 2)
      colAry = split(tbl.getROProperty("column names"), ";")
      For rowIdx=2 To tbl.RowCount
                Set rowMap = CreateObject("Scripting.Dictionary")
                For i=0 to UBound(colAry)
                        colName = colAry(i)
                        colIdx = i+1
                        celVal = GUI_Table_GetCellText(tbl, rowIdx, colIdx)
                        rowMap.Add Trim(colName), Trim(celVal)
                Next
                rowMap.Add "rowIdx", rowIdx
                Set itemAry(rowIdx-2) = rowMap
                Set rowMap = Nothing
      Next
      
      GUI_Table_Read = itemAry
End Function

db_qtp 发表于 2012-4-6 23:26:36

回复 13# lifr


    真诚的非常感谢你的回复,我刚开始学习。希望可以早点独立以后以帮助别人来解决问题像你这样的身份回到这个论坛。:)

db_qtp 发表于 2012-4-7 20:20:48

回复 13# lifr

Please kindly check my issue inline
    1. 定位要操作的table
通过QTP的对象spy找出此table, 然后用"column names"属性来定位此table
Issue: 我所测试的系统很奇怪,这个table 单独spy 不出来. 我只有spy 它的column 时, 它spy 出来的结构为(才可以看到webTable):
Browser:
    Page:
      Web Table:
             WebElement:
当我spy column下面各个cell value 时, 它spy 出来的结构和上面 的结构一样,但是 web table 里 "column names"属性是不一样的, 这是否说明存在不同的table?
Column 1      Column 2      Column3      …
Value 1      …      …      …
Value 2      …      …      …
Value 3      …      …      …
Value 4      …      …      …

2. 你给我参考的代码其中一条为(Function GUI_Table_GetCellText中的第四行):
Set ele = objTbl.ChildItem(rowIdx, colIdx, "WebElement", idx)
在此之前我定义了set objTbl = Browser("Name:=").Page("title:=").WebTable("column names:=") (此处的webtable 属性我用了上面的第一个spy 出来的)
但在跑脚本的时候 ,qtp 报了"The statement contains one or more invalid function arguments.
Line (85): "Set ele = objTbl.ChildItem(rowIdx, colIdx, "WebElement", idx)"."err msg.

lifr 发表于 2012-4-8 11:16:39

RE: QTP Function Design_Ask help

回复 15# db_qtp

你的问题都是需要在现场通过调试去定位的, 如果你不懂怎么去调试问题, 那么最好先请教一下身边的人, 可以现场指导你一下.我且回答你这两个问题.

1) 是不是存在不同的table
用firfox+firebug查看一下该page的dom tree, 是不是一个table就一目了然了. 如果你用IE9, 也有相应的工具, 菜单"tools->develop tools".

2) 调用childitem出错
单步到这行代码
Set ele = objTbl.ChildItem(rowIdx, colIdx, "WebElement", idx)
检查, objTb, rowIdx, colIdx, 和idx的值, 是否有异常的地方, 比如没有赋值的情况.

而且这个函数是给你参考的, 为了简化, 你可以直接用 objtbl.GetCellData(rowIdx, colidx) 这个函数来获取cell里的值. 如果你不知道这个函数的用法, 打开qtp的帮助文档, 输入关键词webtable, 里面就有此方法的帮助.

兄弟, 不是我不愿意帮助你, 我感觉你缺少qtp开发人员需要掌握的基本知识和技术. 你这样搞, 效率很低啊. 磨刀不误砍柴工, 你还是找本书, 先把qtp学习一下吧.

db_qtp 发表于 2012-4-8 12:43:46

回复 16# lifr

感谢你的耐心,我也希望有足够磨刀的时间~~但现在是被逼着直接砍柴。所以只能边磨刀边砍柴,压力很大

db_qtp 发表于 2012-4-9 17:47:23

回复 16# lifr

今天我重新spy 了一下,发现原来这个页面的每一行都是个单独的table. eg: Column 1 column 2.......是一个table
Value 1 .... .... .....是另外一个table, 而value 2 .... ... ... ....又是一个单独的table. 对于这种情况有什么办法可以验证他们的sort 和 filter 的功能是否正确
    Column 1      Column 2      Column3      …
Value 1      …      …      …
Value 2      …      …      …
Value 3      …      …      …
Value 4      …      …      …
页: [1]
查看完整版本: QTP Function Design_Ask help