51Testing软件测试论坛

标题: 一旦在运行的时候重新打开一个浏览器, 就不能识别对象 [打印本页]

作者: getfly    时间: 2008-4-25 19:16
标题: 一旦在运行的时候重新打开一个浏览器, 就不能识别对象
一旦在运行的时候重新打开一个浏览器, 就不能识别对象
情况是这样的:
   在运行的时候, 如果重新打开一个浏览器, 那么对象就无法识别。
同样的, 在录制的时候, 如果重新打开浏览器, 会重新录制出对象。
Browser("Browser").FlexApplication("**").FlexTextArea("userIDTextInput")
Browser("Browser").FlexApplication("***").FlexTextArea("passwordTextInput").Input "123456"
Browser("Browser").FlexApplication("***").FlexButton("Login").Click
Browser("Browser").Close

Browser("Browser_2").FlexApplication("****").FlexTextArea("userIDTextInput")
Browser("Browser_2").FlexApplication("****").FlexTextArea("passwordTextInput").Input "123456"

这该如何处理呢?
作者: walker1020    时间: 2008-4-25 23:12
“重新打开一个浏览器, 那么对象就无法识别”是什么意思? QTP报告什么错误?
作者: 假装不在    时间: 2008-4-26 03:01

原因1:你录制时候,不是基于QTP自己去打开对象的情况,哪么你再次运行时候,可能对象就没办法识别。
原因2:运行脚本时候,也不是基于QTP脚本打开,也就是初始化IE不是通过QTP。

处理方法1,个人觉得,一般都是直接通过QTP去启动IE好点。
        2,添加多点对象识别的标示。
     ***3,自己分析下是那个对象识别不出来,可以通过简单的对象拆分,去分析。例如:
Browser("Browser").FlexApplication("**").FlexTextArea("userIDTextInput")
就可以拆出三个,
Browser("Browser").动作
Browser("Browser").FlexApplication("**").动作
Browser("Browser").FlexApplication("**").FlexTextArea("userIDTextInput")

三个,看看是那一步出现了错误来判断对象识别到那个程度,然后对症下药。添加对象标示都可以。

可能有些地方说错了,大家指点下。
作者: zhou840401    时间: 2008-4-26 11:21
我猜他的意思是,在运行脚本的时候,本来有一个浏览器,结果,点击那一个链接之后,是用一个新的浏览器打开的,也就是有两个浏览器对象,这样QTP可能就识别不出了,因为有两个浏览器,而且你如果在事先并没有把第二个浏览器打开的对象,捕捉成跟第一个不一样的(对象存储库中),识别就很困难了.
作者: getfly    时间: 2008-4-26 20:30
谢谢各位楼上。是重新打开一个新的浏览器, 不是用qtp自己打开的,我尝试了一下。估计原因是对象没有加载好。所以无法识别;
我作如下尝试:在打开一个网页后等待20秒, 就能够识别;
还有就是如果用qtp打开就没有问题。但是还是不知道是什么原因。只知道是这样
作者: getfly    时间: 2008-4-27 12:04
谢谢楼上各位!
回答 walker1020:我在打开浏览器等待其加在成功时, 用了Browser("Browser").waitproperty "visual", true, 100000
结果报错:无法找到Browser("Browser")对象。

我按照 假装不在 同志的方法, 的确, 如果通过QTP初始化I浏览器, 没有问题的,但是我只知道在录制或运行开始的时候才能用通过QTP初始化I浏览器, 如果我想在在运行中途打开,怎么设置qtp呢?

还有两个方法也以解决这个问题:
1. 在打开浏览器后, 等待20秒以上, 就不会出现这个问题。 但是就怕有的时候时间不够用牙。
2. 本人在msdn上找到了一个文章, 《如何检测如果应用程序已停止响应》。各位帮我看看是不是能用到这个问题上。
作者: getfly    时间: 2008-4-27 12:54
谢谢各位; 我初步推断出,这个问题的原因可能是由于我开了两个浏览器:IE 和FireFox,所以有两个浏览器对象。无法识别。我用描述性编程已经 弄好了。
脚本如下,请大家指正:
Function LoginInitial( )
   Dim objEx
   Reporter.Filter = rfDisableAll
   objEx = Browser("version:=internet explorer 6").Exist(1)
        If  objEx = false Then
            strComputer = "."
                Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
                Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where name='IEXPLORE.EXE' "  )
                If colProcessList.count<>0 Then
                                For Each objItem in  colProcessList
                                                objItem.terminate()
                                Next                  
                                Call OpenIE()
                                else
                                Call OpenIE()
                End If
        End If
Reporter.Filter = rfEnableAll

End Function

Function OpenIE ()
   set IE = CreateObject("InternetExplorer.Application")
   IE.Visible = true
   StartURL = "http://192.168.2.119:8080/timetracker/public/TimeTracker.html"
   IE.Navigate StartURL
   msgbox Browser("version:=internet explorer 6").Exist(1)
   Browser("version:=internet explorer 6").WaitProperty "visual", true, 10000
   ''msgbox Browser("Browser").Exist(1)
   ''wait(25)
