Según la documentación de Microsoft:
WebBrowser.Navigating event:
Occurs before the WebBrowser control navigates to a new document
WebBrowser.Navigated 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 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é.
Ya 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, 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.