FoxPro Internet Explorer COM 自动化:点击在 IE 10 及更高版本中不起作用?

FoxPro Internet Explorer COM Automation: Clicks not working in IE 10 and Later?

我最近需要更新旧的 FoxPro 遗留应用程序,该应用程序使用 Internet Explorer Automation 通过单击一些 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() 事件触发器都没有任何效果。然而,对文本框的分配工作正常,因此页面已编写脚本。

是否有人知道发生了什么变化或什么可能会影响行为,从而使以前有效的自动化事件代码不再有效?

感谢@Noseratio 的评论,我能够确定问题是特定于调用 IE 的 FoxPro COM 接口 DOM。 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 签名得到满足,接收函数将忽略该参数。

还有另一种可能的自动方式:使用 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 
call window.setTimeout("(function() {})()", 0)
call Wscript.Sleep(100)

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

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