hsjzfling 发表于 2009-8-20 11:28:11

GetTextLocation —— 依据文本值动态获取坐标进行点击、拖拽操作

在实际工作中我们经常会遇到对一些不能被捕获的对象进行点击、拖拽操作,直接去录制可能得到的就是Object.Click xxx,yyy ,这样的代码健壮性和可维护性都非常的差。
如果需要被操作的位置上有相对唯一的文本值,那么就可以考虑使用GetTextLocation方法来辅助我们来动态定位到预期的坐标,这样就不会因为界面位置一点点的变动导致脚本运行失败了。

先在帮助文档中查找GetTextLocation方法看看,我们会惊奇的发现几乎所有的对象都能支持该方法,这就使得该方法的应用范围会比较广,帮助文档中的描述如下:
Syntaxobject.GetTextLocation (TextToFind, Left, Top, Right, Bottom, [MatchWholeWordOnly])


ms-its:C:\Program Files\HP\QuickTest Professional\Help\ActiveX.chm::/aximages/collapse.gifSyntax DetailsArgumentDescriptionTextToFindRequired. A String value. The text string you want to locate.LeftRequired. A Variant value. The left coordinate of the search area within the window or screen. TopRequired. A Variant value. The top coordinate of the search area within the window or screen. RightRequired. A Variant value. The right coordinate of the search area within the window or screen. BottomRequired. A Variant value. The bottom coordinate of the search area within the window or screen.
Note: Set the Left, Top, Right, and Bottom coordinates to -1 to search for the text string within the object’s entire window.
MatchWholeWordOnlyOptional. A Boolean value. If True, the method searches for occurrences that are whole words only and not part of a larger word. If False, the method does not restrict the results to occurrences that are whole words only. Default value = True


下面我们来看一个运用GetTextLocation的实例

先简单的描述下需求,现在需要点击自定义的菜单栏上的"Generate Report"按钮,但按钮控件不能被捕获,只能识别到整个菜单栏对象为VbWindow("Window").WinObject("Menu"),点击按钮的代码如下:

'获取"Generate Report"文本在WinObject("Menu")中的坐标范围,并返回给L(left),T(top),R(right),B(bottom)
VbWindow("Window").WinObject("Menu").GetTextLocation strText,L,T,R,B,True
'点击该文本所在坐标区域的正中心位置
VbWindow("Window").WinObject("Menu").Click (L+R)/2, (T+B)/2


为了便于使用,我们也可以进行简单的封装,例如:

FunctionClickText(objOB, strText)
   If objOB.Exist(1) Then
   objOB.GetTextLocation strText,L,T,R,B,True
   objOB.Click (L+R)/2, (T+B)/2
   Else
   Reporter.ReportEvent micFail , "Can not find the specified object!", ""
   End If
End Function

ClickText VbWindow("Window").WinObject("Menu"),"Generate Report"


进行拖拽操作也是一样的,通过GetTextLocation方法来获取文本中心位置坐标,动态的做为Drag和Drop的参数,这样就能比较精确的完成拖拽操作。
下面也举个简单的例子吧

Sub MoveItemByText(objFrom,strFrom,objTo,strTo)
Dim l,r,t,b,l1,r1,t1,b1
'Drag Item by specified text
objFrom.GetTextLocation strFrom, l, t, r, b
objFrom.Drag (l+r)/2, (t+b)/2, 1

' Drop Item on specified text
objTo.GetTextLocation strTo, l1, t1, r1, b1
objTo.Drop (l1+r1)/2, (t1+b1)/2, 1
End Sub
'将hsjzfling从Names列表中拖拽到Result列表的Champion子列表中
Set objAct = VbWindow("frmOvertime").ActiveX("ActiveX").ActiveX("ActiveX").ActiveX("ActiveX")
MoveItemByText objAct.VbTreeView("Names"), "hsjzfling", objAct.VbTreeView("Result"), "Champion"

heqingbluesky 发表于 2009-9-1 14:49:02

用第三方控件开发的Menu都有这个问题,目前没有很好的解决办法。
我们的解决办法之一:
用快捷键代替Menu的点击,例如:推出程序:ALT+F4

onlonely 发表于 2009-9-2 18:57:17

这个方法也只是封装了的Getroproperty 类似功能而已

并且,对于那些没有显示出来的对象就无效了.
比如有个按钮,需要先拖动窗口才会出现的,这样的按钮,取得的坐标是无法通过click方法点击的.

hsjzfling 发表于 2009-9-8 18:18:02

回复 3# 的帖子

这样的问题我也遇到过,其中之一的解决方法是:
先判断当前界面是否能找到文本,找不到就控制滚动条翻一页,依次循环直到找到文本或者滚动条已经到最底部。
页: [1]
查看完整版本: GetTextLocation —— 依据文本值动态获取坐标进行点击、拖拽操作