使用VBA访问iframe中的对象

关键点:

我已成功使用VBA执行以下操作:

  • 使用getElementsByName登录网站

  • 为将要生成的报告选择参数(使用getelementsby ...)

  • 在选择将结果数据集呈现到同一页面上的iframe的参数后生成报告
  • 重要提示 - 该网站是客户端

    以上是简单的部分,难点如下:

    点击将数据集导出到csv的iframe中的gif图像

    我已经尝试了以下内容:

    Dim idoc As HTMLDocument
    Dim iframe As HTMLFrameElement
    Dim iframe2 As HTMLDocument
    
    Set idoc = objIE.document
    Set iframe = idoc.all("iframename")
    Set iframe2 = iframe.contentDocument
    
        Do Until InStr(1, objIE.document.all("iframename").contentDocument.innerHTML, "img.gif", vbTextCompare) = 0
            DoEvents
        Loop
    

    为了给上述逻辑提供一些背景知识 -

  • 我访问了主框架
  • 我通过其名称元素访问了iframe
  • 我访问了iframe中的内容
  • 我试图找到需要点击以导出到csv的gif图像
  • 正是在这条线上,它说“对象不支持这个属性或方法”

    也尝试通过a元素和href属性访问iframe gif,但这完全失败。 我也尝试从源URL抓取图像,但所有这一切都将我带到图像所在的页面。

    注意:iframe没有ID,奇怪的是gif图像没有“onclick”元素/事件

    最后的考虑 - 尝试使用R来刮取iframe

    访问iframe的HTML节点很简单,但试图访问iframe的属性,随后表中的节点证明不成功。 它返回的是“Character(0)”

    library(rvest)
    library(magrittr)
    
    Blah <-read_html("web address redacted") %>%
      html_nodes("#iframe")%>%
      html_nodes("#img")%>%
      html_attr("#src")%>%
      #read_html()%>%
      head()
    Blah
    

    只要ai包含read_html脚本中的以下错误返回值:

    if(grepl(“<|>”,x)){:参数的长度为零时出错

    我怀疑这是指字符(0)

    欣赏任何指导!

    非常感谢,

    HTML

    <div align="center"> 
        <table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0"> 
            <tbody>
                <tr>
                    <td colspan="6"> &nbsp;</td>
                </tr> 
                <tr> 
                    <td colspan="6"> 
                        <a href="href redacted">
                            <img src="img.gif" width="38" height="38" border="0" align="right">
                        </a>
                        <strong>x - </strong>
                    </td>
                </tr> 
            </tbody>
        </table>
    </div>
    

    iframes有时会很棘手。 基于你提供的html ,我创建了这个例子。 哪些工作在本地,但它也适用于你?

    要访问IFrame ,可以使用frames集合。 希望你知道IFramename

    Dim iframeDoc As MSHTML.HTMLDocument
    Set iframeDoc = doc.frames("iframename").document
    

    然后去image我们可以使用querySelector方法,例如像这样:

    Dim img As MSHTML.HTMLImg
    Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")
    

    选择器a[href^='https://stackoverflow.com']选择具有以给定文本开始的href属性的anchor^表示开始。

    然后,当我们有图像只是一个简单的调用来click它的父母,这是所需的anchor 。 HTH


    完整的例子:

    Option Explicit
    
    ' Add reference to Microsoft Internet Controls (SHDocVw)
    ' Add reference to Microsoft HTML Object Library
    
    Sub Demo()
    
        Dim ie As SHDocVw.InternetExplorer
        Dim doc As MSHTML.HTMLDocument
        Dim url As String
    
        url = "file:///C:/Users/dusek/Documents/My Web Sites/mainpage.html"
        Set ie = New SHDocVw.InternetExplorer
        ie.Visible = True
        ie.navigate url
    
        While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
            DoEvents
        Wend
    
        Set doc = ie.document
    
        Dim iframeDoc As MSHTML.HTMLDocument
        Set iframeDoc = doc.frames("iframename").document
        If iframeDoc Is Nothing Then
            MsgBox "IFrame with name 'iframename' was not found."
            ie.Quit
            Exit Sub
        End If
    
        Dim img As MSHTML.HTMLImg
        Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")
        If img Is Nothing Then
            MsgBox "Image element within iframe was not found."
            ie.Quit
            Exit Sub
        Else
            img.parentElement.Click
        End If
    
        ie.Quit
    End Sub
    

    使用主页面HTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <!-- saved from url=(0016)http://localhost -->
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <title>x -</title>
    </head>
    
    <body>
    <iframe name="iframename" src="iframe1.html">
    </iframe>
    </body>
    
    </html>
    

    使用IFrame HTML(保存为文件iframe1.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <!-- saved from url=(0016)http://localhost -->
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <title>Untitled 2</title>
    </head>
    
    <body>
    <div align="center"> 
        <table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0"> 
            <tbody>
                <tr>
                    <td colspan="6"> &nbsp;</td>
                </tr> 
                <tr> 
                    <td colspan="6"> 
                        <a href="https://stackoverflow.com/questions/44902558/accessing-object-in-iframe-using-vba">
                            <img src="img.gif" width="38" height="38" border="0" align="right">
                        </a>
                        <strong>x - </strong>
                    </td>
                </tr> 
            </tbody>
        </table>
    </div>
    
    </body>
    
    </html>
    
    链接地址: http://www.djcxy.com/p/96647.html

    上一篇: Accessing object in iframe using VBA

    下一篇: Setting minimum value in Google Spreadsheet Chart programmatically