Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   automatización con webbrowser (https://www.clubdelphi.com/foros/showthread.php?t=82774)

Perenquen 12-04-2013 12:45:04

automatización con webbrowser
 
Buenas a todos estoy intentando automatizar la descarga de algunos ficheros de un banco y para ello necesito rellenar los datos de distintos formularios

Por ahora conseguí hacer login como usuario pero para acceder a algunos campos estoy teniendo problemas. No se si es porque son componentes que están dentro de frames que a su vez estan dentro de frames.

Voy a poner un ejemplo que creo que así me aclararé mejor

En esta página para pulsar en el botón "buscar" utilizo en siguiente procedimiento (nombre := 'Buscar')

Código Delphi [-]
procedure TForm1.Clickar_boton(nombre : string);
var
  ovElements: OleVariant;
  i: Integer;
begin
  ovElements := WebBrowser1.OleObject.Document.forms.item(0).elements;
  for i := 0 to (ovElements.Length - 1) do
    begin
    if (ovElements.item(i).tagName = 'INPUT') and (ovElements.item(i).type = 'submit') and (ovElements.item(i).Value = nombre)  then
      begin
        ovElements.item(i).Click; 
      end;
    end;

end;

el valor "buscar" se puede obtener desde un navegador inspeccionando el elemento
<input type="submit" class="btnSearch" id="btnheadSearch" name="btnheadSearch" value="Buscar">

o bien mediante esta función que devuelve los componentes del webbrowser (aunque por lo que se ve no todos)

Código Delphi [-]
function TForm1.Obtener_componentes(ID : integer) : TstringList;
  function Get_FormByNumber(document: IHTMLDocument2;
    formNumber: integer): IHTMLFormElement;
  var
    forms: IHTMLElementCollection;
  begin
    forms := document.Forms as IHTMLElementCollection;
    if formNumber < forms.Length then
      result := forms.Item(formNumber,'') as IHTMLFormElement
    else
      result := nil;
  end;

  function Get_FormFieldNames(fromForm: IHTMLFormElement): TStringList;
  var
    index: integer;
    field: IHTMLElement;
    input: IHTMLInputElement;
    select: IHTMLSelectElement;
    text: IHTMLTextAreaElement;
  begin
    result := TStringList.Create;
    for index := 0 to fromForm.length do
    begin
      field := fromForm.Item(index,'') as IHTMLElement;
      if Assigned(field) then
      begin
        if field.tagName = 'INPUT' then
        begin
          // Input field.
          input := field as IHTMLInputElement;
          result.Add(input.name);
        end
        else if field.tagName = 'SELECT' then
        begin
          // Select field.
          select := field as IHTMLSelectElement;
          result.Add(select.name);
        end
        else if field.tagName = 'TEXTAREA' then
        begin
          // TextArea field.
          text := field as IHTMLTextAreaElement;
          result.Add(text.name);
        end;
      end;
    end;
  end;
var
  theForm: IHTMLFormElement;
  document: IHTMLDocument2;
  campos : TstringList;
begin
  campos := TStringList.create;
  document := WebBrowser1.Document as IHTMLDocument2;
  theForm := Get_FormByNumber(document,ID); // ID := 0 es el frame que contiene tanto el campo como el boton para buscar
  campos := Get_FormFieldNames(theForm);
  Freeandnil(Campos);
end;

Como dije hasta aquí todo parece ir bien. El problema lo tengo cuando intento acceder por ejemplo al botón "Entrar" del frame "formlogin" con ID 1
El botón se llama "Entrar" como se ve en el navegador
<input type="submit" id="txtAccess" name="txtAccess" class="generalBtn" value="Entrar">

Pero la función Obtener_componentes(ID : integer) con ID = 1 (ni con ninguno de los 5 valores posibles) me devuelve este componente, por lo que no puedo hacer click sobre él

Alguien me podría traer un poco de luz al dilema. El valor "entrar" no me aparece por ningún lado cuando recorro todos los frames del webbrowser y no se si es porque tendría que hacerlo recursivamente por si está dentro de otro frame.

Un saludo y gracias por leer el post, que al final me salió medio tocho.

Ñuño Martínez 12-04-2013 15:29:24

Quizá si te pones en contacto con el banco, te puedan facilitar un protocolo o un servicio web para hacer el trabajo. Muchos de ellos (no sé si todos) permiten la obtención de todo tipo de archivos e información de forma directa por web (tanto http como ftp y otros), que puedes acceder mediante los controladores de comunicación por red (como Indy y similares) de forma mucho menos problemática que con un TWebbrowser.

velario 14-04-2013 08:48:23

Hola, yo tambien estoy trabajando en algo relacionado con la automatizacion por web y tambien me encontre con muchos problemas, al final me cree una unit con las funciones necesarias para simplificarme las cosas.
En particular tu problema creo que radica en que deberias recorrer con un for todos los "FORM" que contiene la pagina para asegurarte de que lo encuentras en algun lado.
Te dejo una de las funciones que hice a ver si te vale tal cual o por lo menos el codigo te aclara algo.

Código Delphi [-]
function clickonvalue(value_: string; web: TWebbrowser): Boolean;
var
  Item: Variant;
  I, j: Integer;
begin
  Result := False;
  if web.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Result := False;
    Exit;
  end;
  for I := 0 to web.OleObject.Document.forms.Length - 1 do
  begin
    Item := web.OleObject.Document.forms.Item(I);
    for j := 0 to Item.Length - 1 do
    begin
      try
        if Item.Item(j).Value = value_ then
        begin
          Item.Item(j).Click;
          Result := True;
          Exit;
        end;
      except
        Result := False;
        Exit;
      end;
    end;
  end;
end;

Saludos.

Perenquen 23-04-2013 11:59:22

Muchas gracias a los dos por las respuestas.

Con respecto al banco ya hablé con el departamento al cargo y me comentaron que no tenían ningún servicio web para descargar los movimientos del día, aunque tampoco los noté muy convencidos :confused:

Gracias por la función Velario, la pruebo esta semana, que estoy un poco liado y te comento que tal me fué.

De nuevo gracias a los dos y un saludo.

Ñuño Martínez 23-04-2013 13:40:47

Cita:

Empezado por Perenquen (Mensaje 459108)
Muchas gracias a los dos por las respuestas.

Con respecto al banco ya hablé con el departamento al cargo y me comentaron que no tenían ningún servicio web para descargar los movimientos del día, aunque tampoco los noté muy convencidos :confused:

Pues ojalá que tu pregunta haga que a alguien se le ocurra que es buena idea y lo implementen...


La franja horaria es GMT +2. Ahora son las 13:58:45.

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