Llenar campos en pagina web

Iniciado por rigorvzla, 23 Mayo 2019, 04:59 AM

0 Miembros y 1 Visitante están viendo este tema.

rigorvzla

Hola a todos, realmente estoy lelo con esto y no se como empezar y ni si es posible, quiero crear una aplicacion en wpf donde al apretar un boton se abra una ventana de google y en el cuadro de busqueda automaticamente se escriba "Hola", y luego de manera automatica empiece la busqueda de eso.

No tengo la menor idea de como llenar, buscar el campo a llenar y bueno es algo que me gustaria aprender hacer para aplicarlo a otras webs ideas.

O si es necesario crear en la misma aplicacion un webbrowser con el que busque en la web lo deseado?.

espero puedan ayudarme.

ThunderCls

-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

rigorvzla

hombre, me ha servido tremendamente, el unico limitante es que se debe tener el google chrome instalado, sacando eso esta de perlas jajaja muuchas gracias compa, aunque si existe otra alternativa a mi problema seria perfecta leerla. Muchas gracias nuevamente

ThunderCls

IWebDriver es simplemente una interfaz, puedes crear la instancia del navegador que desees:

Código (csharp) [Seleccionar]
// NuGet: Selenium.WebDriver.ChromeDriver
using OpenQA.Selenium.Chrome;
IWebDriver driver = new ChromeDriver();
// NuGet: Selenium.Mozilla.Firefox.Webdriver
using OpenQA.Selenium.Firefox;
IWebDriver driver = new FirefoxDriver();
// NuGet: Selenium.WebDriver.PhantomJS
using OpenQA.Selenium.PhantomJS;
IWebDriver driver = new PhantomJSDriver();
// NuGet: Selenium.WebDriver.IEDriver
using OpenQA.Selenium.IE;
IWebDriver driver = new InternetExplorerDriver();
// NuGet: Selenium.WebDriver.EdgeDriver
using OpenQA.Selenium.Edge;
IWebDriver driver = new EdgeDriver();


https://www.automatetheplanet.com/selenium-webdriver-csharp-cheat-sheet/
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

rigorvzla

GUAOOOOOO eres un moustruo jajaja ahora todo mi paisaje cambia!!! muchas gracias hombre!! genialisimoooo

Eleкtro

#5
Cita de: rigorvzla en 23 Mayo 2019, 04:59 AM
al apretar un boton se abra una ventana de google y en el cuadro de busqueda automaticamente se escriba "Hola", y luego de manera automatica empiece la busqueda de eso.

No tengo la menor idea de como llenar, buscar el campo a llenar y bueno es algo que me gustaria aprender hacer para aplicarlo a otras webs ideas.

Ese problema parece estar mal planteado, ya que por lo que comentas no parece que realmente quieras automatizar de forma visual/interactiva el navegador, es decir, enviar pulsaciones del teclado para rellenar los campos del form, y pulsar el botón de buscar. Todo eso me resulta completamente innecesario (mal planteado) para lograr lo que parece ser tu objetivo real: mostrar el resultado de una búsqueda de Google en el navegador, y para eso sería suficiente con construir la query de búsqueda de Google y abrir la url en el navegador...

Código (vbnet) [Seleccionar]
Dim uriBuilder As New UriBuilder With {
   .Scheme = "https",
   .Host = "www.google.com",
   .Path = "search",
   .Query = HttpUtility.ParseQueryString("lr=lang_en&q=Hello World", Encoding.UTF8).ToString()
}

WebBrowser1.Navigate(uriBuilder.Uri)


O expresado de forma más simple: https://www.google.com/search?lr=lang_en&q=Hello+World

Tan simple como eso.




De todas formas, y en caso de que por alguna razón que no hayas mencionado realmente necesites automatizar el navegador, en ese caso no necesitas dependencias externas como Selenium o iMacros. Eso es un overkill para lo que pretendes hacer. Es suficiente con lo siguiente:

Código (vbnet) [Seleccionar]
Dim doc As HtmlDocument = WebBrowser1.Document
Dim searchForm As HtmlElement = doc.Forms(0)
Dim queryTextBox As HtmlElement = doc.GetElementById("q")

queryTextBox.SetAttribute("value", "Hello World")
searchForm.InvokeMember("submit")


Nota: el código lo insertarías en el evento DocumentCompleted de la instancia del componente WebBrowser, por ejemplo.

Saludos.








rigorvzla

esto me ha gustado elektro  y bueno en realidad lo necesito para loguear por ejemplo una cuenta ya sea de correo electronico twitter , o cualquier otra pagina web.

coloque google como ejemplo pero al parecer fue muy simple para el problema planteado jeje, por ejemplo  probe el selenium antes de ver tu respuesta y resulto lo que queria con google, mas si de otra manera es posible, seria muy interesante saber, y no eh probado aun con hotmail  por ejemploo twitter o gmail

