【问题标题】:Click on HTML element and generate pop-up单击 HTML 元素并生成弹出窗口
【发布时间】:2016-08-06 19:53:47
【问题描述】:

我正在运行一个 Excel VBA 宏,它从 this webpage 收集信息。要显示定价信息,您需要单击页面中间右侧标有“5 oz. - 4 Count”的框。单击该框后,将出现一个包含所需信息的弹出窗口。

我的问题是我一直无法弄清楚如何以编程方式单击此框。

通过检查页面元素,似乎是以下元素

<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

谁能告诉我如何以可重复的方式点击框?

【问题讨论】:

    标签: jquery excel vba internet-explorer jquery-events


    【解决方案1】:

    如果您关注click 事件堆栈跟踪,您会发现此网页中发生了很多 的事情。尤其是似乎有三个单独的跟踪器脚本似乎需要挂钩 DOM 事件才能运行。我会冒险提出一个导致您明显问题的建议。

    我说很明显,因为可以通过页面上的 自动化来强制您想要触发的事件。特别是 我提出的解决方案。 正在页面上运行,并且是此 Web 应用程序事件处理的组成部分。

    有一个 trigger 方法 - 文档 here - 它说:

    从 jQuery 1.3 开始,.trigger()ed 事件在 DOM 树中冒泡

    我不相信像这样的基于 的代码:ie.document.foo.Click - 在您的情况下会导致事件传播。因此,让我们在以编程方式创建的 IE 会话中运行必要的 trigger 脚本作为解决方案的基础。

    您想要自动化的特定&lt;a&gt; 标记(锚点)具有os_opt_dd 类。页面上有 13 个这样的锚点(具有相同的类),您想要最后一个。可能有更好的方法来隔离锚(可能基于父级&lt;div&gt;),但我将把它作为练习留给你。

    所以提供自动化的 代码是这样的:

    // 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 等主题的主题/讨论,这些都是有用的阅读材料。如果您问 专家是否有更好的编码方法,我完全希望他们能提出更好的东西;)

    无论如何,最后,我们的 代码将是:

    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 控件

    更新

    另一个 trigger 不依赖于列表中第13 个锚标记,将使用以下代码:

    $('#right_sku_form').find('div#selector-PAR-00000009957').find('a.os_opt_dd').trigger('mousedown')
    

    find() 函数向下搜索 DOM 树。

    • 锚点位于&lt;form&gt;id 中的right_sku_form
    • 在表单中有一个&lt;div&gt;idselector-PAR-00000009957
    • &lt;div&gt; 中有我们的锚,作为a.os_opt_ddclass

    您可以将 命令作为strJquery 的值放在 代码中,然后改用它。

    【讨论】:

    • @RobinMackenzie 感谢代码和清晰的解释!
    • @ron - 很高兴,很乐意为您提供帮助
    • @RobinMackenzie 我想跟进您的建议,以更好地指定锚点。如果我在 ('a.os_opt_dd')[12]) 部分之前放置一个 div 元素,您能否提供一个示例来说明 str Jquery 的结构?谢谢
    【解决方案2】:

    如果我理解您的问题。 如果您尝试以编程方式将数据输入到控件中,请尝试替换此行,

    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
    

    【讨论】:

    • OP 表示使用Click 方法对他来说并不总是有效。
    猜你喜欢
    • 2019-12-04
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2022-12-31
    相关资源
    最近更新 更多