【QTP编码小知识 五 “山寨”WebElement】
【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 编辑 ] ::yiwusuoyou:::
待业着,但还是热爱着QTP与自动化的学习。抛砖引玉,望大家多多指点。
如果大家有什么工作好介绍请多多指教~~ 小伙加油:hug:
我顶你一下 顶一下。 :victory: --------------------------引用-------------------------------
[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]
--------------------------正文-------------------------------
天哪,楼主整夜整夜的不睡觉啊,真是佩服:lol 感谢楼主的分享 原帖由 zte_boy 于 2009-2-20 08:39 发表 http://bbs.51testing.com/images/common/back.gif
小伙加油:hug:
我顶你一下
风流很久不见,28号的深圳研讨会你会去对吧~~~ 原帖由 qicyt1812 于 2009-2-20 10:39 发表 http://bbs.51testing.com/images/common/back.gif
--------------------------引用-------------------------------
[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]
--------------------------正文-------------------------------
天哪,楼主整夜整夜的不睡 ...
睡不着就起来写文章,很久没写了,应该写点什么。 原帖由 风过无息 于 2009-2-20 11:53 发表 http://bbs.51testing.com/images/common/back.gif
感谢楼主的分享
不客气,大家讨论讨论。 文章格式真正规呀,呵呵,pp加油:victory: 用了Object.insertAdjacentText"beforeBegin","山寨在beforeBegin"后,“山寨在beforeBegin”这几个字好像没有写到WebElement控件里。。。。 原帖由 ls_721521 于 2009-2-20 14:52 发表 http://bbs.51testing.com/images/common/back.gif
用了Object.insertAdjacentText"beforeBegin","山寨在beforeBegin"后,“山寨在beforeBegin”这几个字好像没有写到WebElement控件里。。。。
应该是有的。你有添加这个对象进去吗?可以看看我的那个插图。嘿嘿。 :lol 有机会研究 Browser("网易电子邮箱 - 极速3.0正式版").Page("网易电子邮箱 - 极速3.0正式版").Frame("HtmlEditor").WebElement("--***").Object.setAttribute "innerText","tru111111111111111e",这个方法也可以实现类似方法。 更正:写进去了
应该是没写进去的,
<BODY contentEditable=true><DIV><BR><BR></DIV>山寨在beforeBegin
<DIV id=spnEditorSign><BR>--<BR>张喜</DIV></BODY>
这是写完以后的代码
[ 本帖最后由 jifeng 于 2009-2-20 17:01 编辑 ] 我没录制163,把第一个参数换成afterBegin后就行了,因为我用beforeBegin后输入的文字跑到了webedit的外面去了。。 insertAdjacentText这个方法应该是对标签的操作,好像不能把值写到属性里边去
1. beforeBegin: 插入到标签开始前
2. afterBegin:插入到标签开始标记之后
3. beforeEnd:插入到标签结束标记前
4. afterEnd:插入到标签结束标记后
回复 18# 的帖子
能插入,我刚才插入到webedit里成功了回复 18# 的帖子
是可以的。[ 本帖最后由 假装不在 于 2009-2-20 19:27 编辑 ]