如果您关注click 事件堆栈跟踪,您会发现此网页中发生了很多 的事情。尤其是似乎有三个单独的跟踪器脚本似乎需要挂钩 DOM 事件才能运行。我会冒险提出一个导致您明显问题的建议。
我说很明显,因为可以通过页面上的javascript 自动化来强制您想要触发的事件。特别是jquery 我提出的解决方案。 jquery 正在页面上运行,并且是此 Web 应用程序事件处理的组成部分。
jquery 有一个 trigger 方法 - 文档 here - 它说:
从 jQuery 1.3 开始,.trigger()ed 事件在 DOM 树中冒泡
我不相信像这样的基于vba 的代码:ie.document.foo.Click - 在您的情况下会导致事件传播。因此,让我们在以编程方式创建的 IE 会话中运行必要的 jquery trigger 脚本作为解决方案的基础。
您想要自动化的特定<a> 标记(锚点)具有os_opt_dd 类。页面上有 13 个这样的锚点(具有相同的类),您想要最后一个。可能有更好的方法来隔离锚(可能基于父级<div>),但我将把它作为练习留给你。
所以提供自动化的jquery 代码是这样的:
// get the HTML element we want to automate
var anchor = $('a.os_opt_dd')[12];
// trigger the mousedown event on this anchor element
$(anchor).trigger('mousedown');
单行字如下:
$($('a.os_opt_dd')[12]).trigger('mousedown')
注意我们需要触发mousedown 事件而不是click 事件。这是因为(IMO)事件传播是由用户操作的第一个事件触发的,例如在文档的特定元素上按下鼠标按钮。如果你在 Stack Overflow 上谷歌/搜索,那么你会发现很多关于点击/事件/jQuery 等主题的主题/讨论,这些都是有用的阅读材料。如果您问jquery 专家是否有更好的编码方法,我完全希望他们能提出更好的东西;)
无论如何,最后,我们的excel-vba 代码将是:
Option Explicit
Sub TestWithEarlyBinding()
Dim strUrl As String
Dim strJquery As String
Dim objBrowser As InternetExplorer
Dim objDocument As HTMLDocument
On Error GoTo CleanUp
'url and jquery required for automation
strUrl = "http://www.omahasteaks.com/product/Bacon-Wrapped-Filet-Mignons-4-5-oz-01144?ITMSUF=WZB"
strJquery = "$($('a.os_opt_dd')[12]).trigger('mousedown')"
'create IE
Set objBrowser = New InternetExplorer
'browse to page and wait for load
objBrowser.Visible = True
objBrowser.navigate strUrl
While objBrowser.readyState <> READYSTATE_COMPLETE 'READYSTATE_COMPLETE =4
DoEvents
Wend
'force jquery event on document
Set objDocument = objBrowser.document
objDocument.parentWindow.execScript strJquery, "JavaScript"
CleanUp:
If Err.Number <> 0 Then
Debug.Print Err.Number & ": " & Err.Description
End If
'objBrowser.Quit
Set objDocument = Nothing
Set objBrowser = Nothing
End Sub
注意我使用了早期绑定,因为使用后期绑定来测试这个问题的解决方案很痛苦。所需的参考资料是:
- Microsoft HTML 对象库
- Microsoft Internet 控件
更新
另一个jquery trigger 不依赖于列表中第13 个锚标记,将使用以下代码:
$('#right_sku_form').find('div#selector-PAR-00000009957').find('a.os_opt_dd').trigger('mousedown')
find() 函数向下搜索 DOM 树。
- 锚点位于
<form> 和id 中的right_sku_form
- 在表单中有一个
<div> 和id 的selector-PAR-00000009957
- 在
<div> 中有我们的锚,作为a.os_opt_dd 的class
您可以将jquery 命令作为strJquery 的值放在vba 代码中,然后改用它。