51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 11707|回复: 46
打印 上一主题 下一主题

[原创] 【QTP编码小知识 五 “山寨”WebElement】

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-2-20 05:07:38 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
【QTP编码小知识 五 “山寨”WebElement】

           
作者:卢晨之  转贴请注明

前言
    随着web开发技术变得越来越复杂,使QTP在处理web对象时也变得不那么容易,但是很多时候还是能通过调整对象属性的技巧,达到正确识别我们想要的对象(Web元素)。这同时也就提出了更高的要求,要能够了解一些Web开发的知识,分析测试页面的源程序。当然光分析仍然是有些马后炮,更好的应该是在界面开发时就为以后自动化测试做准备了。引自  逍遥客
    确实在QTP的对象识别过程中,让QTP用户尤为头疼的就是对象识别。而当QTP识别不了对象时候,就不负责任的丢了一个"WebElement"给大家,而每个人都觉得这不是我想要的结果。哪么如何更好的把这个WebElement做出我们想要的效果与操作呢?

一、你想对它做什么
    在这里简单的举www.163.com 邮箱的文本域输入框为例。
    许多的QTP用户在做完了有教程的飞机订票系统的自动化脚本后,跃跃欲试的想找个Web实例开刀,而很多人选择的是163邮箱,但是可以说,这并不是个很好的选择。就在很兴奋的把163的登陆脚本录制好了,也做了参数修改,但是到问题却来了!录制163文本入却无效,而Spy出来的又是一个WebElement。或者是QTP捕获不到这个操作?所以就往对象库里面添加了这个WebElement。接着就是流利的代码敲击:
Browser("网易电子邮箱 - 极速3.0正式版").Page("网易电子邮箱 - 极速3.0正式版").Frame("HtmlEditor").WebElement("WebElement").set "山寨"
  但实际上你却什么也做不了,因为并不存在这个set的方法。

二、WebElement的主要方法
     WebElement的主要方法包括了Check,Click,FireEvent,GetROProperty,GetTOProperties,GetTOProperty,Output,SetTOProperty,Submit,WaitProperty等等。很明显就是因为WebElement在对其它对象方法的支持先天不足才会让用户对它会如此的恐惧与厌恶。

三、如何把它“山寨”
     这个问题在先前的51testing上,大家的解决方法是通过Sendkeys方法去解决这个问题,虽然问题是解决了,但是会让人觉得这不是我们真的想要的,毕竟这是“低级录制”才走的路线。
     一)WebElement的“后面”是什么?
     大家打开QTP,并且对163邮箱做简单的录制。到了在对邮箱内容录入时候,把QTP停止下来。接着,大家就打开对象库。以下有2个操作:
     a)点击添加,转到163页面,直接点击文本域。   
     b)点击添加,转到163页面,按住Ctrl,点击文本域,放开Ctrl,点击文本域。
     此时你却会发现在对象库里面有2个WebElement类型的对象,但他们却是有区别的。他们的节点分别是Body(指定文档主体的开始和结束)与Div(指定渲染 HTML 的容器)。而我们分别查看这2个对象的innerhtml,分别是“<DIV><BR><BR></DIV>”,“<BR><BR>”(回车)。而我们可以猜测出第2个WebElement是第1个元素节点里面,也就是在Body节点里面,如果读者想要验证,可以在读完下面的方法后,自己试试如何验证子父节点的关系。
     二)我们要对那个WebElement做操作?
     在仔细观察文本域后,我们发现了在文本域里面有2行已经被实现激活了,这就是在节点里面的“<BR><BR>”(回车)。所以我们只要把这个“回车”写成我们想要的东西就可以了,也就是我们需要对第2个WebElement做操作。
     三)我们不能如此“野蛮”
     先让大家看看下面的“山寨”代码,这是对第一个WebElement也就是Body节点的元素做操作。
     browser("网易电子邮箱 - 极速3.0正式版").Page("网易电子邮箱 - 极速3.0正式版").Frame("HtmlEditor").WebElement("WebElement").Object.document.write "野蛮的山寨"
     但是,脚本运行完后,我们却没办法对这个文本框再进一步做手工上输入操作。而对Div节点的元素做的操作也是无效的。这样就让我们没能做到可持续的,或者已经是修改了后台节点的关系,有可能会导致信件或者是控件的无法提交(在某些项目中会出现这样的问题,需要慎用!)
     四)“文明”的写入
     在写这个方法之前,大家可以先查查,究竟Div节点上,它有自己的什么功能或者方法可以提供给我们用。
     大家看看下面的代码,这个是对第2个WebElement,Div做的操作。
     browser("网易电子邮箱 - 极速3.0正式版").Page("网易电子邮箱 - 极速3.0正式版").Frame("HtmlEditor").WebElement("WebElement_2").Object.insertAdjacentText  "beforeBegin","山寨在beforeBegin"

     是的,我们使用的方法是insertAdjacentText,而这个方法中对应插入位置有4个,beforeBegin,afterBegin,beforeEnd,afterEnd。而运行完这个语句后,我们发现,原来的文本域,我们还是可以继续手动输入其它信息。
      
