Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2016
fqm33 fqm33 is offline
Miembro
NULL
 
Registrado: ago 2016
Posts: 18
Poder: 0
fqm33 Va por buen camino
Buenas Noches, compañeros, gracias por las respuestas, Bucanero tienes razón, lo que estoy tratando de crear es muy parecido, a lo que indicas, con alguna modificación muy pequeña (no se que tanto en código), que cuando lleno la información del formulario WEB desde Excel, el sistema verifica la información y me arroja un dato, que debo cargar al registro de Excel, y así con cada fila, y claro bucanero estoy muy interesado en tu asesoría y en la de todos, aunque tengo muchos vacíos, he aprendido un montón con sus comentarios.
como indicaba anteriormente estoy usando WebBrowser, y ahora estoy en la selección de una opción de un combobox, aquí el código HTML.

[HTML]
</td>
<td class="fila1">
<select name="ctl00$ph$ucProds$ddlClasificacion" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ph$ucProds$ddlClasificacion\',\'\')', 0)" id="ctl00_ph_ucProds_ddlClasificacion" tabindex="2" class="comboBox";">
<option selected="selected" value="">&lt;&lt;Seleccione&gt;&gt;</option>
<option value="29">Activa1</option>
<option value="27">Activa2</option>
<option value="28">Activa3</option>

</select>
</td>
[/HTML]

he tratado de usar varias(muchas) alternativas para escogerla pero ninguna me funciona, anexo una que cuando doy click dice metodo no soportado, sin embargo otras sacan otros tipos de error.
esta y las demás las he encontrado navegando por ahi,

Código Delphi [-]
WebBrowser1.Oleobject.Document.GetElementByID('ctl00$ph$ucProds$ddlClasificacion').GetElementsByTagN  ame('Option').element.GetAttribute('28').Click;

agradecería un ejemplo de como realizar la selección, o una forma mas optima y/o técnica de realizarlo, de nuevo muchas gracias.
Responder Con Cita
  #2  
Antiguo 30-09-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Yo no he usado el TWebBrowser, no al menos para algo como lo que pretendes hacer.

Yo no buscaría simular/emular las acciones por medio del Browser como si fuera un usuario... Al menos eso es lo que me queda y entiendo que estás intentando hacer. De lo que estoy percibiendo, pareciera, por ese código que estás intentando ejecutar un Click sobre una lista desplegable por medio del TWebBrowser.

Yo, como te dije, buscaría la forma de hacerlo por otra vía. Le pediría a la página que directamente me de los datos, y le pasaría los parámetros finales. No me tomaría la "molestia" de simular clics, seleccionar opciones, etc. Directamente le solicito al server lo que necesito y que el se encargue de generarme la página HTML final para que yo lea y guarde en mi archivo de excel, una base de datos, o lo que fuese lo que realmente necesito poder recuperar y tener de manera persistente.

Nota que todo con lo que interactúes se traduce en última en un valor que el escript php/asp se encargará de recibir por medio de un parámetro.

Necesariamente debe haber un trabajo de ingeniería inversa y ponerte a estudiar como es que recibe los datos.
Como te dije unos post antes... una selección por ejemplo desde una lista desplegable se traducirá en un valor que luego la página recibe como parámetro. De igual forma lo que le pongas en algún Edit/Caja de texto o como le llames. Al final todo se traduce en una orden POST o GET sobre la página y se le pasará los parámetros.
Empieza a hacer ese trabajo de ingeniería... prueba con cada opción, y fíjate que se le manda como parámetro, y como se construye la URL final.
Si no tienes idea de como hacer eso ¡dilo!

Luego simplemente lo que debes hacer es pedirle al componente Indy o el TWebBrowser que navege a esa URL. ¡Te evitas estar jugando la página! Directamente decile: "Mirá, dame esto". Y si el proceso implica interactuar con 2 o 3 páginas, no importa... cada una estará diseñada justamente para recibir los parámetros que espera. Lo que tu debes hacer es navegar en el orden correcto cada una y recuperar del HTML generado lo que necesites.

A lo que voy es que si no te tomas la molestia de hacer la ingeniería inversa vas a seguir lidiando con clicks, que navegar, esperar respuesta, volver a mandar otro click, etc.

