none
simular click en pagina especifica con webbrowser o tomar datos de webbrowser sin ser handler ??? RRS feed

  • Pregunta

  • Estimados,

    Estoy desarrollando una aplicación la cual se nutre de informes q brinda un sitio, básicamente mi problema es q no puedo simular dos click ya no se  como hacerlo, ya verán el código pero no pude hacerlo con los métodos tradicionales.

    La segunda opción q tome fue leer el HTML generado pero necesito tomar el HTML luego q cargué un control o no se q es pero no puedo determinar con q evento me entero q termino de cargar por tanto quise hacer un hilo con un sleep y luego tomar los datos pero no puedo acceder al webbrowser ya q no es un handler creo.

    Intentge postear todo acá pero el código de la pagina es muy largo, si no le molesta les podria enviar un mail con las imagenes y el código, supngo que para gente con experiencia en web es una papita pero no para mi.

    Si estan de acuerdo les dejo mi correo marquele9@hotmail.com así les paso el código y las imagenes.

     

    Gracias,

    Marcos.

    jueves, 10 de mayo de 2012 13:05

Respuestas

Todas las respuestas

  • No entiendo muy bien lo que quieres hacer, pero veamos, puede cargar tu página web en el control WebBrowser

    Uri uri = new Uri(" http://www.midireccion.com");
    mybrowser.Navigate(uri);

    Una vez que ha cargado la página (en el evento Navigated) puedes recorrerlo o buscar elemento determinados (HtmlElement) y hacer cosas como simular un click por todos los enlaces o en los que consideres oportunos

    private void mybrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {           
      // Buscamos un enlace que tenga un id determinado
      HtmlElement link = mybrowser.Document.GetElementByID("miidentifador");
      link.InvokeMember("click");    
    }


    Atentamente, Sergio.

    Blog
    Twitter

    viernes, 11 de mayo de 2012 10:24
  • Sergio, gracias por resopnder. Ya he intentado hacerlo de la manera q tu me planteas y no he tenido resultado.

    Aca te presento otra alternativa q he intentado hacer pero no logro desifrar el error q tengo, te paso el codigo entero.

    Imports System.ComponentModel
    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            WebBrowser1.Navigate("www.cargamovil.com.uy")
        End Sub
        Private countLink As Integer = 0
        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            Console.WriteLine(countLink)
            If countLink = 4 Then
                countLink += 1
                Me.BackgroundWorker1.RunWorkerAsync(2000)
            End If
    
            If countLink = 3 Then
                WebBrowser1.Document.GetElementById("ctl00_ContentPlaceHolder1_reportControl_LinkDoSearch").InvokeMember("click")
                'System.Threading.Thread.Sleep(6000)
                countLink += 1
                ' guardarValorP = True
                Me.BackgroundWorker1.RunWorkerAsync(2000)
            End If
            If countLink = 2 Then
                countLink += 1
            End If
    
            If countLink = 1 Then
                Dim url As String = "https" & "://www.cargamovil.com.uy/Pages/Stores/Reports/StoreReports.aspx?ReportId=1401"
                WebBrowser1.Navigate(url)
                countLink += 1
            End If
    
            If countLink = 0 Then
                'User
                Dim index As Integer = WebBrowser1.DocumentText.IndexOf("TextBoxUser")
                Dim idName As String = WebBrowser1.DocumentText.Substring(index).Split(CChar("'"))(0)
                WebBrowser1.Document.GetElementById(idName).InnerText = "Este seria el usuario"
    
                'Pass
                index = WebBrowser1.DocumentText.IndexOf("id=""TextBoxPassword")
                Dim idPass As String = WebBrowser1.DocumentText.Substring(index + 4).Split(CChar(""""))(0)
                WebBrowser1.Document.GetElementById(idPass).InnerText = "este seria el pas"
    
                WebBrowser1.Document.GetElementById("LogInButton").InvokeMember("click")
                countLink += 1
            End If
        End Sub
    
        Private planillaWeb As HtmlElement
        Public Function MiSub(ByVal n As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As String
            If worker.CancellationPending Then
                e.Cancel = True
            Else
    
                Try
                    System.Threading.Thread.Sleep(6000)
    
                    planillaWeb = WebBrowser1.Document.GetElementById("ctl00_ContentPlaceHolder1_reportControl_WebGridReports_of")
    
                Catch ex As Exception
    
                End Try
            End If
            Return ""
    
        End Function
    
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim bw As BackgroundWorker = CType(sender, BackgroundWorker)
            Dim arg As Integer = CInt(Fix(e.Argument))
            e.Result = MiSub(4, CType(sender, BackgroundWorker), e)
            If bw.CancellationPending Then
                e.Cancel = True
            End If
        End Sub
    
        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            ' MsgBox.ShowDialog("ioa")
        End Sub
    
        Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            'Me.ProgressBar1.Value = e.ProgressPercentage
        End Sub
    
    End Class
    

    Saludos Marcos.

    miércoles, 23 de mayo de 2012 21:34
  • ¿Y exactamente que es ctl00_ContentPlaceHolder1_reportControl_WebGridReports_of en la página web? Porque en las pruebas que acabo de hacer el código funciona perfectamente, salvo que no se encuentre el elemento pero en ese caso el método GetElementById devuelve nothing, pero no esa excepción.

    Atentamente, Sergio.

    Blog
    Twitter

    jueves, 24 de mayo de 2012 7:43
  • Sergio, mil mil gracias por responderme.

    Lo q quiero obtener es un div

    <div style="border-bottom: #9eb6ce 1px solid; position: relative; border-left: #9eb6ce 1px solid;
                    height: 500px; border-top: #9eb6ce 1px solid; border-right: #9eb6ce 1px solid"
                    id="ctl00_ContentPlaceHolder1_reportControl_WebGridReports_of">

    el primer problema q tengo es q quiero hacer Webbrowser1.document dentro de un hilo q lanzo dentro de WebBrowser1_DocumentCompleted y dentro del proceso q lanza ese hilo me sucede q no reconoce la variable o no la puede evaluar, el error es "error. cannot obtaine value" .

    Basicamente lo q necesito es saber cuando se termina de ejecutar un script q carga el div, el escript es "javascript.DoSearch()", hay algun evento q suceda cuando se termina de ejecutar el script? luego de eso quiero obtener el div.

    No se si me explico correctamente, pero es eso basicamente lo q necesito, al final de ejcutarse el script obtener el div.

    Editado luego de posteado.Econtre el error:

    este es +        AccessibilityObject    {"Cross-thread operation not valid: Control 'WebBrowser1' accessed from a thread other than the thread it was created on."}    System.Windows.Forms.AccessibleObject
    como soluciono esto?

    viernes, 25 de mayo de 2012 12:14
  • Lo solucione con un delegado del formulario q contiene el webbrowser.
    lunes, 28 de mayo de 2012 16:57