-
проблема следующая. парсер последовательно заполняет группу форм информацией из файла. Происходит это так: При нажатии кнопки в веббраузер загружается очередная страничка с формой, пока она грузится действует строка while webbrowser1.readystate<>4 do application.processmessages затем, после полной загрузки страницы, форма заполняется соответствующей инфой после чего строка form.submit сохранияет введенные данные. После этого цикл увеличивается на 1 и грузится следующая страница, и т. д. Однако, форма не успевает сохраниться перед загрузкой следующей страницы, и тут while webbrowser1.readystate<>4 do application.processmessages не помогает. Что посоветуете? вот отрывок кода procedure TForm1.btnInClick(Sender: TObject);
var
document: IHTMLDocument2;
theForm: IHTMLFormElement;
i, j: integer;
tab: byte;
value, item: string;
begin
for j:=0 to id.Count-1 do begin
WebBrowser1.Navigate('http://blablabla.ru/'+id[j]+'.html');
while WebBrowser1.ReadyState<>4 do Application.ProcessMessages;
document := WebBrowser1.Document as IHTMLDocument2;
theForm := GetFormByNumber(document,2);
item:=prod[j];
for i:= 0 to hara.Count-1 do begin
tab:=Pos(#9, item);
value:=Copy(item,1,tab-1);
SetFieldValue(theForm,hara[i],value);
Delete(item,1,tab);
end;
SetFieldValue(theForm,hara[hara.Count-1],prod[j]);
theForm.submit;
end;
end;
-
попробуй While not (WebBrowser1.ReadyState in [READYSTATE_COMPLETE, READYSTATE_INTERACTIVE]) do
Application.ProcessMessages;
-
> Cobalt © (28.05.12 08:12) [1]
Так это ослабит условие, а ему нужно усилить.
-
Вставить код ожидания после theForm.submit; подозреваю, что submit; возвращает управление сразу же, а передача данных идет в отдельном потоке. Это можно проверить таким способом: OutputDebugStringW(PWideChar('before submit: ' + IntTostr(GetTickCount)));
theForm.submit;
OutputDebugStringW(PWideChar('after submit: ' + IntTostr(GetTickCount))); Сколько раз встречал такое в браузерах - жмакаешь кнопку "Добавить", потом Esc - и пост еще не ушел на форум :-)
-
так, все верно, сабмит отдает управление сразу. это проверяется даже обычным showmessage после сабмита. на фоне всплывшего message страничка догружается до сообщения, что информация отправлена.
То есть мне достаточно просто перед каждым витком цикла делать, скажем 4-х секундную паузу.
Пробовал таймером, не получилось, не могу сообразить, как сделать паузу в обработчике нажатия кнопки, чтобы загрузка в браузере при этом тоже не останавливалась?
-
Не рекомендую закладываться на сколько-то там секунд - надежнее ждать окончания обработки запроса браузера - может сервак отлуп даст типа "слишком много коннектов", "сервер недоступен" и т.п.
У тебя задача - прокукарекать, а там трава не расти, или же все-таки гарантированно отправить на сервер данные, с проверкой доставки?
-
WebBrowser1.Busy не помогает?
-
> WebBrowser1.Busy не помогает?
не помогает
> У тебя задача - прокукарекать, а там трава не расти, или > же все-таки гарантированно отправить на сервер данные, с > проверкой доставки?
задача передать данные, однако в случае сбоя я могу просто убрать то, что уже закинуто, и продолжить.
ждать окончания обработки запроса браузера предпочтительнее, однако пока, так и не придумал как.
Происходит так. При нажатии сабмит браузер щелкает, как при отправке по ссылке, потом щелкает еще раз (переадресация) и выдает табличку "Товары в разделе".
При автозаполнении, до переадресации не доходит, начинает грузиться сразу следующий товар.
Пробовал WebBrowser1.Busy, WebBrowser1.readystate, пробовал делать таймер (не догнал, как его применить, либо так же грузит страницы подряд, либо виснет), пробовал даже такие штуки: while webbrowser.oleobject.document.all.tags('SPAN').item(5).innertext<>'Товары в разделе' do application.processmessages; и while TVarData(webbrowser.oleobject.document.all.tags('SPAN').item(5)).vDispatch=null do application.processmessages;
-
можно ли как-нибудь использовать функцию waitforsingleobject в моем случае?
-
> пробовал даже такие штуки: > while webbrowser.oleobject.document.all.tags('SPAN').item(5). > innertext<>'Товары в разделе' do application.processmessages; > > и > while TVarData(webbrowser.oleobject.document.all.tags('SPAN'). > item(5)).vDispatch=null do application.processmessages; Вполне себе метод имеет право на существование, если WebBrowser1.ReadyState = READYSTATE_COMPLETE, а страничка на самом деле еще не загрузилась (кстати, как убеждаетесь в этом - только визуально, или содержимое тоже проверяешь?) Так что не так с таким способом?
-
при while webbrowser.oleobject.document.all.tags('SPAN').item(5). innertext<>'Товары в разделе' do application.processmessages; программа выдает ошибку чтения из памяти, оно и понятно...
а при while TVarData(webbrowser.oleobject.document.all.tags('SPAN'). item(5)).vDispatch=null do application.processmessages; странички продолжают грузиться подряд не сохраняя информацию с формы.
При WebBrowser1.ReadyState = READYSTATE_COMPLETE, как я уже писал, странички тоже пропускают сабмит формы мимо ушей и грузятся подряд.
Я полагаю, что сабмит формы запускается в другом потоке, поэтому поток нажатия кнопки продолжает бежать вперед,не дожидаясь отправки информации.
Вопрос: как проверить, так ли это, как получить идентификатор этого второго потока, и как с помощью WaitForSingleObject заставить программу дожидаться окончания этого потока?
-
Блин, ты, вместо маяния фигней, смотри на метод: procedure TForm2.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
URL видишь? Проверяй, какая страничка загрузилась. И всё. Больше нифига не надо.
|