Eleкtro

#7
Cita de: rigorvzla en 23 Mayo 2019, 15:45 PM
probe el selenium antes de ver tu respuesta y resulto lo que queria con google, mas si de otra manera es posible, seria muy interesante saber

Te acabo de mostrar como sería la forma de hacerlo sin Selenium.

En caso de que te estés refiriendo a lo de loguearte, entonces te respondo en la siguiente cita...




Cita de: rigorvzla en 23 Mayo 2019, 15:45 PM
en realidad lo necesito para loguear por ejemplo una cuenta ya sea de correo electronico twitter , o cualquier otra pagina web.

De nuevo eso me resulta otro mal planteamiento.

A ver, escúchame bien, por que no se si no lo entiendes, o lo entiendes pero te da igual. El caso es que, siempre y cuando tu NO TENGAS NECESIDAD/PROPÓSITO REAL de abrir el navegador y mostrarle al usuario lo que haces en él, entonces no lo hagas. Es simple, NO PIENSES EN HACERLO ASÍ, por que es una manera innecesaria (y mediocre) de hacer las cosas.

La automatización de navegadores por lo general se usa para fines de pruebas en páginas web. Igual que la tecnología Coded-UI se usa para automatizar aplicaciones con fines de depuración visual.

Otra cosa distinta es que hayan personas y/o programadores que, por no tener conocimiento (o las ganas) de como hacer las cosas de forma apropiada, como sería por ejemplo efectuar una búsqueda en Google, o loguearse en X página, pues recurren a algún framework de automatización como Selenium por que es capaz de hacer estas cosas de forma simple y sencilla. Pero ya te digo, ES INNECESARIO (y cutre, insisto). Donde si que te lo aceptaría, es si estuviesemos hablando de una necesidad real de automatizar, visualmente/interactivamente hablando, un navegador.

¿Quieres hacer las cosas de forma óptima/apropiada, o prefieres quedarte con lo primero que pillas y que ves que te es sencillo y simple de usar?. Tu decides, pero yo solo te diré que para loguearte en un sitio web no necesitas automatizar el navegador para hacer click en "el botón de login". Lo que necesitas es llevar a cabo una petición POST, y hacer uso de cookies. Nada más. Y si quieres algo realmente sencillo entonces puedes usar la clase WebClient, eso sí, despues de haberle implementado el manejo de cookies como en el siguiente ejemplo que te muestro a continuación, el cual es un código extraido de mi librería comercial DevCase for .NET Framework:

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : ElektroStudios
' Modified : 28-February-2018
' ***********************************************************************

#Region " Public Members Summary "

#Region " Constructors "

' New()

#End Region

#Region " Properties "

' CookiesEnabled As Boolean
' Cookies As CookieContainer
' Timeout As Integer

#End Region

#End Region

#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System.ComponentModel
Imports System.Drawing
Imports System.Net
Imports System.Runtime.InteropServices

#End Region

#Region " DevWebClient "

Namespace DevCase.Core.NET

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' A extended <see cref="WebClient"/> component, with support for cookies and requests timeout.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Original idea taken from: http://www.codingvision.net/tips-and-tricks/c-webclient-with-cookies
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   <DisplayName(NameOf(DevWebClient))>
   <Description("A extended WebClient component, with support for cookies and requests timeout.")>
   <DesignTimeVisible(False)>
   <DesignerCategory(NameOf(DesignerCategoryAttribute.Component))>
   <ToolboxBitmap(GetType(Component), "Component.bmp")>
   <ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow)>
   <ComVisible(True)>
   Public Class DevWebClient : Inherits WebClient

#Region " Properties "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets or sets a value indicating whether cookies are enabled.
       ''' <para></para>
       ''' Default value is <see langword="False"/>.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' <see langword="True"/> if cookies are enabled; otherwise, <see langword="False"/>.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public Property CookiesEnabled As Boolean

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets or sets the cookies associated with this <see cref="DevWebClient"/>.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The cookies associated with this <see cref="DevWebClient"/>.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public Property Cookies As CookieContainer

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets or sets the time interval, in milliseconds, until the
       ''' requests made by this <see cref="DevWebClient"/> times out.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The time interval, in milliseconds, until the
       ''' requests made by this <see cref="DevWebClient"/> times out,
       ''' or <see cref="Global.System.Threading.Timeout.Infinite"/> to indicate that the
       ''' request does not time out.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public Property Timeout As Integer = Global.System.Threading.Timeout.Infinite

#End Region

#Region " Constructors "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Initializes a new instance of the <see cref="DevWebClient"/> class.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Sub New()
           Me.Cookies = New CookieContainer()
       End Sub

#End Region

