Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > работа с web страницами в делфи


Автор: h2o 11.2.2009, 21:43
Добрый вечер!

Добрые люди, подскажите в проблеме:
делаем с ребятами сайт и прогу для сайта. Сайт с тестами и д.р. такой фигней.

сайт на php. Мне нужно с помощью ie движка 
1. зайти на страницу
2. считать данные
3. залогиниться на ней
4. отправлять туда данные
5. нажимать кнопки
6. обновлять в программе постоянно меняющиеся данные. (некоторые данные, например вопросы,время, меняются, ну примерно как отсчёт идет. и этот отсчёт нужно своевременно быстро отображать, иначе время ответа закончится и вопрос будет считаться не отвеченным.)

Я вообще не представляю как и что тут делать.. с чего начать, что спользовать и т.д. подскажите варианты

и плз... если есть  примеры, буду ОООООООчень благодарен!!!

Автор: h2o 15.2.2009, 14:29
мда.. нет ответов...

неужели никто подсказать не может?

сайт на php. Мне нужно с помощью ie движка 
1. зайти на страницу. ну это просто
2. считать данные. Тут только парсинг? или ещё варианты?
3. залогиниться на ней. это я почти сделал... вхожу, нахожу поля, заполняю.. но вот на кнопку не нажимается.. потому что там не кнопка и изображение и вообще без ссылки...
4. отправлять туда данные. результаты теста я думаю можно отправлять пост запросами.. благо с отправкой данных пост запросом я разобрался какоето время назадю
5. нажимать кнопки. жать на кнопки  нужно. тут блин я думаю разрешится когда авторизацию если дделаю.
6. обновлять в программе постоянно меняющиеся данные. вот тут вообще хз. даже идей нет! это например таймер с временем. есть проги-downloaderы с сайтов типа rapidshare depositfiles и т.д. которые сами линки редиректят и время(таймер отсчета) отображают... вообще я не понимаю как такое сделать!

ХЕЛП!!!

Автор: MetalFan 15.2.2009, 15:52
2. что значит "считать"? найти на странице определенные данные? ну либо регулярки либо HTMLDOM, либо и то и то.
3. Обращайся к картинке, как к IHTMLElement у которого есть метод click.
4. а почему не использовать для отправки IE(IWebBrowser?), раз уж он уже используется
6. найти изменяющийся элемент. поковырять события IHTMLxxx, наверняка какое-нибудь событие дергается в момент обновления элемента.

Автор: h2o 15.2.2009, 21:57
MetalFan  спасибо что откликнулся!

2. что значит "считать"? найти на странице определенные данные? ну либо регулярки либо HTMLDOM, либо и то и то.
HTMLDOM - это что и где? у меня Д2009. да данные нужно найти на странице и загрузить в прогу. причём данные наверняка не будут отмечены особыми тегами. 

3. Обращайся к картинке, как к IHTMLElement у которого есть метод click.
Код

<a title="Войти"><input tabindex=3 type="image" width="22" height="22" src="/images/login.png"></a>
            <input type="hidden" name="action" value="login">

и вот не получается нажать сюжа.

4. а почему не использовать для отправки IE(IWebBrowser?), раз уж он уже используется
хм. почему то я об этом не подумал. хотя это +

6. найти изменяющийся элемент. поковырять события IHTMLxxx, наверняка какое-нибудь событие дергается в момент обновления элемента.
Наверно это самое трудное. в серверной части у преподавателей будет типа мини-серверный мониторинг. он в реальном времени будет отображать результаты, кто сдал, кто не сдал, кто на каком вопросе, у кого какое время прошло/осталось и многое другое. тоесть для них страница этабудет динамическая, т.е. данные будут изменяться постоянно. если для пользователей будет только таймер в реальном времении, то для преподов будет куча динамических данных. А как их отследить? ну допустим... даже пример сайта не могу привести... ну например.. форекс чтоли.. там ежесекундно меняются данные, графики, и если страница открыта то  они автоматом обновляются. а как это происходит? как это делается? куки обновляются раз в милисекунду или как?

