51Testing软件测试论坛

标题: 【QTP编码小知识 五 “山寨”WebElement】 [打印本页]

作者: 假装不在    时间: 2009-2-20 05:07
标题: 【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。而运行完这个语句后,我们发现,原来的文本域,我们还是可以继续手动输入其它信息。
      [attach]49254[/attach]
四、这样的山寨,有它存在的意义吗?
     要回答这个问题,还是比较偏向于模糊的回答,那就是要看这个自动化所需要验证的是什么。如果验证的是发出的邮件是有内容那个,哪么,我们这个方法是可行的。如果我们需要验证的是这个文本域的输入,哪么这个方法需要再次被定位。

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


[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]
作者: 假装不在    时间: 2009-2-20 05:14
::yiwusuoyou:::
待业着,但还是热爱着QTP与自动化的学习。抛砖引玉,望大家多多指点。
如果大家有什么工作好介绍请多多指教~~
作者: zte_boy    时间: 2009-2-20 08:39
小伙加油

我顶你一下
作者: asoqa    时间: 2009-2-20 09:29
顶一下。
作者: qicyt1812    时间: 2009-2-20 10:38

作者: qicyt1812    时间: 2009-2-20 10:39
--------------------------引用-------------------------------
[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]

--------------------------正文-------------------------------
天哪,楼主整夜整夜的不睡觉啊,真是佩服
作者: 风过无息    时间: 2009-2-20 11:53
感谢楼主的分享
作者: 假装不在    时间: 2009-2-20 12:23
原帖由 zte_boy 于 2009-2-20 08:39 发表
小伙加油

我顶你一下



风流很久不见,28号的深圳研讨会你会去对吧~~~
作者: 假装不在    时间: 2009-2-20 12:24
原帖由 qicyt1812 于 2009-2-20 10:39 发表
--------------------------引用-------------------------------
[ 本帖最后由 假装不在 于 2009-2-20 05:27 编辑 ]

--------------------------正文-------------------------------
天哪,楼主整夜整夜的不睡 ...



睡不着就起来写文章,很久没写了,应该写点什么。
作者: 假装不在    时间: 2009-2-20 12:25
原帖由 风过无息 于 2009-2-20 11:53 发表
感谢楼主的分享


不客气,大家讨论讨论。
作者: yiyireal    时间: 2009-2-20 12:46
文章格式真正规呀,呵呵,pp加油
作者: ls_721521    时间: 2009-2-20 14:52
用了Object.insertAdjacentText  "beforeBegin","山寨在beforeBegin"后,“山寨在beforeBegin”这几个字好像没有写到WebElement控件里。。。。
作者: 假装不在    时间: 2009-2-20 16:25
原帖由 ls_721521 于 2009-2-20 14:52 发表
用了Object.insertAdjacentText  "beforeBegin","山寨在beforeBegin"后,“山寨在beforeBegin”这几个字好像没有写到WebElement控件里。。。。



应该是有的。你有添加这个对象进去吗?可以看看我的那个插图。嘿嘿。
作者: 户丽莎    时间: 2009-2-20 16:47
有机会研究
作者: jifeng    时间: 2009-2-20 16:49
Browser("网易电子邮箱 - 极速3.0正式版").Page("网易电子邮箱 - 极速3.0正式版").Frame("HtmlEditor").WebElement("--***").Object.setAttribute "innerText","tru111111111111111e",这个方法也可以实现类似方法。
作者: jifeng    时间: 2009-2-20 16:51
更正:写进去了


应该是没写进去的,
<BODY contentEditable=true><DIV><BR><BR></DIV>山寨在beforeBegin
<DIV id=spnEditorSign><BR>--<BR>张喜</DIV></BODY>
这是写完以后的代码

[ 本帖最后由 jifeng 于 2009-2-20 17:01 编辑 ]
作者: ls_721521    时间: 2009-2-20 16:52
我没录制163,把第一个参数换成afterBegin后就行了,因为我用beforeBegin后输入的文字跑到了webedit的外面去了。。
作者: jifeng    时间: 2009-2-20 16:56
insertAdjacentText这个方法应该是对标签的操作,好像不能把值写到属性里边去

1.     beforeBegin: 插入到标签开始前

2.     afterBegin:插入到标签开始标记之后

3.     beforeEnd:插入到标签结束标记前

4.     afterEnd:插入到标签结束标记后
作者: ls_721521    时间: 2009-2-20 17:00
标题: 回复 18# 的帖子
能插入,我刚才插入到webedit里成功了
作者: 假装不在    时间: 2009-2-20 19:18
标题: 回复 18# 的帖子
是可以的。