End Function
作者: hsjzfling    时间: 2008-4-27 22:34
需要那么麻烦么。。。连wmi都搬出来了~~

实际上那段用wmi的代码完全可以用Systemutil.CloseProcessByName "iexplore.exe" 来代替。。。后面直接跟上OpenIE()就完了~
作者: walker1020    时间: 2008-4-28 23:15
不是很理解,你为什么要开两个浏览器:IE 和FireFox。 是测试要求吗?
作者: walker1020    时间: 2008-4-28 23:16
我也测试过多个系统的多个环境,但从来没有说是同时要测试两个浏览器:IE 和FireFox。
作者: getfly    时间: 2008-5-1 15:27
哈哈, 情况是这样的, 在录制脚本的时候, 录制的是IE的浏览器。 但是打开firefox作其他的事情,比如搜索某个问题的解决办法。 所以才会出现这个问题。
作者: f84248860    时间: 2008-5-3 09:41
录制QTP脚本时计算机环境要干净的~
如果你要一边录制一边做其他事情,我的办法是开一个Vmware,QTP的事情都在VMware里解决,其他事情切出来做,这样就不会影响了。

另外load page时候如果要让对象全部加载好,好像是用
Browser().Page().Sync
作者: walker1020    时间: 2008-5-4 00:02
原帖由 getfly 于 2008-5-1 15:27 发表
哈哈, 情况是这样的, 在录制脚本的时候, 录制的是IE的浏览器。 但是打开firefox作其他的事情,比如搜索某个问题的解决办法。 所以才会出现这个问题。


I couldn't agree with you any more.
作者: walker1020    时间: 2008-5-4 00:04
测试机的环境一定要干净。如果你那么去进行测试,如果发现某个功能在 Forefox无法正常使用,那么你能确定是 应用程序有问题,还是你的测试过程有问题?
作者: walker1020    时间: 2008-5-4 00:08
原帖由 getfly 于 2008-5-1 15:27 发表
哈哈, 情况是这样的, 在录制脚本的时候, 录制的是IE的浏览器。 但是打开firefox作其他的事情,比如搜索某个问题的解决办法。 所以才会出现这个问题。


如果照你这样进行测试,那么要么是你们的测试用例有问题(如果你是严格按照测试用例来执行的),要么是 你的测试不规范。如果要测试应用程序在IE 6.0环境下是否所有的功能都正常,那么所有的测试都会在 IE 6.0 环境下进行。这对于IE7.0 和 Firefox 同意适合。我还没有见到你这样进行测试的。话有点尖锐,但测试的原则就是如此
作者: walker1020    时间: 2008-5-4 00:09
说深刻一点,你这是在违规操作! 如果发生了什么事故,一切后果由你负责了。如果你这样进行测试,那是无效测试,是在做无用功。
作者: getfly    时间: 2008-5-4 14:44
哈哈,谢谢楼上。
作者: liangjz    时间: 2008-5-5 01:03
1 在打开浏览器后, 等待20秒以上, 就不会出现这个问题。 但是就怕有的时候时间不够用牙?

这个问题可以用

err.clear
on error resume next
do
Browser("Browser").FlexApplication("**").FlexTextArea("userIDTextInput")
loop util err.number = 0

类似这样循环执行
作者: f84248860    时间: 2008-5-5 09:39
原帖由 walker1020 于 2008-5-4 00:04 发表
测试机的环境一定要干净。如果你那么去进行测试,如果发现某个功能在 Forefox无法正常使用,那么你能确定是 应用程序有问题,还是你的测试过程有问题?


不懂是啥意思~我说的测试机环境干净的意思是让测试结果不会因为本机的其他原因而受到干扰,比如说LZ在用IE测试的时候开了Firefox,这就明显是干扰了,找不到对象那是当然的。
至于如果某个功能在Firefox不能正常使用,首先我会去确认需求是否要求使用IE或者使用FF或者两者都需要,如果使用Firefox是需要的,那么如果某个功能测试下来在FF无法正常使用,那它就是BUG,这跟测试过程有什么关系?
作者: getfly    时间: 2008-5-5 13:48
18楼厉害, 谢谢!没有想到vb的这个错误处理还能这么用,哈哈。
作者: walker1020    时间: 2008-5-6 00:03
原帖由 f84248860 于 2008-5-5 09:39 发表


不懂是啥意思~我说的测试机环境干净的意思是让测试结果不会因为本机的其他原因而受到干扰,比如说LZ在用IE测试的时候开了Firefox,这就明显是干扰了,找不到对象那是当然的。
至于如果某个功能在Firefox不能正常 ...


我的意思是 预防这样的情况发生: 某个应用程序在单独的 IE 或 Firefox下运行都没有问题,但是 如果 打开IE 后 又打开 Firefox,某些功能无法正常使用。如果我们发现了这样的错误,那么你说 这是应用程序的问题 还是浏览器的问题?
作者: walker1020    时间: 2008-5-6 00:08
我说的是测试环境的问题,这与 QTP 没有太大的关系。




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