四、这样的山寨,有它存在的意义吗?
     要回答这个问题,还是比较偏向于模糊的回答,那就是要看这个自动化所需要验证的是什么。如果验证的是发出的邮件是有内容那个,哪么,我们这个方法是可行的。如果我们需要验证的是这个文本域的输入,哪么这个方法需要再次被定位。

五、如此山寨的启发?
    做完这个方法后,你可以发现,其实它可以把很多其它Web元素所具备的功能,也拖进WebElement里面,但需要读者去细心发现与研究。在这里我们只是实现了一个类似webedit.set的功能,我们也可以定义出一个WebElement.set 的方法。
     
     


[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

47#
发表于 2010-3-8 18:27:51 | 只看该作者
刚好之前也碰到过这个问题,希望这个方法同样对我的有效!TKS
回复 支持 反对

使用道具 举报

该用户从未签到

46#
发表于 2010-3-5 17:28:33 | 只看该作者

hi

你好,请问你有在firefox上处理过这种问题吗?在firefox上Frame和WebElement对象好像是处于同一层次的,无父子关系,我无法实现赋值的操作:)
回复 支持 反对

使用道具 举报

该用户从未签到

45#
发表于 2010-3-5 17:27:20 | 只看该作者

求助

你好,请问你有在firefox上处理过这种问题吗?在firefox上Frame和WebElement对象好像是处于同一层次的,无父子关系,我无法实现赋值的操作:)
回复 支持 反对

使用道具 举报

该用户从未签到

44#
发表于 2009-11-17 10:34:16 | 只看该作者
我无法点击ctrl 再选择对象,没有任何反应
回复 支持 反对

使用道具 举报

该用户从未签到

43#
 楼主| 发表于 2009-4-17 12:35:26 | 只看该作者
原帖由 hikaru1232 于 2009-4-17 12:27 发表
小广东的东西咋能不顶

回复 支持 反对

使用道具 举报

该用户从未签到

42#
发表于 2009-4-17 12:27:46 | 只看该作者
小广东的东西咋能不顶
回复 支持 反对

使用道具 举报

该用户从未签到

41#
发表于 2009-4-16 22:44:10 | 只看该作者

回复 36# 的帖子

这个webtable不能这样操作,要能这样操作我也不会这么费心了
回复 支持 反对

使用道具 举报

该用户从未签到

40#
发表于 2009-4-16 22:13:28 | 只看该作者

回复 38# 的帖子

忙到现在~
你的建议我先收下了,有空仔细研究下,有问题再讨教
回复 支持 反对

使用道具 举报

该用户从未签到

39#
 楼主| 发表于 2009-4-16 17:05:44 | 只看该作者
原帖由 cherubim 于 2009-4-16 15:04 发表
我以前测试的也有文本域的操作,我用innertest就OK了


有些情况使用时不行的,像这个163的控件就不行。具体什么原因需要研究。
回复 支持 反对

使用道具 举报

该用户从未签到

38#
 楼主| 发表于 2009-4-16 17:03:36 | 只看该作者