[ 本帖最后由 假装不在 于 2009-2-20 19:27 编辑 ]
作者: 假装不在    时间: 2009-2-20 19:19
标题: 回复 19# 的帖子
::yiwusuoyou::: 恭喜了~~
作者: huiguiziran111    时间: 2009-2-23 11:17

作者: testlab    时间: 2009-2-23 11:42
学习了
作者: fei.ge    时间: 2009-2-27 14:01
写的非常好,非常实用,呵呵。

顶楼主。
作者: damaoa    时间: 2009-2-27 15:07
标题: 大家都很厉害!
大家都很厉害!
作者: 假装不在    时间: 2009-2-28 12:15
::yiwusuoyou:::

大家写完后,可以试试看发出去,并且自己收件。看看结果如何?
write方法,或者是insertAdjacentText   效果有什么区别。

其实方法中还有另外一两个,大家可以想想如何做。并且看看效果。
作者: free1998    时间: 2009-3-2 15:38
先收了,等有时间再试试
作者: 假装不在    时间: 2009-3-6 15:36
原帖由 fei.ge 于 2009-2-27 14:01 发表
写的非常好,非常实用,呵呵。

顶楼主。


::yiwusuoyou:::   谢谢。
作者: lijian422202    时间: 2009-3-6 18:14
写的很好,主要是给大家提供了另一个操作对象的思路,用DOM对象操作起来可以方便的实现很多WEB上的公共方法
作者: liuruixian0903    时间: 2009-3-12 23:50
c'est utile
作者: 假装不在    时间: 2009-4-15 10:20
没事顶起来给大家瞧瞧。
作者: shanxi    时间: 2009-4-15 10:25
标题: 难道QTP封装的方法不是DOM操作?
这里谁能给个解释,QTP并未封装DOM吗?

[ 本帖最后由 shanxi 于 2009-4-15 10:28 编辑 ]
作者: 假装不在    时间: 2009-4-15 22:38
有。
你可以获取它并对它做操作。
作者: blueeagle9999    时间: 2009-4-16 10:06
假兄,我最近遇到了个问题

公司的项目是用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里面的数据,因此我才需要大费周章地人工来处理这些数据,对于这个有没有什么好的方法或者建议。
作者: shanxi    时间: 2009-4-16 10:20
标题: 回复 33# 的帖子
我可以理解为你认同QTP封装的那些方法全是通过操控DOM而获取的吗?

而上面所说的扩展仅是因为QTP未封装?
作者: Haereticus    时间: 2009-4-16 12:09
标题: 回复 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
作者: cherubim    时间: 2009-4-16 15:04
我以前测试的也有文本域的操作,我用innertest就OK了
作者: 假装不在    时间: 2009-4-16 17:03
原帖由 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估计效果会很不错。
作者: 假装不在    时间: 2009-4-16 17:05
原帖由 cherubim 于 2009-4-16 15:04 发表
我以前测试的也有文本域的操作,我用innertest就OK了


有些情况使用时不行的,像这个163的控件就不行。具体什么原因需要研究。
作者: blueeagle9999    时间: 2009-4-16 22:13
标题: 回复 38# 的帖子
忙到现在~
你的建议我先收下了,有空仔细研究下,有问题再讨教
作者: blueeagle9999    时间: 2009-4-16 22:44
标题: 回复 36# 的帖子
这个webtable不能这样操作,要能这样操作我也不会这么费心了
作者: hikaru1232    时间: 2009-4-17 12:27
小广东的东西咋能不顶
作者: 假装不在    时间: 2009-4-17 12:35
原帖由 hikaru1232 于 2009-4-17 12:27 发表
小广东的东西咋能不顶


作者: jiguoling    时间: 2009-11-17 10:34
我无法点击ctrl 再选择对象,没有任何反应
作者: anny51    时间: 2010-3-5 17:27
标题: 求助
你好,请问你有在firefox上处理过这种问题吗?在firefox上Frame和WebElement对象好像是处于同一层次的,无父子关系,我无法实现赋值的操作:)
作者: anny51    时间: 2010-3-5 17:28
标题: hi
你好,请问你有在firefox上处理过这种问题吗?在firefox上Frame和WebElement对象好像是处于同一层次的,无父子关系,我无法实现赋值的操作:)
作者: souchy    时间: 2010-3-8 18:27
刚好之前也碰到过这个问题,希望这个方法同样对我的有效!TKS




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2