Mi propuesta es justamente evitarte eso: ir a los bifes. Si tu proceso te lleva a lidiar con 3 o 5 páginas, no interesa. A todas les debes revisar como y que se pasan como parámetro.

Te estás complicando al pedo, y te lo digo con todo respeto. Y para poder ayudarte mucho más vas a tener que dejar de lado ese estado de secretismo. No hay otra forma de saber que estas haciendo realmente, si lo estás haciendo bien, o que... Ayúdanos a ayudarte. De otra forma seguirás lidiando y dando vueltas en lo mismo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 30-09-2016
fqm33 fqm33 is offline
Miembro
NULL
 
Registrado: ago 2016
Posts: 18
Poder: 0
fqm33 Va por buen camino
Buenas Noches, Delphius tomo nota de tus comentarios gracias, pues lo que dices es precisamente lo que estoy haciendo (simulando acciones), cuando dices ingeniería inversa es mirar el código HTML?; les comento lo que he ido haciendo:
- abro la pagina (webbrowser)
- ingreso el usuario - Webbrowser1.OleObject.Document.GetElementByID('ctl00$ContentPlaceHolder1$txtUserIni').SetAttribute(' value', 'ECM1112A');
- me abre la pagina de la contraseña
- ingreso la contraseña que genera el token
- me abre la pagina del menú principal - escojo la opción del menú (href)

Código Delphi [-]
  link := WebBrowser1.OleObject.Document.GetElementsByTagName('a');
  for i := 0 To Link.length -1 do
    if pos('/ACTIVACIONES/Http/Reingenieria/pagDispatcherEntrada.asp?Site=14',Link.item(i).href) <> 0 then
    Begin
      Link.item(i).Click;
      Sleep(100);
    End;

- me abre la pagina del ingreso de datos (hay es donde aparece el combobox del que les hablo) - hay voy.

como lo he hecho

miro el código fuente de cada pagina y asigno los clicks, que he ido necesitando, llenado los campos solicitados, y avanzando a los href correspondientes. Ahora he llegado a la pagina donde ingreso los
datos, dependiendo de la opción que seleccione, aparecen otros campos para llenar, y cuando acabo de llenar los campos se da click en un botón y el arroja el dato que necesito llevar a mi hoja de Excel.
No es ningún gran secreto (ja ja ja), es solo un aplicación para la empresa donde trabajo. tienes razón en que no tengo idea; Delphius dices que simular las acciones como si fuera un usuario,
y es que esa es la situación, a la empresa donde trabajo le asignan un usuario, y la contraseña se nos da por medio de un token. Ademas dices que esa no es vía - y creo que tienes razón, - pues te
comento por esta vía voy a pasos muy lentos, pero por las Indy que tu me recomendaste (y que la mayoría recomiendan), pues no encontré información básica como para ir aprendiendo y aplicando.
Agradezco sus orientaciones, y muchas gracias por tomarsen el trabajo de leer, analizar mis notas y apoyarmen.
Responder Con Cita
  #4  
Antiguo 30-09-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Ahora estoy por ir a dormir. Explicarte en profundidad el concepto de ingeniería inversa para este caso no me es posible ahora.
Si puedo darme un tiempo mañana por la tarde explico mejor el tema.
Y si en Delphi Starter está disponible Indy (no recuerdo ahora con seguridad si esta disponible) veo la posibilidad de dar un ejemplo básico para que te hagas una idea y extrapoles a tu caso.
Por lo pronto puedo decir que la idea es examinar con las herramientas para desarrolladores de los navegadores como se pasan los datos a los parámetros y de ir probando con la página hasta encontrar el dato en cuestion y de donde sale.
Si dices que todo depende de un token y una contraseña desde algún lado ese dato les he entregado. Si no es por medio o difundido desde el propio sitio, o bien haces que ese dato sea llenado por el usuario o le preguntas a él de donde lo saca y ves si hay forma de automatizarlo.
La ultima lección que te dejo es que no todo se puede (ni debiera) automatizar.

Saludos
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 05-10-2016
fqm33 fqm33 is offline
Miembro
NULL
 
Registrado: ago 2016
Posts: 18
Poder: 0
fqm33 Va por buen camino
buenas noches, compañeros, les comento que ya supere lo del combobox, y ya pude escoger la opción, encontré este código, y me ha funcionado bien,

