Saltar al contenido

Accediendo al objeto en iframe usando VBA

Si encuentras algún detalle que te causa duda puedes dejarlo en los comentarios y haremos todo lo necesario de ayudarte rápidamente.

Solución:

A veces es complicado con iframes. Residencia en html proporcionaste que he creado este ejemplo. ¿Cuál funciona a nivel local, pero también funcionaría para usted?

Para llegar al IFrame los frames se puede utilizar la colección. Espero que sepas el name de El IFrame?

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

Entonces para ir al image nosotros podemos usar querySelector método, por ejemplo, como este:

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

El selector a[href^='https://stackoverflow.com'] selecciona anchor que tiene un href attribute que comienza con un texto dado. los ^ denota el comienzo.

Luego, cuando tengamos la imagen, solo una simple llamada a click en su padre que es el deseado anchor. HTH


Ejemplo completo:

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 de la página principal utilizado







x -







IFrame HTML utilizado (guardado como archivo iframe1.html







Untitled 2



 
x -

Por cierto, el marco puede ser referenciado por su índice también doc.frames(0).document. Gracias a Paulo Bueno.

Pensé que ampliaría la respuesta ya dada.

En el caso de Internet Explorer, es posible que tenga una de dos situaciones comunes que manejar con respecto a los iframes.

1) src de iframe está sujeto a restricciones de política del mismo origen:

El iframe src tiene un origen diferente al de la página de destino, en cuyo caso, debido a la misma política de origen, los intentos de acceder a ella producirán acceso denegado.

Resolución:

Considere usar selenium basic para automatizar un navegador diferente, como Chrome, donde se permite CORS / puede cambiar al iframe y continuar trabajando con el documento iframe

Ejemplo:

Option Explicit
'download selenium https://github.com/florentbr/SeleniumBasic/releases/tag/v2.0.9.0
'Ensure latest applicable driver e.g. ChromeDriver.exe in Selenium folder
'VBE > Tools > References > Add reference to selenium type library
Public Sub Example()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Set d = New ChromeDriver
    With d
        .Start "Chrome"
        .get URL
        .SwitchToFrame .FindElementByCss("iframe") '< pass the iframe element as the identifier argument
        ' .SwitchToDefaultContent ''to go back to parent document.
        Stop '<== delete me later
        .Quit
    End With
End Sub

2) src de iframe no está sujeto a restricciones de política del mismo origen:

Resolución:

Los métodos como se detallan en la respuesta ya dada. Además, puede extraer el src del iframe y .Navigate2 que para acceder

.Navigate2 .document.querySelector("iframe").src

Si solo desea trabajar con el contenido del iframe, simplemente haga su inicial .Navigate2 los iframe src y ni siquiera visite la página de destino inicial

Ejemplo:

Option Explicit
Public Sub NavigateUsingSrcOfIframe()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .Navigate2 "http://www.bursamalaysia.com/market/listed-companies/company-announcements/5978065"

        While .Busy Or .readyState < 4: DoEvents: Wend

        .Navigate2 .document.querySelector("iframe").src

        While .Busy Or .readyState < 4: DoEvents: Wend

        Stop '<== delete me later
        .Quit
    End With
End Sub

3) iframe en ShadowRoot

Un caso improbable podría ser un iframe en shadowroot. Realmente debería tener uno u otro y no uno dentro del otro.

Resolución:

En ese caso, necesita un acceso adicional de

Element.shadowRoot.querySelector("iframe").contentDocument

dónde Element es tu elemento padre con shadowRoot adjunto. Este método solo funcionará si el shadowRootmode se establece en Open.

Ejemplo:

Seguir

Al final de todo puedes encontrar las anotaciones de otros creadores, tú asimismo puedes insertar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *