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 as IHTMLInputElement;
result.Add(input.name);
end
else if field.tagName = 'SELECT' then
begin
select := field as IHTMLSelectElement;
result.Add(select.name);
end
else if field.tagName = 'TEXTAREA' then
begin
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); 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.