Código Delphi [-]
  cb := WebBrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucProds$ddlClasificacion');
  cb.value := '28';
  cb.FireEvent('onchange', v);

luego de esto viene el ciclo donde debo llenar los campos de la web, y traer lo que esta me arroja
inicialmente encuentro un input text, que corresponde al apellido del cliente; he tratado de llenarlo con este código
Código Delphi [-]
Webbrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').SetAttribute('value', 'rojas');
pero me saca error de violación de memoria, he aumentado el Sleep, pero sigue saliendo el mismo error, lo he probado con este otro pero me saca error metodo value no soportado

Código Delphi [-]
Webbrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').value, 'rojas');

Nota: lo de 'rojas', es por que estoy probando pero mas adelante debo asignarle el valor de la celda correspondiente
Responder Con Cita
  #6  
Antiguo 10-10-2016
fqm33 fqm33 is offline
Miembro
NULL
 
Registrado: ago 2016
Posts: 18
Poder: 0
fqm33 Va por buen camino
Compañeros buenas noches; estoy en el mismo problema que les plantea de entrar el dato del apellido y lo he podido solucionar a medias, con el siguiente código
Código Delphi [-]
 WebBrowser1.OleObject.Document.GetElementByID('ctl00$ph$ucFields$tbLastName').Value := Edit3.Text;
, sin embargo sucede algo muy curioso (al menos para mi), si le pongo un
Showmessage, antes de la orden funciona pero si lo quito me sigue sacando error de violación de memoria, alguien me podría ayudar con esto, pues le he dado muchas vueltas y nada que le encuentro la solución, he pensado en automatizar el click sobre el boton del ShowMessage pero no se si se pueda hacer, he buscado pero no he encontrado información al respecto. de nuevo muchas gracias.
Responder Con Cita
  #7  
Antiguo 15-10-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
He tratado de darme el tiempo para prepararte una especie de tutorial guiado de como proceder a realizar el proceso de ingeniería inversa. Pero tengo un par de trabajos que requieren de prioridad.
No estoy seguro de si es efectivamente los ids y names que tu mencionas pero es probable que si. Si es así, ya tienes la mitad hecho.

En pocas líneas el proceso de ingeniería inversa es examinar tanto el HTML e interpretarlo como examinar los parámetros que se esperan en cada página. Del HTML se trata de buscar aquellos elementos/datos que sirven tanto para mostrar al usuario, guardar en una base de datos, como así también los que serán de utilidad para saber que data y/o parámetros pasar a las páginas web para repetir o continuar con el trabajo.

Cuando se llega a la página final en tu caso (ya que debes interactuar con una serie de páginas, en cierto orden) lo que debes hacer es ir leyendo el HTML y extraer de éste lo que necesitas para pasar a tu archivo de excel. Estudia ese HTML, y si observas con atención muy posiblemente notes un patrón. Por ejemplo, digamos que el monto total de una factura se muestra en un tag p (tag de párrafo) que está en la línea 25, o que el detalle de la factura empieza en la línea 27 y el fin del detalle se detecta cuando se llega a una línea que tiene el tag de fin de tabla.
Teniendo eso como base simplemente lo que necesitas es pasar el HTML a un TStrings y proceder a leer las líneas y dentro de ésta en la "columna" adecuada. Para ello puedes ayudarte de funciones como Pos(), Copy() y demás funciones de tratamiento de strings. Es decir "leer" de cada líneas del HTML de interés el texto que necesitas y ahí ya pasarlo al excel.

Todo ese estudio previo es la ingeniería inversa. Y como he dicho y hasta incluso he comentado en otro hilo se puede evitar lidiar mucho si pasas a cada URL los parámetros adecuados. Si el proceso es tal que de pagina1 vas a pagina2 y así hasta paginaN. Debes hacer esto por cada pagina. La cosa se hace más sencilla si resulta ser que los elementos a buscar son siempre lo mismos y en la misma cantidad. Por ejemplo: digamos que pagina2 requiere como parámetro el tipo de DNI y el número. Es muy poco probable que la lista o combo para seleccionar el tipo de DNI se genere de forma dinámica (es decir, cada vez que se visita la página y desde el lado del server) y que cambie en cada visita. Lo de esperar es que esta lista sea fija. Entonces a esta página no necesitas hacerle reingeniería en cada ejecución. Si ya sabes que pasarle directamente se lo pasas al parámetro y ya está.
Distinto es cuando el contenido HTML de interés es totalmente dinámico y cambiante. Por ejemplo: la cantidad de items o artículos vendido de una factura. Para estos tipos de páginas vas a tener que leer cada vez el HTML y posicionarte en el lugar adecuado... Lo duro acá es estudiar el HTML para descubrir el "patrón". Cuando lo descifras, ya es cosa de implementar un algoritmo que sepa detectar la cantidad de items, etc.
Por ejemplo digamos que cuando la factura tiene un único item el HTML tiene 46 líneas. Entonces, si al leer el HTML generado observo que Count dice 79 es porque hay 33 items. Ya se la cantidad, y hasta incluso desde que línea a línea.

