caicai2012 发表于 2012-11-20 16:16:35

求高手指点:QTP无法回放上传图片的click事件

本帖最后由 caicai2012 于 2012-11-20 16:18 编辑



用QTP无法录制点击“上传图片”按钮操作,手动添加对象后脚本如下:Browser("商城、商户登录").Page("商品信息填写").WebElement("WebElement").Click

但是无法回放

对象属性为


outerhtml属性值为:<div id="upload_button2" class="upload_btu ie6_png   "></div>

yanfang84 发表于 2012-11-20 16:29:15

我也在找这个问题的答案那。搞了一下午没有成就感。希望有成就感的童鞋多指教指教。

xjwldlover 发表于 2012-11-20 16:47:52

你的Image是包含在这个webElement里的,往内层找到Image,然后click它应该就可以了。话说LZ的outerhtml属性贴的不全吧

caicai2012 发表于 2012-11-20 17:10:26

回复 3# xjwldlover


    outerhtml属性贴全了呢,能具体说一下怎么操作吗?

xjwldlover 发表于 2012-11-20 18:35:56

本帖最后由 xjwldlover 于 2012-11-20 18:36 编辑

如果可以,LZ右键‘查看源代码’把整个页面的html信息以附件刑事给发上来吧。

ps,往内层找对象,就是说要操作的对象出现在第5级,但QTP找到的是第4级或者第三级,需要靠手工创建一个第5级的对象

SexyCat_1113 发表于 2012-11-20 23:14:50

回复 5# xjwldlover
求详解,,,

joykao 发表于 2012-11-21 08:50:26

个人感觉可能不是不能click而是你的对象有问题。。。。。

Browser("商城、商户登录").Page("商品信息填写").WebElement("WebElement").Click
确定你能找到你那个WebElement 对象啊?我的意思是说该对象可能不唯一。。。。

caicai2012 发表于 2012-11-21 11:54:56

回复 7# joykao

那么重命名可行吗?

joykao 发表于 2012-11-21 13:42:44

回复 8# caicai2012
这是一种方法,方便你管理对象,但是识别对象是去对比对象的属性的,你要让你的测试对象能被很好的识别,当你加入对象到对象库后,你可去增删属性或者编辑属性方便你去唯一识别该对象,你可以highlight去查看加到对象库的对象是否可以识别,因为可能有好多对象几乎属性都相同,可能靠index,location去鉴别。
当然不能确定这个就是你遇到的问题,多研究下对象的属性,用SPY 去多看看,当然你也可以用浏览器自带的工具去查看。。。。

jack_loo 发表于 2012-11-21 15:10:19

LZ需要提供详细信息。

1. 如果这里整个是flash做到,那么它有可能被QTP识别为WebElement("WebElement")网页元素对象,如果click事件录制时未能录制到坐标,那么回放时QTP会点击这个对象的中心点,如果你需要点的“按钮”不在整个对象的中心点,那么回放时就看不出效果。如果是flash,建议模拟录制。当然从你提供的网页代码看,这里不是flash,而是div。

2. div只是一个块,但你图中显示有“上传图片”这4个字或图片,那么可以肯定有一个对象(表示“上传图片”这4个字或图片的对象)存在,可能div中还有其他元素覆盖在这个对象上,导致你录制时QTP以为你在操作那个对象。对这种情况建议在对象库中将该网页上所有对象都导入进来,分别查看一下,找到这个表示“上传图片”这4个字或图片的对象,代码中换成这个对象的click。如果嫌加进来一个一个看台麻烦,可以用Page.ChildObjects(oEle)的方式print出页面下所有子对象的object.type/name/class/id,具体用哪些要看网页代码中用了哪些。

3. 还有一种可能,表示“上传图片”这4个字或图片的对象在网页中有一些属性导致QTP无法识别,结果QTP就完全找不到这个对象,这会导致childObjects方法就拿不到。这时需要通过GetElement系列函数来获取所有网页元素,具体是byTag/id/name也要看网页代码中怎么写,拿出来后再object.type/name/class/id,找到后用document.write方式<script>来执行。

yanfang84 发表于 2012-11-22 16:38:59

回复 10# jack_loo


    我这边上传文件的按钮是falsh的,按照你的说法进行了模拟录制,但是没有录制下来。

yanfang84 发表于 2012-11-22 16:39:21

回复 10# jack_loo


不知道还有没有别的办法。

yanfang84 发表于 2012-11-22 16:47:37

本帖最后由 yanfang84 于 2012-11-22 19:10 编辑