#Region " Protected Methods "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Returns a <see cref="WebRequest"/> object for the specified resource.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="address">
       ''' A <see cref="Uri"/> that identifies the resource to request.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' A new <see cref="WebRequest"/> object for the specified resource.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------
       Protected Overrides Function GetWebRequest(ByVal address As Uri) As WebRequest

           Dim request As WebRequest = MyBase.GetWebRequest(address)
           request.Timeout = Me.Timeout

           If (Me.CookiesEnabled) AndAlso (TypeOf request Is HttpWebRequest) Then
               DirectCast(request, HttpWebRequest).CookieContainer = Me.Cookies
           End If

           Return request

       End Function

#End Region

   End Class

End Namespace

#End Region


Un ejemplo para loguearse en el foro de elhacker.net:
Código (vbnet) [Seleccionar]
Dim uri As New Uri("https://foro.elhacker.net/index.php?action=login2", UriKind.Absolute)
Dim cred As New NetworkCredential("NOMBRE", "CONTRASEÑA")
Dim query As String = HttpUtility.ParseQueryString($"cookielength=90&user={cred.UserName}&passwrd={cred.Password}").ToString()

Using client As New DevWebClient() With {.CookiesEnabled = True}
   client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")

   Dim response As String = client.UploadString(uri, "POST", query)
   Console.WriteLine(response)
End Using


La alternativa practicamente equivalente, sería el uso de la clase HttpWebRequest / WebRequest.




Cita de: rigorvzla en 23 Mayo 2019, 15:45 PM
y no eh probado aun con hotmail  por ejemploo twitter o gmail

Los servicios más populares proveen una API / librería para .NET Framework, como son casi todos los servicios de Google, y los de Microsoft, incluyendo Outlook / Live. Los de Twitter no tengo ni idea por que nunca he usado esa plataforma...

Así que para loguearte en Gmail y Hotmail es suficiente con usar las librerías para .NET framework de Google y de Microsoft, con los que se puede administrar e-mails y contactos de forma automatizada. Puedes hacer lo que desees, sin tener que lidiar visualmente con la interfaz de un navegador para automatizarlo...

Cabe mencionar que en el caso de Google, algunos servicios son de pago.

PD: por si te lo estás preguntando, si, tengo implementados clientes para loguearse en Live/Hotmail, Gmail y Youtube usando las librerías oficiales para .NET, capaces de llevar a cabo diversas operaciones útiles. Pero eso ya no lo voy a compartir de gratis, que al final nadie me comprará mi duro trabajo. xD

Saludos.








rigorvzla

ELEKTROOO!!! fantastico hombre y no lo habia hecho , no por q me daba igual, es q no lo entiendo (no es q entienda al 100 el codigo q dejastes) pero lo veo un poco mas claro, si entiendo tu punto y es muy cierto y claro, gracias que cone sto ya tengo madera para cortar.

Gracias!!

Una pregunta es posible que mi planteamiento est mal, pero lo q quiero lograr es , crear una aplicacion donde igrese el correo la contraseña y abra el explorador mostrandome la bandeja de entrada.

Basandome en esto use selenium aparte que fue lo unico que encontre y me recomendaron para lograr mi cometido, por otro lado quede a la espera de una solucion diferente y aqui tu gran explicacion. que no es necesario tal cosa, buscare una web para convertir tu codigo a wpf C# y me pondre a estudiar todo lo que explicastes gracias como siempre dando en el clavo. jeje

Eleкtro

#9
Cita de: rigorvzla en 24 Mayo 2019, 01:37 AM
Una pregunta es posible que mi planteamiento est mal, pero lo q quiero lograr es , crear una aplicacion donde igrese el correo la contraseña y abra el explorador mostrandome la bandeja de entrada.

Asumiré que hablas de live.com o gmail. ¿Pero te refieres a que el usuario inserte su mail y contraseña en alguna caja de texto de la UI de tu programa?. ¿Y por que no simplemente abrir la página de login en el navegador y dejar que el usuario introduzca allí sus datos de login?. ¿Por que complicar este paso?, si el usuario va a tener que escribir el nombre y contraseña de cualquiera de las dos formas, solo que con una te complicarías la vida automatizando el navegador para rellenar el form de login, y con la otra no.

Como ya mencioné, para iniciar sesión en gmail o microsoft live/hotmail con la intención de llevar a cabo operaciones en segundo plano, sin renderizar visualmente nada en el navegador, lo más conveniente es usar la API oficial para .NET framework.

Pero para lo que tu quieres hacer, es suficiente con usar un webbrowser. La idea sería dejar que el usuario rellene el form de login en el webbrowser la primera vez, y en los próximos reinicios de la aplicacion no haya necesidad de volver a rellenar dicho form. ¿O no te sirve así para lo que pretendas hacer?.

Aquí tienes un ejemplo en C# y con una implementación similar a la clase WebClient que te mostré en VB.NET:

Saludos.