原帖由 blueeagle9999 于 2009-4-16 10:06 发表
假兄,我最近遇到了个问题

公司的项目是用JAVA开发的,BS的,在Iframe下有时候用childobjects()方法获取不到webelement对象,这些webelement其实都是一个webtable中的一些数据,比如

set rowId=description. ...



http://www.51testing.com/?uid-17 ... wspace-itemid-95404
是这个文章对吧。

你看看后台代码中,这个TABLE自己有ID不,如果有ID就直接getelementbyid就可以了,或者也可以通过getelementsbyname  它的名字。

msgbox MainPage.Frame("name:=mainIframe").WebElement("html tag:=DIV","innertext:=1").exist   '这个是存在的
你这个方法有点不准吧,我估计。因为你使用innertext的话,它有可能会帮你匹配正值表达式哦,所以....

另外有个建议,如果你这个控件经常会出现,建议考虑使用插件开发。你可以使用的basicclass 设置成table估计效果会很不错。
回复 支持 反对

使用道具 举报

该用户从未签到

37#
发表于 2009-4-16 15:04:43 | 只看该作者
我以前测试的也有文本域的操作,我用innertest就OK了
回复 支持 反对

使用道具 举报

该用户从未签到

36#
发表于 2009-4-16 12:09:08 | 只看该作者

回复 34# 的帖子

可以通过下面方法取数据
'Table编号
For i =1 To 14
'取第几列
        For j=4 To 5
                text = MainPage.Frame("name:=mainIframe").WebTable("text:=^"&i&"{1}\s.*").GetCellData(1,j)
                print text
        Next
Next
回复 支持 反对

使用道具 举报

该用户从未签到

35#
发表于 2009-4-16 10:20:52 | 只看该作者

回复 33# 的帖子

我可以理解为你认同QTP封装的那些方法全是通过操控DOM而获取的吗?

而上面所说的扩展仅是因为QTP未封装?
回复 支持 反对

使用道具 举报

该用户从未签到

34#
发表于 2009-4-16 10:06:39 | 只看该作者
假兄,我最近遇到了个问题

公司的项目是用JAVA开发的,BS的,在Iframe下有时候用childobjects()方法获取不到webelement对象,这些webelement其实都是一个webtable中的一些数据,比如

set rowId=description.create()
       rowId("html tag").value="DIV"
       rowId("innertext").value="1"                  '加不加这行都等于0
set rowIdcollection=MainPage.Frame("name:=mainIframe").childobjects(rowId)   
rowIdcollection.count                  '得到的总是0


msgbox MainPage.Frame("name:=mainIframe").WebElement("html tag:=DIV","innertext:=1").exist   '这个是存在的

看过你的另外一篇文章(忘了名了 ),我也尝试用object.getelementsbytagname("DIV"),得到的数据又非常庞大,很多不是我想要的,这些webelement只有一个html tag属性为div,因为QTP没办法把这些webelement识别成webtable里面的数据,因此我才需要大费周章地人工来处理这些数据,对于这个有没有什么好的方法或者建议。
回复 支持 反对

使用道具 举报

该用户从未签到

33#
 楼主| 发表于 2009-4-15 22:38:24 | 只看该作者
有。
你可以获取它并对它做操作。
回复 支持 反对

使用道具 举报

该用户从未签到

32#
发表于 2009-4-15 10:25:28 | 只看该作者

难道QTP封装的方法不是DOM操作?

这里谁能给个解释,QTP并未封装DOM吗?

[ 本帖最后由 shanxi 于 2009-4-15 10:28 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

31#
 楼主| 发表于 2009-4-15 10:20:59 | 只看该作者
没事顶起来给大家瞧瞧。
回复 支持 反对

使用道具 举报

该用户从未签到

30#
发表于 2009-3-12 23:50:18 | 只看该作者
c'est utile
回复 支持 反对

使用道具 举报

该用户从未签到

29#
发表于 2009-3-6 18:14:58 | 只看该作者
写的很好,主要是给大家提供了另一个操作对象的思路,用DOM对象操作起来可以方便的实现很多WEB上的公共方法
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-26 23:22 , Processed in 0.084014 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表