none
Responder a un popup RRS feed

  • Pregunta

  • Estoy automatizando una aplicación y me encuentro que al introducir los datos en el HTMLdocumento y hacer el envío, a veces (no ocurre siempre, sólo cuando el servidor no responde en tiempo) sale un popup que me dice que espere y con un botón que debo pulsar para continuar. El problema es que no consigo automatizar la respuesta a este popup.

    Alguien ha resuelto este problema?

     
     

    viernes, 10 de mayo de 2013 13:42

Respuestas

  • Ya encontré una solución. Supongo que habrá otras más elegantes.

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                    ByVal lpClassName As String, _
                    ByVal lpWindowName As String) As Long
                   
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
                    ByVal hWnd1 As Long, _
                    ByVal hWnd2 As Long, _
                    ByVal lpsz1 As String, _
                    ByVal lpsz2 As String) As Long
                   
    Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                    ByVal hWnd As Long, _
                    ByVal wMsg As Long, _
                    ByVal wParam As Integer, _
                    ByVal lParam As Any) As Long


    Private Declare Function SetActiveWindow Lib "user32.dll" (ByVal hWnd As Long) As Long

    Public Function ContestarDialogoEspere() As Boolean

      Dim wnd1 As Long  ' esta es la ventana del diálogo
      Dim wnd2 As Long  ' esta es la ventana del botón que pulsamos
      Dim t1 As Long
     
      t1 = Timer()
      Do While wnd1 = 0
        If Timer() - t1 > 5 Then Exit Do
        wnd1 = FindWindow("#32770", "Aquí el nombre de la ventana")
        ' Message   The class for a message-only window.
        ' #32768    The class for a menu.
        ' #32769    The class for the desktop window.
        ' #32770    The class for a dialog box.
        ' #32771    The class for the task switch window.
        ' #32772    The class for icon titles.
      Loop
         
         
      If (wnd1 <> 0) Then    ' wnd1 es la ventana del mensaje
          If (GetParent(wnd1) = IE) Then    ' compruebo que el padre de wnd1 es IE
              wnd2 = FindWindowEx(wnd1, 0, "Button", "OK")      'wnd2 es la ventana del botón
              If wnd2 <> 0 Then 
                SetActiveWindow wnd2
                SendMessage wnd2, BM_CLICK, 0, ByVal 0&
              End If
          End If
      End If

    End Function


    • Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 20:23
    lunes, 13 de mayo de 2013 13:43
  • Creo que te estás complicando un poco la vida en efecto...

    De entrada, si conoces el elemento a nivel de IExplore sobre el que quieres hacer click, sólo tienes que usar este método...

    Set IE = CreateObject("InternetExplorer.Application") 'Wait mientras carga Do while IE.busy loop

    'Hacer click sobre el elemento command button del PopUP, si es Iexplore... IE.document.all.item("ElementIDCommandButtonPopUp").click

    Se que es muy simplon, pero al final es tan sencillo como esto. Deberías encontrar un elemento o setting del PopUp de espera que te permita filtrar y ejecutar el click sobre este en caso que aparezca.

    Saludos

    Julio Rosua


    • Editado Julian Ros martes, 14 de mayo de 2013 7:21
    • Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 20:23
    martes, 14 de mayo de 2013 7:20

Todas las respuestas

  • Ya encontré una solución. Supongo que habrá otras más elegantes.

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                    ByVal lpClassName As String, _
                    ByVal lpWindowName As String) As Long
                   
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
                    ByVal hWnd1 As Long, _
                    ByVal hWnd2 As Long, _
                    ByVal lpsz1 As String, _
                    ByVal lpsz2 As String) As Long
                   
    Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                    ByVal hWnd As Long, _
                    ByVal wMsg As Long, _
                    ByVal wParam As Integer, _
                    ByVal lParam As Any) As Long


    Private Declare Function SetActiveWindow Lib "user32.dll" (ByVal hWnd As Long) As Long

    Public Function ContestarDialogoEspere() As Boolean

      Dim wnd1 As Long  ' esta es la ventana del diálogo
      Dim wnd2 As Long  ' esta es la ventana del botón que pulsamos
      Dim t1 As Long
     
      t1 = Timer()
      Do While wnd1 = 0
        If Timer() - t1 > 5 Then Exit Do
        wnd1 = FindWindow("#32770", "Aquí el nombre de la ventana")
        ' Message   The class for a message-only window.
        ' #32768    The class for a menu.
        ' #32769    The class for the desktop window.
        ' #32770    The class for a dialog box.
        ' #32771    The class for the task switch window.
        ' #32772    The class for icon titles.
      Loop
         
         
      If (wnd1 <> 0) Then    ' wnd1 es la ventana del mensaje
          If (GetParent(wnd1) = IE) Then    ' compruebo que el padre de wnd1 es IE
              wnd2 = FindWindowEx(wnd1, 0, "Button", "OK")      'wnd2 es la ventana del botón
              If wnd2 <> 0 Then 
                SetActiveWindow wnd2
                SendMessage wnd2, BM_CLICK, 0, ByVal 0&
              End If
          End If
      End If

    End Function


    • Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 20:23
    lunes, 13 de mayo de 2013 13:43
  • Viendo ese código, está claro que te confundiste de foro, pues este es de scripting y eso es o VBA o Vb 6.0

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)

    martes, 14 de mayo de 2013 6:14
    Moderador
  • Creo que te estás complicando un poco la vida en efecto...

    De entrada, si conoces el elemento a nivel de IExplore sobre el que quieres hacer click, sólo tienes que usar este método...

    Set IE = CreateObject("InternetExplorer.Application") 'Wait mientras carga Do while IE.busy loop

    'Hacer click sobre el elemento command button del PopUP, si es Iexplore... IE.document.all.item("ElementIDCommandButtonPopUp").click

    Se que es muy simplon, pero al final es tan sencillo como esto. Deberías encontrar un elemento o setting del PopUp de espera que te permita filtrar y ejecutar el click sobre este en caso que aparezca.

    Saludos

    Julio Rosua


    • Editado Julian Ros martes, 14 de mayo de 2013 7:21
    • Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 20:23
    martes, 14 de mayo de 2013 7:20