Fórum Preencher Cmpo automaticamente WebBrowser #329006

09/09/2006

0

Caros Amigos

Estou tentanto preencher o campo CNPJ do site:
http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1

Acontece que testei o fonte em outros sites e o preenchimento acontece.
a rotina nao esta funcionando somente no site da receita por favor analisem o fonte e caso tenha algum erro por favor me ajudem
desde ja agradeço.



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Label1: TLabel;
Button1: TButton;
procedure WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
i, j: Integer;
FormItem: Variant;
begin
Result := False;
//no form on document
if WebBrowser.OleObject.Document.all.tags(´FORM´).Length = 0 then
begin
Exit;
end;
//count forms on document
for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
begin
FormItem := WebBrowser.OleObject.Document.forms.Item(I);
for j := 0 to FormItem.Length - 1 do
begin
try
//when the fieldname is found, try to fill out
if FormItem.Item(j).Name = FieldName then
begin
FormItem.Item(j).Value := Value;
Result := True;
end;
except
Exit;
end;
end;
end;
end;



procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
if FillForm(WebBrowser1, ´NI´, ´05.247.421/0001-35´) = False then
ShowMessage(´Erro. Campo não disponível.´);
end;

procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
if ProgressMax = 0 then
begin
label1.Caption := ´´;
Exit;
end;
try
if (Progress <> -1) and (Progress <= ProgressMax) then
label1.Caption := IntToStr((Progress * 100) div ProgressMax) + ´¬ loaded...´
else
label1.Caption := ´´;
except
on EDivByZero do Exit;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Webbrowser1.Navigate(´http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1´);
// Show the Titel of the currently active Webpage in the titlebar
// Den Titel der aktuellen Webseite in der Titeleiste anzeigen
end;

end.


Eme_matos

Eme_matos

Responder

Posts

09/09/2006

Eme_matos