<object width="112" height="112" class="swfupload" id="SWFUpload_0" data="http://192.168.1.51/sns/public/js/swf/swfupload.swf?preventswfcaching=1353573678421" type="application/x-shockwave-flash" SelectFile="null" SelectFiles="null" StartUpload="null" ReturnUploadStart="null" StopUpload="null" CancelUpload="null" RequeueUpload="null" GetStats="null" SetStats="null" GetFile="null" GetFileByIndex="null" GetFileByQueueIndex="null" AddFileParam="null" RemoveFileParam="null" SetUploadURL="null" SetPostParams="null" SetFileTypes="null" SetFileSizeLimit="null" SetFileUploadLimit="null" SetFileQueueLimit="null" SetFilePostName="null" SetUseQueryString="null" SetRequeueOnError="null" SetHTTPSuccess="null" SetAssumeSuccessTimeout="null" SetDebugEnabled="null" SetButtonImageURL="null" SetButtonText="null" SetButtonTextPadding="null" SetButtonTextStyle="null" SetButtonAction="null" SetButtonDisabled="null" SetButtonCursor="null">

这个是flash的元素代码,请帮忙看看,按照里面的type和class创建了新对象,但是父对象却和应用程序的对象不匹配。

完整脚本是:
Browser("AAAAA").Page("AAAAA").Link("个人主页").Click
Browser("AAAAA").Page("AAAAA-BBBBB").Link("上传图片").Click
Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").WinTable("FalshButton").Click'641,382'点击falsh按钮,FalshButton是我新建的对象
Window("Microsoft Internet Explorer").Window("选择要上载的文件,通过: 192.168.1.51").WinObject("FolderView").Click 82,245'打开window窗口
Browser("AAAAA").Dialog("YY").WinListView("SysListView32").Select DataTable("FileName", dtLocalSheet)    '对上传的文件名参数化
Window("Microsoft Internet Explorer").Window("YY").WinObject("打开(O)").Click 27,9'选择文件后点击window窗口上的“打开”按钮
Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Click 621,609
Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Click 606,590
Browser("AAAAA").Page("AAAAA-BBBBB").WebButton("发布").Click

回放时的错误信息:

泰然 发表于 2012-11-23 10:21:38

模拟录制,录制出来的脚本应该类似这样:
Window("Google Chrome").RunAnalog "Track1"
它录制下来的是一个鼠标运动轨迹,所以叫Track,整个录制过程不可修改。

看你的脚本,使用的不是模拟录制,而是低级别模式录制,所以录制到Window("Microsoft Internet Explorer")这样的对象,如果页面和页面中所有元素的大小与坐标都固定,那么Click 621,609这样的位置就能够重现,你这样的录制就应该可以回放。不能回放的原因只能是“页面和页面中所有元素的大小与坐标”有一些发生了改变,所以通常低级别录制少用,容易发生对象坐标改变的现象,如果一定要用,通常将窗口最大化。如果要在多个测试机上能运行,还要统一操作系统和其他软件版本、统一分辨率。

泰然 发表于 2012-11-23 10:36:08

除了模拟录制、低级别录制外,还可以做虚拟对象。本质上虚拟对象方法就是低级别录制的进化版,一样是通过坐标确定一个点击位置,低级别录制是直接点击一个位置,虚拟对象是划定一个方框范围,凡是点在这个方框内,都被认为是对这个方框(QTP把这个方框虚拟成一个对象,这就是虚拟对象名称的来源)的操作。

虚拟对象的优势在于可以获得更好的相对坐标位置。比如你这个例子。当低级别录制时,Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Click 621,609这个事件中点击坐标621,609是WinObject("Internet Explorer_Server")的相对坐标,是在IE浏览器中的坐标,万一回放时因为flash前的文字多了挤占了flash的位置,就导致Click 621,609是点在一个无效的位置上。而虚拟对象的方法可以将对象直接画在这个flash对象上,认为是flash对象的子对象,那么虚拟对象的坐标位置就是相对flash的坐标,很少看到flash的大小会发生变化,而flash本身位置的改变,不会影响虚拟对象相对于flash对象的位置。所以虚拟对象方法比低级别录制效果好,模拟录制也有相对哪个对象的坐标来进行模拟录制的概念,所以模拟录制也比低级别录制效果好。

as4372 发表于 2012-11-23 16:25:01

严重支持,必须的

wuzongbo 发表于 2014-5-27 15:45:30

话说你以前是联通商城的?我也在学,现在问题解决了吗求指教。。。
页: [1]
查看完整版本: 求高手指点:QTP无法回放上传图片的click事件