Accessing object in iframe using VBA

To the point:

I have successfully used VBA to do the following:

  • Login to a website using getElementsByName

  • Select parameters for the report that will be generated (using getelementsby...)

  • generating the report after selecting parameters which renders the resulting dataset into an iframe on the same page
  • Important to note - The website is client-side

    The above was the simple part, the difficult part is as below:

    clicking on a gif image within the iframe that exports the dataset to a csv

    I have tried the following:

    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
    

    To give some context to the logic above -

  • I accessed the main frame
  • i accessed the iframe by its name element
  • i accessed the content within the iframe
  • I attempted to find the gif image that needs to be clicked to export to csv
  • It is at this line that it trips up saying "Object doesn't support this property or method"

    Also tried accessing the iframe gif by the a element and href attribute but this totally failed. I also tried grabbing the image from its source URL but all this does it take me to the page the image is from.

    note: the iframe does not have an ID and strangely the gif image does not have an "onclick" element/event

    Final consideration - attempted scraping the iframe using R

    accessing the HTML node of the iframe was simple, however trying to access the attributes of the iframe and subsequently the nodes of the table proved unsuccessful. All it returned was "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
    

    As soon as ai include read_html the following error returns on the script:

    Error in if (grepl("<|>", x)) { : argument is of length zero

    I suspect this is referring to the Character(0)

    Appreciate any guidance here!

    Many Thanks,

    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>
    

    It is sometimes tricky with iframes . Based on html you provided I have created this example. Which works locally, but would it work for you as well?

    To get to the IFrame the frames collection can be used. Hope you know the name of the IFrame ?

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

    Then to go the the image we can use querySelector method eg like this:

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

    The selector a[href^='https://stackoverflow.com'] selects anchor which has an href attribute which starts with given text. The ^ denotes the beginning.

    Then when we have the image just a simple call to click on its parent which is the desired anchor . HTH


    Complete example:

    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
    

    Main page HTML used

    <!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 used (saved as file 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/96648.html

    上一篇: 好友:使用循环类型生成类

    下一篇: 使用VBA访问iframe中的对象