999999 发表于 2010-3-27 21:18:11

求教:Execute使用

今晚突发奇想,想使用VBS写一个对新创建对象添加属性的Function。代码如下;

Public Function Quote (txt)
Quote = chr(34) & txt & chr(34)
End Function

Function setObjetProperty ( ObjName , ProName , ProValue )
          'msgboxObjName & "(" & Quote(ProName) & ").value = " & Quote(ProValue)
          ExecuteGlobal ObjName & "(" & Quote(ProName) & ").value = " & Quote(ProValue)
End Function

其中 Quote在字符两端加上Char(34)用的,但是调用的时候返回了ObjName 类型不匹配,请各位大侠帮忙看看。谢谢

shotstar 发表于 2010-3-27 22:55:14

既然提示ObjName类型不匹配,那么问题应该在ObjName传递进来的值或对象。
要么你试试把ObjName放到引号里面看看。我记得excute后面都是字符串。
即:ExecuteGlobal "ObjName(" & Quote(ProName) & ").value = " & Quote(ProValue)

999999 发表于 2010-3-27 23:46:03

应该不行,ExecuteGlobal "ObjName(" & Quote(ProName) & ").value = " & Quote(ProValue),里面的 ObjName 就变成字符串【ObjName】了,不是传入的
对象变量了。

类似的,在前面加 “”,即 ExecuteGlobal "“ & ObjName(" & Quote(ProName) & ").value = " & Quote(ProValue) 这样改 ,也是不行的。

set baseLink = createObj ("micclass","Link")
setObjetProperty "baseLink","name","电脑整机"

类型不匹配: 'baseLink'

Function file: E:\QTPtest\testfun.qfl
Line (1): "'****************************************".

999999 发表于 2010-3-27 23:50:16

我怀疑是作用域的问题,在网上找了一下,ExecuteGlobal这个是可以修改Function外面的全局变量的,但是为什么就是调不通呢?想不明白。

shotstar 发表于 2010-3-28 10:37:25

不太清楚你的CreateObj创建的是一个什么样的对象。
我觉得首先要看你的对象是否支持那个语法,就是:baseLink("name").value="电脑属性"
在我印象里,能够这样写的语句好像也就是Description对象了。
如果你创建的是一个Web类型的对象,那么他是否支持这种语法呢?能否详细说说看,或者给我信箱发邮件。

999999 发表于 2010-3-28 11:26:16

呵呵,刚起来上网看有没有回复咯,下面是从一堆test function 里面摘出来的。麻烦帮忙看看。谢谢
'****************************************
'直接关闭所有IE进程
'****************************************
Public function CloseAllBrowsers
   SystemUtil.CloseProcessByName "iexplore.exe"
End Function

'*************************************************************
'打开网页地址
'************************************************************
FunctionOpenUrl( url )
   Dim StartURL,IE
    StartURL = url
    set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = true
        IE.Navigate StartURL
End Function

'*************************************************************
'创建对象
'************************************************************
FunctioncreateObj(ProName,ProValue)
   Dim obj
        Execute "Set obj=   Description.Create()"
        'msgbox"obj(" & Quote(ProName)& ").value = " & Quote(ProValue)
        Execute"obj(" & Quote(ProName)& ").value = " & Quote(ProValue)
        set createObj = obj
End Function

'*************************************************************
'Quote 函数的作用是在变量 txt 两端加上双引号
'************************************************************
Public Function Quote (txt)
Quote = chr(34) & txt & chr(34)
End Function

'*************************************************************
'setObjectProperty 给对象设置属性
'************************************************************
Function setObjectProperty ( ObjName , ProName , ProValue )
          'msgboxObjName & "(" & Quote(ProName) & ").value = " & Quote(ProValue)
          ExecuteGlobal ObjName & "(" & Quote(ProName) & ").value = " & Quote(ProValue)
End Function


'*************************************************************
'调用过程
'************************************************************

CloseAllBrowsers
TargetURL = "www.360buy.com"
OpenUrl TargetURL

set baseBrowser = createObj ("micclass","Browser")

'createObj(ProName, ProValue)
set basePage = createObj( "micclass","Page")

set baseLink = createObj ("micclass","Link")

setObjectProperty "baseLink","name","电脑整机"

shotstar 发表于 2010-3-28 12:16:59

看来你搞错了Description的用法。给你个例子看看。
Set oDesc = Description.Create()
    oDesc("micclass").Value = "WebList"
    oDesc("name").Value = "country"
    Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)
    NumberOfLists = Lists.Count()
    For i = 0 To NumberOfLists - 1
      Lists(i).Select "#0"
    Next
那个方法并不是去改变对象的属性值,而是用描述性编程给定对象的属性值,然后结合ChildObjects方法找出满足这些条件的子对象集合,可能获得多个对象,那么你可以用Lists(index)的方式去操作这个对象。

假如这里只有1个满足条件的子对象,上面的语句其实等同于
Lists(0)等同于Browser("Mercury Interactive").Page("Mercury Interactive").WebList("micclass:=WebList","name:=country")
如果有多个子对象,那么
Lists(0)等同于Browser("Mercury Interactive").Page("Mercury Interactive").WebList("micclass:=WebList","name:=country","index:=0")

通常我是在调试的时候用这个方法,去查看页面上是否有两个一样的对象存在。当然偶尔也会用这种方法解决问题(比如可识别属性是随机值的时候,我就只能找出所有的子对象,然后选择第X个操作)。
当你用描述性编程需要匹配的属性较多的时候,用description对象写的更整齐美观一些。
不知道你明白了没有,呵呵。

shotstar 发表于 2010-3-28 12:22:20

帮你改一下代码,你的原来的代码应该这样使用
'*************************************************************
'调用过程
'************************************************************

CloseAllBrowsers
TargetURL = "www.360buy.com"
OpenUrl TargetURL

set baseBrowser = createObj ("micclass","Browser")
Set ListsBrowser = Desktop.ChildObjects(baseBrowser)   '得到Desktop子对象Browser集合

'createObj(ProName, ProValue)
set basePage = createObj( "micclass","Page")
Set ListsPage = ListsBrowser(0).ChildObjects(basePage)    '得到Browser子对象Page集合

set baseLink = createObj ("micclass","Link")
setObjectProperty "baseLink","name","电脑整机"      '这里并不是改成这个,而是找name是电脑整机的link

Set ListsLink = ListsPage(0).ChildObjects(baseLink)    '得到Page子对象Link集合

ListsLink(0).Click

[ 本帖最后由 shotstar 于 2010-3-28 12:23 编辑 ]

shotstar 发表于 2010-3-28 12:29:20

如果你想改那个link的属性值,比如他的文字,可以用这样的方法:
Browser("Mercury Interactive").Page("Mercury Interactive").Link("电脑整机").Object.innerText ="PC"

当然这种改动纯属娱乐的,只能你自己看到,呵呵。页面刷新一下就变回原来的值了。
页: [1]
查看完整版本: 求教:Execute使用