简单快乐的工作,生活!

QTP- 强制获取文本相对坐标

上一篇 / 下一篇  2014-03-11 15:22:13 / 个人分类:QTP

自动化测试过程中,经常会遇到一些容器对象,而QTP本身又无法对其容器对象的子对象识别,导致自动化无法继续进行下去。对于这样的问题在CS程序当中遇到的非常之多,比如有些treeview的子节点。当然最好的解决方式是进行套件的开发或者插件的扩展,但是有些时候此类对象出现的频率很低,数量也不是很多,那其实根本没必要去花费那么大的精力去特地开发这样一套套件或者插件扩展。来看一下具体的实例:

实例说明:以飞机订票的登录界面为例,假设ok按钮无法被QTP抓取到,完成对OK按钮的点击。

1. 首先抓去Dialog父窗口对象到对象库中,

2. 执行以下脚本


l = -1

t= -1

r = -1

b = -1

hwnd = Dialog("Login").GetROProperty("HWND")

window_x = Dialog("Login").GetROProperty("x")

window_y = Dialog("Login").GetROProperty("Y")

Succeeded = TextUtil.GetTextLocation("OK",hwnd,l,t,r,b)

If NotSucceededThen

MsgBox "Text not found"

else

x = window_x +(l+r) / 2

y = window_y +(t+b) / 2

Setdr =CreateObject("Mercury.DeviceReplay")

dr.MouseClick x, y,LEFT_MOUSE_BUTTON

End If

分析:

执行过程中,QTP会自动点击OK按钮,在此脚本中使用到GetTextLocation函数,此函数的作用主要是通过给出的文本查找出当前句柄对应窗口下的文本坐标,注意此处的坐标是窗口内部的相对坐标,并不是屏幕的绝对坐标。因此还需要加上父窗口的相对坐标才是相对于整个屏幕上的相对坐标。提取到相对坐标后即可使用隐藏组件DeviceReplay来进行点击(拖拽)操作。

扩展:

RegisterUserFunc"Dialog","ClickByText","ClickByText"


Dialog("Login").ClickByText"OK"


FunctionClickByText(Object,textStr)

l = -1

t= -1

r = -1

b = -1

hwnd = Object.GetROProperty("HWND")

window_x = Object.GetROProperty("x")

window_y = Object.GetROProperty("Y")

Succeeded = TextUtil.GetTextLocation( textStr,hwnd,l,t,r,b)

If NotSucceededThen

MsgBox "Text not found"

else

x = window_x +(l+r) / 2

y = window_y +(t+b) / 2

Setdr = CreateObject("Mercury.DeviceReplay")

dr.MouseClick x, y,LEFT_MOUSE_BUTTON

End If

End Function

分析:

通过抽离技术把测试封装对象全部抽离出来,替换成object,并通过RegisterUserFunc强制注入到Dialog中,下次就可以直接使用此方法了。

小提示:

其实QTP本身还提供了一个方法,同样可以实现以上脚本的效果,但是此方法被QTP隐藏着并没有被公开,方法名为ClickOnText. 有兴趣的可以试试:Dialog("Login").ClickOnText "OK" ,只需要一句话,同样可以实现。

总结:

此项技术的原理主要是通过对于平时处理一些项目中少量的黑容器对象时能够起到非常大的作用。需要注意的是以上两种方式都是通过OCR的光学进行识别,因此某些时候可能识别不是很精确,这一点需要记住。


TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-26  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 12879
  • 日志数: 15
  • 书签数: 3
  • 建立时间: 2007-04-04
  • 更新时间: 2014-12-01

RSS订阅

Open Toolbar