** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - webbrowser control
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradowebbrowser control

 Responder Responder Página  <12
Autor
Mensaje
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3114
Enlace directo a este mensaje Enviado: 10/Octubre/2016 a las 16:46
No. No creo que tenga que ver con la versión del Explorer. Lo de Access 2003 tampoco creo que influya. Yo lo estoy probando en Windows 10 y con Access 2007.

La verdad es que ayer por la noche sí me funcionaba a mí. Pero también puede ser porque en algún punto estaba interrumpiendo el código para depurarlo. Eso daba tiempo a que se cargara la página y entonces no me daba problemas. Ahora, al ver tu respuesta, he ejecutado el ejemplo que tenía y también me ha fallado en el mismo sitio que tú indicabas.

Lo que sí me he fijado es que todo este código se está basando en algo erróneo, a no ser que se me escape algo, y es que los controles a los que se les está dando un valor no tienen un Id asignado en la página. Esto quiere decir que la instrucción getElementById no debería ni siquiera funcionar (aunque en realidad sí lo hace, pero puede que eso provoque alguna incidencia que no conocemos) Puede que esto sea parte del funcionamiento del Internet Explorer (los controles WebBrowser de Access son ActiveX basados en Internet Explorer. A partir de la versión 2010 estos controles son parte de los controles intrínsecos de Access). Si ese mismo código lo ejecutáramos para Firefox u otro navegador puede que simplemente no funcionara ... no lo se. Estos otros navegadores son más "puristas" con el código y no permiten muchas cosas que IE sí hace (eso le ha dado a IE bastante mala fama entre los programadores/maquetadores web ya hace mucho tiempo).

La manera de acceder a un control web que no tiene asignado un Id, pero sí un nombre (como es el caso) se debería hacer recorriendo una colección según el tipo de control

He corregido el código para que referencie los controles mediante la colección a la que pertenecen y he marcado la ejecución de los "pasos" únicamente cuando se haya realizado. Esto dará la opción a que los eventos DocumentComplete y OnChange, que es donde se establecen los valores, se disparen más de una vez, a la espera de que esos controles sean realmente localizados. Te pongo el código aquí y ya me dirás


' declaración de variables de controles para cazar sus eventos
Dim WithEvents WB As WebBrowser
Dim WithEvents inputMarca As HTMLSelectElement
' banderas que servirán para controlar cada una de las acciones
' que se realizarán en las páginas
Dim Paso1 As Boolean
Dim Paso2 As Boolean
Dim Paso3 As Boolean

Private Sub Form_Load()
    DoCmd.Maximize
    ' dimensionamos la variable para el control WebBrowser
    Set WB = Me.WebBrowser1.Object
    WB.Silent = True
End Sub

' cargamos la página
Private Sub Comando1_Click()
    WB.Navigate "http://www.standvirtual.com/"
End Sub

' este evento saltará cuando el control WebBrowser considere que se ha
' completado la carga del documento de la página llamada
' (esto no quiere decir que sea completamente visible eh?, pero en memoria
' ya se tendrá cargada la información completa de la página y por tanto se
' podrán referenciar los controles contenidos en el objeto Document de la página)
Private Sub WB_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim ctlSelect As Object

    ' primer paso, referenciamos el control select llamado "ma"
    ' (que en la página tiene el título "Marca")
    ' le damos un valor
    ' y ejecutamos la función detrás del evento onchange
    If Paso1 = False Then
        ' recorremos la colección de objetos tipo Select de la página
        For Each ctlSelect In WB.Document.getElementsByTagName("select")
            If ctlSelect.Name = "ma" Then
                Set inputMarca = ctlSelect
                inputMarca.Value = 45
                Call inputMarca.FireEvent("onchange")
                ' nos aseguramos que no se intente hacer este paso otra vez
                Paso1 = True
                Exit For
            End If
        Next
       
    ' esto se ejecutará la siguiente vez que salte este evento
    ' es decir, cuando se cargue la siguiente página, la cual aparecerá
    ' a consecuencia del Submit del formulario donde está el control
    ' Select "Marca"
    ElseIf Paso3 = False Then
        WB.Document.parentWindow.Scroll 0, 530
        Paso3 = True
    End If
   
End Sub

' cazamos el momento en que se termine de ejecutar el evento
' onchange del control select "Marca"
' y rellenamos el resto de controles del formulario
Private Sub inputMarca_onchange()
Dim ctlSelect As Object
Dim i As Long

    If Paso2 = False Then
        ' recorremos la colección de objetos tipo Select de la página
        For Each ctlSelect In WB.Document.getElementsByTagName("select")
            With ctlSelect
                ' buscamos los controles por su nombre
                Select Case .Name
                    Case "mo"
                        .Value = 948
                        i = i + 1 ' el código estuvo aquí
                    Case "sort"
                        .Value = "11"
                        i = i + 1
                    Case "tr"
                        .Value = 0
                        i = i + 1
                    Case "ez"
                        .Value = 2006
                        i = i + 1
                    Case "ezb"
                        .Value = 2006
                        i = i + 1
                End Select
            End With
        Next
       
        If i > 0 Then ' si se tenido acceso a alguno de los controles, realizamos la búsqueda
            WB.Document.Forms(0).submit ' aqui se abre outra pagina con los resultados de la busqueda
            Paso2 = True
        End If
    End If
   
End Sub


La verdad es que se habla aquí de bucles de espera. En mi opinión esos bucles no son fiables. (las propiedades ReadyState y Busy se suelen utilizar pero creo que de modo erróneo, ya que es una propiedad del WebBrowser, no del objeto Document, que es el que se pretende controlar. El WebBrowser hace más cosas, aparte de cargar un documento HTML). Lo más probable es que para la mayoría de ocasiones hagan su función y el código no falle, sobre todo si se le da un tiempo de espera razonable. Pero el día que por la razón que sea la página tarde más de la cuenta en cargarse, fallarán y el código fallará también. Lo suyo es utilizar los eventos. Si por lo que sea, a la primera no funcionan seguramente será por algo. Lo mejor es averiguar qué pasa, solventarlo y escribir el código apropiado para cada ocasión. Eso dará un poco más de solidez al código y lo hará más fiable.

Aún así, el tema de la automatización de páginas web es algo muy muy variable. Depende sobre todo del diseño interno de cada página. También puede variar según el navegador con el que se acceda ... Yo suelo automatizar páginas y aplicaciones web (algunas incluso interactúan con el propio PC y su sistema de archivos, ya que son aplicaciones de una empresa) y te digo, voy improvisando. No es una ciencia exacta. En el caso de esta página veo que también tiene banners publicitarios y eso puede influir en la carga del documento ...


Editado por happy - 10/Octubre/2016 a las 17:01
Saludos,

Juan M. Afan de Ribera
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3114
Enlace directo a este mensaje Enviado: 10/Octubre/2016 a las 16:47
Paco, gracias por recordarme lo del FTP. La verdad es que también es por vagancia absoluta (ya sabes  Wink )
Saludos,

Juan M. Afan de Ribera
Arriba
cpampasPT Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 20/Marzo/2010
Localización: Portugal
Estado: Sin conexión
Puntos: 537
Enlace directo a este mensaje Enviado: 10/Octubre/2016 a las 20:34
Juan,
Funciona perfectamente. Genial !!!!i
Ahora me toca seguir tu consejo de seguir el codigo segun se ejecuta para compreender  su diseno, pues seguramente me servira para futuras ocasiones.
Muchissimas gracias

P.S. Podeis cerrar el hilo





Arriba
 Responder Responder Página  <12
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable