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
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 shadowRoot
mode
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.