Es un trabajo tedioso hacer ese estudio, pero te garantiza de que vas a grano. Lees solamente lo que necesitas. No hay que estar interactuando con la página, nada de GetElementByID() o cosas así que demoran su tiempo. Estudia el "patrón" a cada página. Visitas la página, guardas el HTML de forma temporal y te vas a cada lugar clave.

Aquí hago una buena advertencia: el contenido HTML leído depende fuertemente del componente utilizado. Navegadores como FireFox y Chrome van a tratar de generarte el HTML completo y cumpliendo lo mejor posible el estándar. Distinto es si usas el componente Indy por ejemplo: éste recibe el HTML crudo, el que será producido por el server... y con las posibles pifias que pudiera haber cometido el desarrollor web al momento de programar el script.
Por tanto el HTML que leas y veas en un navegador no necesariamente va a ser el mismo del que puedas extraer desde el componente.

Sobre los parámetros que se necesiten en cada página ya he comentado: utiliza las herramientas que ofrecen Chrome o FireFox. Por ejemplo en FF: vas al Menú Desarrollador -> Red. En el Monitor de Red ve a la pestaña de Métodos y busca un GET sobre la URL con los parámetros. Seleccionalo. Ahora al costado derecho tienes la información exacta de la URL decodificada, los parámetros y sus valores.
Por ejemplo, visita el foros Varios de ClubDelphi. Si "auditas" la página notarás que detectará un único parámetro con el nombre f y el valor es 11. De esta forma podemos irnos a visitar cualquier foro de CD, si conocemos el "id" de cada uno simplemente con ir a la URL: http://clubdelphi.com/foros/forumdisplay.php?f=<ID>

¿De donde podemos sacar esos ID? Que te parece si examinamos la página principal: http://clubdelphi.com/foros/index.php. Dando una explorada al HTML encuentro que cada foro está listado así:


<div> <a href="forumdisplay.php?f=el id"><strong>Nombre del Foro</strong></a> <span class="smallfont">(42 Viendo)</span> </div>
Entonces, como se que es poco probable que estén poniendo y sacando foros, la cantidad es conocida. Es un trabajo de una única vez. Por caso, viendo el HTML puedo decir que Varios está en la línea 691.
SI quiero ir más lejos, y quiero hacer un sistema que me diga los últimos hilos de cada foro y el usuario que ha comentado también puedo hacerlo. Ahora el planteo es dinámico, el truco está en localizar el inicio y fin del tag tr que define la fila. En cada fila tengo separado en tag td el foro, el url e id del hilo, el usario, etc.

Espero que se entienda.
Si no sabes aunque sea lo mínimo de HTML, haz una pausa y aprendelo. Luego vuelve y empieza de nuevo con el sistema.
Más no puedo decir... sino ya es hacerte el trabajo. ¡Ya te he comentado todas las pistas y detalles! Y la verdad para serte franco, si no puedes lidiar con todo lo que dije, es que con todo respeto: no estás a la altura del trabajo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Enviar información a aplicación Delphi desde PHP elpichi Internet 3 10-05-2015 19:06:42
Enviar Datos a pagina web desde delphi tocomi Internet 3 18-02-2009 23:02:59
Problemas para enviar un mensaje desde una página web selman .NET 0 02-06-2007 00:18:58
Usar Post para enviar información a otra página halizia PHP 3 20-12-2006 14:55:12
enviar instruccion de =SUM desde delphi 5 a excel mayte mtz Varios 2 06-12-2006 16:52:28


La franja horaria es GMT +2. Ahora son las 17:12:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi