Отправка веб-формы - это навигация, поэтому вам нужно снова подождать свойства ReadyState
и Busy
после вызова tibAutentification.click
(при условии, что это кнопка отправки веб-формы). То же самое со вторым Navigate()
вызовом. Кроме того, вам нужно прокачать очередь сообщений вызывающего потока в ожидании готовности браузера, чтобы он действительно мог корректно обрабатывать изменения своего состояния.
procedure TMainForm.Button10Click(Sender: TObject);
var
doc: IHTMLDocument2;
doc3: IHTMLDocument3;
FileStream: TFileStream;
StreamAdapter: IStream;
PersistStreamInit: IPersistStreamInit;
i, a, b : integer;
sir: string;
procedure WaitForReady;
begin
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages;
end;
begin
WebBrowser1.Navigate('https://website/externallogin.aspx');
WaitForReady;
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
WebFormSetFieldValue(doc,0,'txtNume','user');
WebFormSetFieldValue(doc,0,'txtPwd','psswd');
doc3.GetElementByID('tibAutentification').click;
WaitForReady;
WebBrowser1.Navigate('https://website/Pages/SearchTitle.aspx');
WaitForReady;
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('chkTitleNo').click;
WebFormSetFieldValue(doc,0,'txtTitleNo','28972'); //nr titlu de proprietate
doc3.GetElementByID('tibSearch').click;
WaitForReady; // ?
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('fdgMain:_ctl3:imbView').click;
WaitForReady; // ?
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('tibViewPDF').click;
end;
procedure TForm1.WebFormSetFieldValue(const document: IHTMLDocument2;
const formNumber: integer; const fieldName, newValue: string);
var
form : IHTMLFormElement;
field: IHTMLElement;
begin
if document = nil then Exit;
form := WebFormGet(formNumber, document);
if form = nil then Exit;
field := form.Item(fieldName,'') as IHTMLElement;
if field = nil then Exit;
if field.tagName = 'INPUT' then
(field as IHTMLInputElement).value := newValue
else if field.tagName = 'SELECT' then
(field as IHTMLSelectElement).value := newValue
else if field.tagName = 'TEXTAREA' then
(field as IHTMLTextAreaElement).value := newValue;
end;
Из-за проблем с повторным входом, связанных с ручной перекачкой очереди сообщений, сериализация этого кода не является хорошей идеей, вместо этого следует использовать событие браузера OnDocumentComplete
, разрешив VCL обрабатывать обработку сообщений для вас. Например, (может потребоваться некоторая настройка):
procedure TMainForm.Button10Click(Sender: TObject);
begin
WebBrowser1.Navigate('https://website/externallogin.aspx');
WebBrowser1.Tag := 1;
end;
procedure TMainForm.WebBrowser1DocumentComplete(ASender: TObject;
const Disp: IDispatch; const URL: OleVariant);
var
doc: IHTMLDocument2;
doc3: IHTMLDocument3;
begin
case WebBrowser1.Tag of
1: begin
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
WebFormSetFieldValue(doc,0,'txtNume','user');
WebFormSetFieldValue(doc,0,'txtPwd','psswd');
doc3.GetElementByID('tibAutentification').click;
WebBrowser1.Tag := 2;
end;
2: begin
WebBrowser1.Navigate('https://website/Pages/SearchTitle.aspx');
WebBrowser1.Tag := 3;
end;
3: begin
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('chkTitleNo').click;
WebFormSetFieldValue(doc,0,'txtTitleNo','28972'); //nr titlu de proprietate
doc3.GetElementByID('tibSearch').click;
WebBrowser1.Tag := 4;
end;
4: begin
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('fdgMain:_ctl3:imbView').click;
WebBrowser1.Tag := 5;
end;
5: begin
doc := WebBrowser1.Document as IHTMLDocument2;
doc3 := doc as IHTMLDocument3;
doc3.GetElementByID('tibViewPDF').click;
WebBrowser1.Tag := 0;
end;
end;
end;