【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 编辑 ] |