Автор: MetalFan 15.2.2009, 22:28
2. я имел ввиду работу MS HTML. т.е. IWebBrowser2.Document и вперед по структуре. почитать можно MSDN либо поковырять этот форум)
3. а как пытался "нажать"? 
6. опять же надо изучать кишки MSHTML. скорее всего вполне возможно отследить изменения (обновления) элементов.

Автор: h2o 15.2.2009, 22:46
нажать пытался 2мя способами.. 1й-это выполнение скрипта логина.. сайт же на рнр.. и 2й способ - не помню.. кажется был idHttp, оба варианта были выведены из примеров представленных тут на форуме..
IHTMLElement - это я не смотрел...

Автор: h2o 16.2.2009, 14:02
всё равно никак не получатся нажать на кнопку.

Код

<a title="Войти"><input tabindex=3 type="image" width="22" height="22" src="/images/login.png"></a><input type="hidden" name="action" value="login">

и
Код

<a title="Выйти"><input tabindex=3 type="image" width="22" height="22" src="/images/logout.png"></a><input type="hidden" name="action" value="logout">


вот такой код: нажимает на кнопки, но не работает в данном случае. он находит поля логина, пароля, по INPUT тэгу, а <input tabindex=3 type="image" width="22" height="22" src="/images/login.png"> не находит даже.
Код

  ovElements := WebBrowser1.OleObject.Document.forms.item(1).elements;
  for i := 0 to (ovElements.Length - 1) do
  begin
  if (ovElements.item(i).tagName = 'INPUT') and
     (ovElements.item(i).type = 'image')
    then
      ovElements.item(i).Click;
  end;


код который кликает по картинке, эту- <input tabindex=3 type="image" width="22" height="22" src="/images/login.png"> - не воспринимает и не находит как картинку.

есть ли ещё варианты как нажать на кнопку эту через WebBrowser?

Автор: HiVeR 16.2.2009, 19:14
h2o, почему бы не использовать запросы по http протоколу?!
насколько знаю, весь процесс общения браузера с сервером идёт через запросы, а нажатие кнопок - несколько мнимое действо - после нажатия тоже отправляется запрос. 
IDHttp - самое простое, что могу посоветовать. Почти уверен, что через него можно всё это организовать. Через браузер тут будет геморно, имхо. 
Цитата

1. зайти на страницу
2. считать данные

Код

var s:string;
begin
s:=IDHTTP.Get(<Url сайта>);
end;

Цитата

3. залогиниться на ней
4. отправлять туда данные
5. нажимать кнопки

скорее всего эти шаги элементарно делаются через Post запросы.
Цитата

6. обновлять в программе постоянно меняющиеся данные. (некоторые данные, например вопросы,время, меняются, ну примерно как отсчёт идет. и этот отсчёт нужно своевременно быстро отображать, иначе время ответа закончится и вопрос будет считаться не отвеченным.)

тем же самым IDHTTP можно постоянно(по таймеру) скачивать страницу, а лучше как сказал MetalFan скачивать отдельные меняющиеся элементы и постоянно вставлять их в программу - тода думаю всё буйт быстро и четкоsmile.

Автор: MetalFan 16.2.2009, 19:45
h2o, а такой код вообще скомпилился???

Автор: h2o 16.2.2009, 23:27
HiVeR я сначала тоже смотрел в сторону IDHTTP. но я не могу понять как мне эти запросы организовать + ещё есть сложности. webBrowser половину делает автоматом. поэтому чтобы было более совместимо и не было гемора остановился на нем.

MetalFan  конечно компилируется. тут кусок я привел просто. вот полный код
Код

procedure TForm1.Button1Click(Sender: TObject);
var
ovElements: OleVariant;
i: Integer;
begin
WebBrowser1.navigate('www.ru');
ovElements := WebBrowser1.OleObject.Document.forms.item(0).elements;
for i := 0 to (ovElements.Length - 1) do
if (ovElements.item(i).tagName = 'INPUT') and
(ovElements.item(i).type = 'SUBMIT') and
(ovElements.item(i).Value = 'войти') then
ovElements.item(i).Click;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)