Hola que tal amigos espero que estén muy bien ::)
Hoy me encuentro con un problema para mi ya que estoy tratando de chequear con VISUAL BASIC los enlaces(Links) por los cuales pasa mi Webbrowser después de enviar un formulario.
Al hacer click mi webbrowser pasa por un redireccionamiento de 3 enlaces ejemplo
Hago click en submit luego pasa esto navega a ( Google1.com .. redirecciona a Google2.com y termina en Google3.com ) .
No logro identificar el enlace Google2.com con el siguiente codigo
If WebBrowser1.Url.ToString.Contains("PARTE DE MI ENLACE WEB") Then
probando y probando solo esta validación puede recolectar el inicio : Google1.com y el final Google3.com .
Pero el enlace Google2.com no lo logra detectar
Quisiera saber si existe alguna manera de como detectar 1 o todos los enlaces con una validacion parecida a esta
Desde ya muchas gracias ;-)
Prueba añadiendo un controlador para el evento
WebBrowser.Navigating...
- https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.navigating?view=netframework-4.8
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim urls As String() = {"google.co.jp", "google.co.uk", "google.es", "google.com"}
For Each url As String In urls
Me.WebBrowser1.Navigate(url)
Next
End Sub
Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
Console.WriteLine($"Starting navigation: {e.Url}")
Me.ValidateUri(e.Url)
End Sub
Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles WebBrowser1.Navigated
Console.WriteLine($"Completed navigation: {e.Url}")
End Sub
Private Sub ValidateUri(uri As Uri)
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
' ...
End If
End Sub
End Class
(https://i.imgur.com/evQa5XQ.png)
Saludos.
Hola Eleкtro el codigo funciona a la perfección ahora puedo detectar los redirect en mi webbrowser :D
Con esta validacion + tu codigo!
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
Lo unico malo, es que creo que esta validación duplica o agarra 2 veces el enlance (Links) ya que me manda 2 MenssageBox :xD no se si sera eso o algún desastre en mi código
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
MessageBox.Show("Entrando a la web.")
End If
Aunque en la consola veo que se duplican muchas veces los enlaces(links) ni idea porque sera
(https://i.imgur.com/P9Kwayg.png)
Igual pasa con los Completed navigation: hasta 4 veces se duplican :silbar:
Muchas gracias la verdad por tomarte tu tiempo para darme un buen ejemplo ! es digno de admirar ;-)
Tienes que esperar a que las páginas terminen de cargarse. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.documentcompleted?redirectedfrom=MSDN&view=netframework-4.8
Hola string Manolo gracias por responder resulta que el código
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
Siempre esta a la escucha eso esta bien por una parte y por otra no ya que como muestro en la imagen la pagina hay veces que carga el mismo link 3 o 4 veces
(https://i.imgur.com/P9Kwayg.png)
Cuando pasa mi link por este codigo
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
Valida el MessageBox.Show("Entrando a la web.")
3 o 4 tantas veces logre aparecer
Ya probe un WebBrowser.DocumentCompleted y sigue apareciendo muchas veces el link en mi consola
Según la documentación de Microsoft:
WebBrowser.Navigating (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.navigating?view=netframework-4.8)event:
Occurs before the WebBrowser control navigates to a new document
WebBrowser.Navigated (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.navigated?view=netframework-4.8)event:
Occurs when the WebBrowser control has navigated to a new document and has begun loading it.
...
Handle the DocumentCompleted event to receive notification when the WebBrowser control finishes loading the new document.
WebBrowser.DocumentCompleted (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.documentcompleted?view=netframework-4.8) event:
Occurs when the WebBrowser control finishes loading a document
...
Handle the DocumentCompleted event to receive notification when the new document finishes loading. When the DocumentCompleted event occurs, the new document is fully loaded
En resumen, el orden de desencadenamiento de eventos es el sigueinte:
1. WebBrowser.Navigating: cuando comienza la navegación a "X" url.
2. WebBrowser.Navigated: cuando comienza la carga del documento html en la página a navegar.
3. WebBrowser.DocumentCompleted: cuando finaliza la carga del documento html en la página a navegar.
Como no hay tiempo suficiente para que comience la carga del documento html en el ejemplo de código que compartí más arriba, el evento Navigating se dispara para todas las urls, mientras que el evento Navigated se dispara solamente para la última url como puedes comprobar en la imagen que compartí. Si quieres obtener la url de todas las redirecciones antes de que comience la carga del documento para validar/filtrar la url y poder cancelar la navegación o lo que pretendas hacer, entonces deberías seguir usando el evento Navigating como en el ejemplo de código que mostré.
Cita de: PotatoWith en 12 Agosto 2019, 01:05 AMYa probe un WebBrowser.DocumentCompleted y sigue apareciendo muchas veces el link en mi consola
Para serte sincero, no tengo un gran domino en cosas relacionadas con la programación a nivel web, cosas de html y de páginas web en general, de hecho, de vez en cuando a mi también me surjen algunas dudas con ciertos aspectos del componente WebBrowser. Lo que puedo decirte es que el evento DocumentCompleted puede dispararse múltiples veces, ya que una página puede contener iframes que desencadenen el evento (https://stackoverflow.com/a/57456090/1248295), pero por otro lado el evento Navigating y Navigated solamente debería dispararse una vez por cada url... ¿pero tu dices que no es así?.
De cualquier manera, siempre existe la solución rudimentaria de declarar una variable booleana para evitar, o mejor dicho ignorar múltiples desencadenamientos del mismo evento. Es decir, la primera vez que se dispare el evento DocumentCompleted, le asignarías un valor True a dicha variable, y si se vuelve a disparar el evento solo tienes que comprobar si el valor de la variable es True o False; de esta forma evitas la repetición de tu "validación de url" por así decirlo donde usas esa condicional para comprobar si la url contiene cierta cadena de texto.
Saludos.
En el for se hace el navigating a todas las url. En tu caso son 4. Entonces te muestra los 4 about:blank, en la propia salida del programa te dice starting navigating. Empezó la navegación a las 4 url.
Si lo único que te molesta es que aparezca la salida del programa repetida, elimina la línea Console.WriteLine($"Starting navigation: {e.Url}")
Que es la que imprime los about:blank. Igual te interesa empezar la navegación a cada url una por una. En ese caso mete los strings en un array y cuando quieras llamas al siguiente. Por ejemplo cuando se termine de cargar el documento sumas +1 al índice del array y lo imprimes, asi automatizas el proceso y cada vez que se finalice el load del documento se pasará a pedir el siguiente. Usa el método de la clase array con .getupperbound() para obtener una variable índice con el número total de elementos.
Deberías hacerlo de esta forma si vas a manejar un gran número de dominios, porque si no dependiendo del número de dominios y la propia implementación del navigate podría darse el caso de ir acomulándose más page:blank y documentos cargándose de los que se liberan. También deberías procesar el documento cargado nada más finalice la descarga para poder eliminar el documento cargado de memoria cuanto antes. Así optimizas el uso de memoria del programa. Aunque si la aplicación no va a hacer mucha locura tipo descargar documentos de 400 dominios, y procesarlos heavy da un poco igual xD
Hola a todos y gracias nuevamente por estar al tanto sobre mi problema..
Eleкtro si eso me di cuenta sobre Navigating Navigated
Para las redirecciones me funciona perfecto : Navigating las coje todas sin perder ni 1 ;-)
También pude observar que es problema del sitio web , que al momento de hacer la redireccion envía varias veces el mismo url de redireccion (Probe con otro sitio web y no pasa)
Como pudieron observar soy muy pero muy nuevo con el tema de vb.net pero finalmente para este sitio web le encontre una solucion (Muy penosa y Vaga la verdad :-[ ) Por falta de mis conocimientos sobre este tema ..
Lo que hice fue detener la navegacion al momento de que mi Webbrowser llegara al url de reddireccion y ahora solamente me aparece 1 Solo MenssageBox MessageBox.Show("Entrando a la web.")
Y solamente lo vuelvo a activar en otra parte de mi codigo mediante que el bucle hace su trabajo
Aca el codigo que use para que no aparecieran mas redirecciones
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
MessageBox.Show("Entrando a la web.")
WebBrowser1.AllowNavigation = False
'' aca sigo con mas codigo para continuar el bucle y vuelvo a activar WebBrowser1.AllowNavigation = True
End If
Se que esta no es la mejor manera tal vez.. pero mientras valla adquiriendo mas conocimientos seguro que lo acomodare . Creo que seria bueno dejar este tema abierto para que otras personas puedan aportar soluciones sobre sitios web como este.. (Solo digo ) :P !
Muy agradecido por su soporte :D