Caros Amigos Estou tentanto preencher o campo CNPJ do site: http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1 Acontece que testei o fonte em outros sites e o preenchimento acontece. a rotina nao esta funcionando somente no site da receita por favor analisem o fonte e caso tenha algum erro por favor me ajudem desde ja agradeço. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls; type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Label1: TLabel; Button1: TButton; procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); procedure WebBrowser1ProgressChange(Sender: TObject; Progress, ProgressMax: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean; var i, j: Integer; FormItem: Variant; begin Result := False; //no form on document if WebBrowser.OleObject.Document.all.tags(´FORM´).Length = 0 then begin Exit; end; //count forms on document for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); for j := 0 to FormItem.Length - 1 do begin try //when the fieldname is found, try to fill out if FormItem.Item(j).Name = FieldName then begin FormItem.Item(j).Value := Value; Result := True; end; except Exit; end; end; end; end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin if FillForm(WebBrowser1, ´NI´, ´05.247.421/0001-35´) = False then ShowMessage(´Erro. Campo não disponível.´); end; procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress, ProgressMax: Integer); begin if ProgressMax = 0 then begin label1.Caption := ´´; Exit; end; try if (Progress <> -1) and (Progress <= ProgressMax) then label1.Caption := IntToStr((Progress * 100) div ProgressMax) + ´¬ loaded...´ else label1.Caption := ´´; except on EDivByZero do Exit; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Webbrowser1.Navigate(´http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1´); // Show the Titel of the currently active Webpage in the titlebar // Den Titel der aktuellen Webseite in der Titeleiste anzeigen end; end.


acho que consegui resolver o problema no preenchimento do campo, porem esta ocorrendo o seguinte:

a rotina preenche os dois campos o campo CNPJ e o campo caracteres de verificação. Por favor me auxilie a resolver o erro

segue abaixo o fonte:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, MSHTML, StdCtrls;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

function ExecuteScript(doc: IHTMLDocument2; script: string; language: string): Boolean;
var
win: IHTMLWindow2;
Olelanguage: Olevariant;
begin
if doc <> nil then
begin
try
win := doc.parentWindow;
if win <> nil then
begin
try
Olelanguage := language;
win.ExecScript(script, Olelanguage);
finally
win := nil;
end;
end;
finally
doc := nil;
end;
end;
end;


procedure FillInGMXForms(WB: ShDocVW.IWebbrowser2; IDoc1: IHTMLDocument2;
Document: Variant; P_CNPJ : string);
const
IEFields: array[1..2] of string = (´INPUT´, ´text´);
var
IEFieldsCounter: Integer;
i: Integer;
m: Integer;
ovElements: OleVariant;
begin
if Pos(´Receita Fazendaria´, Document.Title) <> 0 then

while WB.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;

// contar os elementos e interagir por suas formas
IEFieldsCounter := 0;
for m := 0 to Document.forms.Length - 1 do
begin
ovElements := Document.forms.Item(m).elements;

// interagir por elemento
for i := ovElements.Length - 1 downto 0 do
begin
try
// preencher os campos
if (ovElements.item(i).tagName = IEFields[1]) and
(ovElements.item(i).type = IEFields[2]) then
begin
ovElements.item(i).Value := P_CNPJ;
Inc(IEFieldsCounter);
end;
except
// falha...
end;
end; { for i...}
end;
// se o campo estiver preenchido.
if IEFieldsCounter = 3 then ExecuteScript(iDoc1, ´document.login.submit()´,
´JavaScript´);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
IDoc1: IHTMLDocument2;
Web: ShDocVW.IWebBrowser2;
begin
Webbrowser1.Navigate(´http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1´);
while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
Webbrowser1.Document.QueryInterface(IHTMLDocument2, iDoc1);
Web := WebBrowser1.ControlInterface;
FillInGMXForms(Web, iDoc1, Webbrowser1.Document, ´05.247.421/0001-35´);
end;
end.


Responder

Gostei + 0

11/09/2006

Rodc

Eu já tentei fazer o preenchimento deste campo uma vêz e desisti. Parabéns por ter conseguido. Tente verificar o nome do componente ou após fazer a primeira vêz saia do loop para não preencher o próximo.


Responder

Gostei + 0

11/09/2006

Eme_matos

Segue o fonte corrigido para testes.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, MSHTML, StdCtrls,shellapi, Buttons;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

function ExecuteScript(doc: IHTMLDocument2; script: string; language: string): Boolean;
var
win: IHTMLWindow2;
Olelanguage: Olevariant;
begin
if doc <> nil then
begin
try
win := doc.parentWindow;
if win <> nil then
begin
try
Olelanguage := language;
win.ExecScript(script, Olelanguage);
finally
win := nil;
end;
end;
finally
doc := nil;
end;
end;
end;


procedure FillInGMXForms(WB: ShDocVW.IWebbrowser2; IDoc1: IHTMLDocument2;
Document: Variant; P_CNPJ : string);
const
IEFields: array[1..2] of string = (´INPUT´, ´text´);
var
IEFieldsCounter: Integer;
i: Integer;
m: Integer;
ovElements: OleVariant;
begin
if Pos(´Receita Fazendaria´, Document.Title) <> 0 then
while WB.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
// contar os elementos e interagir por suas formas
IEFieldsCounter := 0;
for m := 0 to Document.forms.Length - 1 do
begin
ovElements := Document.forms.Item(m).elements;
// interagir por elemento
try
// preencher os campos
if (ovElements.item(0).tagName = IEFields[1]) and
(ovElements.item(0).type = IEFields[2]) then
begin
ovElements.item(0).Value := P_CNPJ;
Inc(IEFieldsCounter);
end;
except
// falha...
end;
end;
// se o campo estiver preenchido.
if IEFieldsCounter = 3 then ExecuteScript(iDoc1,´´,´JavaScript´);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
IDoc1: IHTMLDocument2;
Web: ShDocVW.IWebBrowser2;
begin
Webbrowser1.Navigate(´http://www.receita.fazenda.gov.br/Aplicacoes/ATSPO/Certidao/CertInter/NICertidao.asp?tipo=1´);
while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
Webbrowser1.Document.QueryInterface(IHTMLDocument2, iDoc1);
Web := WebBrowser1.ControlInterface;
FillInGMXForms(Web, iDoc1, Webbrowser1.Document, ´05.247.421/0001-35´);
end;
end.


Responder

Gostei + 0

12/09/2006

Rodc

Valew cara... vou testar....
Abraços,


Responder

Gostei + 0

06/11/2006

Nigro

Dois anos depois...
Funcionou perfeitamente...


Responder

Gostei + 0

03/08/2007

Adriano_servitec

Olah amigo, vc conseguiu para este outro site tambem?

https://www8.receita.fazenda.gov.br/SimplesNacional/controleacesso/autentica.aspx?id=5


Responder

Gostei + 0

06/08/2007

Adriano_servitec

Ja resolvido

a funçao pertençe a este site

http://www.swissdelphicenter.ch/torry/showcode.php?id=1732

Eh soh adaptar


Responder

Gostei + 0

30/06/2015

Ednaldo Junior

Olá,

Estou precisando com urgencia que funcione para esse site

https://www.sefaz.rs.gov.br/NFE/NFE-COM.aspx

Já tentei de tudo e não funciona!

Ajudem por favor
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar