1

我最近需要更新一个旧的FoxPro遗留应用程序,该应用程序使用 Internet Explorer 自动化来驱动网页的内容,方法是单击一些 href 链接并将数据输入表单并提交。

这曾经工作得很好,但是使用 IE 11 (windows 10) 和 IE 10 (Windows 7) 检查最新版本的 Windows 我看到对元素的任何点击事件调用都没有效果,并且它们静默失败 - 没有错误,但也没有点击。

o = CREATEOBJECT('InternetExplorer.Application')
o.visible = .t.
o.Navigate('http://test.com/ControlBasics.wcsx')

wait window 'page loading...' timeout 1.5

* Target object has no id so navigate DOM to get object reference
oLinks = o.Document.getElementsByTagName('a')
oLink = oLinks.item(0)
oLink.Click()

* o.navigate(oLing.href) && works but not sufficient

o.document.getElementById('txtName').value = 'Rick'
oButton = o.document.getElementById('btnSubmit')
oButton.Click()

在上面的代码中, .click() 事件触发器都没有任何效果。然而,对文本框的分配工作正常,因此页面是脚本化的。

有谁知道发生了什么变化或什么可能影响行为,从而使以前工作的自动化事件代码不再起作用?

4

2 回答 2

5

感谢@Noseratio 的评论,我能够确定问题是特定于调用 IE DOM 的 FoxPro COM 接口。FoxPro 的 COM 实现有许多怪癖,涉及大小写和参数计数。在这种情况下,问题是后者。

解决 FoxPro 问题的方法是调用 click 方法并传递任何参数 - 无论值是什么,您只需传递一个即可。

所以这有效:

oLinks = o.Document.getElementsByTagName('a')
oLink = oLinks.item(0)
oLink.Click(.F.)

o.document.getElementById('txtName').value = 'Rick'
oButton = o.document.getElementById('btnSubmit')
oButton.Click(.F.)

注意.F。这两个函数调用中的.Click()参数。

我不太确定问题是什么,但我的猜测是默认的 COM 签名需要arguments数组,并且必须传递它,因为 FoxPro 无法处理可选参数。通过传递该值,COM 签名得到满足,并且该参数被接收函数忽略。

于 2015-07-19T17:30:12.887 回答
2

还有另一种可能的自动化方式:使用 JavaScript 的eval. 这是一个示例 VBScript:

set ie = CreateObject("InternetExplorer.Application")
ie.visible = true
call ie.Navigate("http://goo.gl/gnhy85")
call Wscript.Sleep(5000)

set window = ie.Document.Script ' or ie.Document.parentWindow

' inject some script in case there's no <script> tags on the page,
' see http://stackoverflow.com/a/22372934/1768303
call window.setTimeout("(function() {})()", 0)
call Wscript.Sleep(100)

' automate
call window.eval(
    "(function() { document.getElementsByTagName('a').item(0).click(); })()")

希望 FoxPro 可以处理window.eval调用,在这种情况下您可能不需要任何第 3 方代码。

于 2015-07-20T07:07:06.200 回答