心念旧安,夙夜忧叹。

QTP对Web页面上的文本框赋值的技术大全

上一篇 / 下一篇  2012-11-05 10:41:47 / 个人分类:原创文章

前天一周末班学员说我上课讲太快了,没听懂怎么在一些无法做WebEdit.Set的网页文本框中做赋值(比如下图那种类Office的“富文本输入框”,可能录制不进去,QTP识别为WebElement,很多日历型控件也有类似的问题),
51Testing软件测试网^v2r%Cd?
其实我在上课的时候给大家系统性的整理过笔记了。这方面的问题其实特别好解决,网上一堆的文章最简单的方法莫过于Object.innertext这种手段。但是也有人问说如果这个编辑框不是用js生成的html页面,就没法用innertext了。当然不排除你嵌入的控件是自己开发的,但是其实对QTP来说,其实“传值”是再容易不过的事情了(传值比取值简单的多)。因为你就算不能Set,不能innertext,还可以type啊。又有人说好像网页中的文本框不支持Type方法啊,这个问题我其实也反复提过了,要借“巧劲”。
记得好几年前我教过大家一个技巧,就是Page对象上QTP本来不支持 Text Area Output Value,但是你可以用一些特殊手段来强行的使用这个兼具API和OCR技术的文本获取功能。这个招数其实也是上面所说的“巧劲”,就是“低级别录制(Low Level Recording)”
好吧,在这里,我放出一个完整的赋值方法大全(也是上课给学员做的笔记)。为了大家有地方试验代码,还是老样子,用百度的首页搜索输入框取代各种复杂多变的输入框——其实原理都是一样的,无所谓哪个网页,下面的方法一定有适合你的。

!a.y^ f/J?z:a0
(零)、
一般在百度首页的输入框录制内容,会生成以下代码:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://www.baidu.com/"
Browser("Browser").Page("Page").WebEdit("wd").Set"songfun"
51Testing软件测试网 @;E5@s{(H)O:|"EMs
这里非常美好的是,QTP识别为WebEdit,所以可以赋值。
我现在只是假设你做的项目可能传不进去值,QTP不识别为WebEdit该怎么办?

7|C;K u~ ^eOy2\e0
(一)、
最多被使用的就是用Object对象的value或者innertext,一般针对HTML这是最简单的,代码如下(为方便大家运行,直接改用描述性编程):
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").WebEdit("name:=wd").Object.value= "songfun"
51Testing软件测试网)`2owx#P6a8j
或者 
51Testing软件测试网w0X`Y/W%kz
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").WebEdit("name:=wd").Object.innerText= "songfun"
51Testing软件测试网l2z*H#s!K.z
需要说明的是,这种方法QTP根本不需要把文本框识别为WebEdit,只要认成WebElement就可以了。这个大家不妨找PhpWind论坛发帖就知道了。
51Testing软件测试网8f?6K WVk,_`
(二)、
超强的“低级别录制”。这个招数基本无敌。即使QTP连innertext都没法用,也可以借助低级别录制搞定!以下我还是用百度做例子(只是假设而已,你换个自己的网页一样解决):
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Window("regexpwndtitle:=Windows Internet Explorer","regexpwndclass:=IEFrame").WinObject("regexpwndclass:=Internet Explorer_Server").Click 431,187
wait 2
Window("regexpwndtitle:=Windows Internet Explorer","regexpwndclass:=IEFrame").WinObject("regexpwndclass:=Internet Explorer_Server").Type"songfun"

!V7f2N]oX^1`0
因为虽然Web上的很多标准控件像WebEdit不支持Type方法,但是在低级别模式下,所有的对象都会被降级识别为WinObject对象(窗体视为Window)。而这个WinObject是支持Type方法的。

w'N_O{ pM;re;M0
(三)、
以上两者方法其实已经足够了!这里只是辅助介绍下其他技术。QTP对于Web页面其实有得天独厚的优势,不仅可以用innertext而且可以直接动态加载JavaScript代码,借用getElementById去设置。查看百度搜索输入框的原始代码:<form. name="f" action="/s">...<input type="text" name="wd" id="kw" maxlength="100" class="s_ipt">...</form>

