我正在运行一个从this webpage收集信息的Excel VBA宏。要获得定价信息,您需要点击标有" 5盎司的方框。 - 4计数"在右侧,页面中间。单击该框后,会出现一个包含所需信息的弹出窗口。
我的问题是我无法弄清楚如何以编程方式点击此框。
从检查页面元素来看,似乎是以下元素
<a class="os_opt_dd" href="#"><span class="os_opt_dd_s">5 oz. - 4 Count</span><input tabindex="-1" value="1144"></a>
包含生成弹出窗口的可单击元素,但是当我尝试以编程方式单击它时(如下面的代码所示)没有任何反应。
my_url="http://www.omahasteaks.com/product/Bacon-Wrapped-Filet-Mignons-4-5-oz-01144?ITMSUF=WZB"
Set ie = CreateObject("InternetExplorer.Application")
With ie
.Visible = True
.navigate my_url
.Top = 50
.Left = 530
.Height = 400
.Width = 400
End With
ie.document.getelementsbytagname("a")(0).Click
当我尝试使用以下代码循环遍历页面上的所有元素时,我能够单击该框并生成弹出窗口。但是,如果我刷新网页,生成弹出窗口的x值将会有所不同。
For x = 0 To ie.document.all.Length - 1
ie.document.all.Item(x).Click ' x=1101, 1103 and 1190, 1223 often seemed to generate the pop-up
Next
有人可以告诉我如何以可重复的方式点击该框吗?谢谢你的帮助。
答案 0 :(得分:3)
如果您按照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,你会发现很多关于click / events / 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
注意我使用了早期绑定,因为使用后期绑定来测试此问题的解决方案是一种痛苦。所需的参考资料是:
替代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>
中有我们的锚点class
a.os_opt_dd
答案 1 :(得分:1)
如果我理解你的问题。 如果您尝试以编程方式将数据输入到Control中,请尝试并替换此行,
ie.document.getelementsbytagname("a")(0).Click
有了这个,
ie.Document.getElementsByName("a")(0).Value = "YourValue"
编辑,我看到你也想点击文字,
Set tags = ie.Document.GetElementsByTagname("a")
For Each t In tags
t.Click
Next