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 方代码。
我最近需要更新旧的 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 方代码。