.p&l(T.w$x/hI;B P0
下面直接写这段代码,搞定:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Browser(":=").EmbedScript. "document.getElementById('kw').value= 'songfun' "

,icVg\q-v+DWq0
也可以这样写:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Browser(":=").EmbedScript. "document.f.wd.value= 'songfun' "
51Testing软件测试网LYpsX$qb
还可以用用RunScript实现。比如这样:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Browser(":=").Page(":=").RunScript. "document.getElementById('kw').value= 'songfun' "
51Testing软件测试网(E"?kgi9h,s([T
(四)、
当然也可以用 Mercury.DeviceReplay 来做。
用SendString方法:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Browser(":=").Page(":=").WebEdit("name:=wd").Click 
wait 2
Dim dp
Set dp = CreateObject("Mercury.DeviceReplay")
dp.SendString"songfun"
Set dp = Nothing
51Testing软件测试网M d3[+C_p4{
代码中做Click其实只是“点一下”来强化定位,以确保后续SendString的成功,只要是以发送键值方式都建议去点击一下,不管是这里的DeviceReplay还是后面提到的WSH。如果对象不识别,不容易Click到,还可以用DeviceReplay自身的MouseClick事件来激活。这样的话,就需要知道鼠标要点击的屏幕座标(绝对座标),因为是屏幕的坐标,所以建议用以下代码捕捉X和Y。
Set ctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")
For i = 1 To 10
Wait 2
Print "1. X=" & ctlr.MousePosition.X & "; Y=" & ctlr.MousePosition.Y
Next
51Testing软件测试网$x'J-LRjr u O;n Q
上面这段代码运行过程中,把鼠标放在百度首页的搜索输入框里停留一会儿,让它记录下坐标。我这里记录到的是:X=403; Y=328。 因此改造上面的SendString中的代码为:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Dim dp
Set dp = CreateObject("Mercury.DeviceReplay")
dp.MouseClick 403,328,LEFT_MOUSE_BUTTON
wait 2
dp.SendString"songfun"
Set dp = Nothing
51Testing软件测试网yWxHzo,Q
当然,既然可以SendString,自然可以用QTP做一个“粘帖”动作(即Ctrl+V),一样也可以赋值。代码如下:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Set cp = CreateObject("Mercury.Clipboard")
cp.Clear
cp.SetText "songfun"
Const VK_CONTROL=29
Dim dp
Set dp = CreateObject("Mercury.DeviceReplay")
dp.MouseClick 403,328,LEFT_MOUSE_BUTTON
wait 2
dp.KeyDownVK_CONTROL  '模拟按下键盘的Ctrl键,不松开
dp.SendString"v"  '模拟按下Ctrl之后,按键盘上的V
dp.KeyUpVK_CONTROL  '粘帖结束后,松开ctrl键
Set dp = Nothing

0Y;Sg0R ^|!?&m#L\0
(五)、
当然 DeviceReplay 可以做到的,也可以用WSHWindows脚本宿主)的Sendkeys来做,道理都是一样的,就不解释了。
代码如下:
SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
Browser(":=").Page(":=").Sync
Browser(":=").Navigate "http://www.baidu.com/"
Browser(":=").Page(":=").Sync
Browser(":=").Page(":=").WebEdit("name:=wd").Click ' 通过点击让搜索输入框获得焦点
wait 1
Set w = CreateObject("Wscript.Shell")
w.SendKeys"songfun"
Set w = nothing

WS'?!E g)fuQ0
运行的结果也是一样可以实现的。但是我不太推荐用WSH,如果能用DeviceReplay搞定的就不要用WSH。原因是DeviceReplay可以同时控制鼠标和键盘,结合鼠标定位加按键,更加稳定;但是WSH只能模拟按键,没有办法模拟鼠标点击,一旦控件失去焦点,回放就会失败。

TAG:

引用 删除 wm_5052   /   2017-12-05 11:12:34
5
引用 删除 wm_5052   /   2017-12-05 11:04:00
很好 ,很有用
引用 删除 安静的位置   /   2017-03-21 17:25:18
5
涂涂涂涂的个人空间 引用 删除 涂涂涂涂   /   2013-11-28 11:23:27
5
simeng1128的个人空间 引用 删除 simeng1128   /   2013-07-02 11:16:06
受用。
simeng1128的个人空间 引用 删除 simeng1128   /   2013-07-02 11:15:48
5
谁知道丶 引用 删除 error1   /   2012-12-27 13:39:47
5
June.Diny 引用 删除 june.diny   /   2012-12-14 17:59:15
葵花宝典啊
June.Diny 引用 删除 june.diny   /   2012-12-14 17:58:25
1
run_ice_l的个人空间 引用 删除 run_ice_l   /   2012-11-08 16:24:31
5
peace 引用 删除 peace006   /   2012-11-07 11:00:33
回去试试~
peace 引用 删除 peace006   /   2012-11-07 11:00:14
5
云层专版 引用 删除 云层   /   2012-11-05 18:04:31

QTP11可以直接RunScript了,补充一个
... 引用 删除 sunsgsg   /   2012-11-05 16:31:12
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2020-09-23  
  12345
6789101112
13141516171819
20212223242526
27282930   

数据统计

  • 访问量: 390369
  • 日志数: 138
  • 图片数: 4
  • 建立时间: 2006-11-26
  • 更新时间: 2013-08-30

RSS订阅

Open Toolbar