Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WebBrowser, Заполнение формы. 
:(
    Опции темы
Garmahis
Дата 18.11.2005, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Доброго времени суток! Пожалуйста помогите мне! есть сайт www.ogame.ru там на первой страничке форма выпадающий комбобокс два едита и кнопка. Я открываю этот сайт в WebBrowser1 и мне надо по нажатию кнопки чтобы выбиралось значение из комбобокса, вводились значение в едиты и нажималась кнопка. Честное слова весь день рылся по всем примерам и описаловкам, но ничего не получается. Обьекты не находятся. Помогите пожалуйста! smile
PM   Вверх
Garmahis
Дата 19.11.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



С едитами и кнопкой разобрался там оказывается был фрейм во фрейме, а вот с комбобоксом никак не могу понять как они его обозначили и как ему задавать значение из списка. У него стиль csDropDownList. Народ ну неужели никто не сталкивался с такими проблемами?
PM   Вверх
Garmahis
Дата 19.11.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Как я уже написал с Комбобоксом я пока не разобрался, но так как с такой проблемой сталкнулся не я один приведу пример моего решения для эдитов и кнопки.
На форме лежат Memo1, Edit1,Edit2,Edit3,WebBrowser1,SpeedButton1,SpeedButton2,SpeedButton3

Код

//основная процедура обработи фреймов
procedure TForm1.Frame(Doc:IHTMLDocument2;Add:Boolean;IName:String;Comm:String);
var
frames:IHTMLFramesCollection2;
i,y:integer;
Disp:IDispatch;
Element:IHTMLElement;
InputElement:IHTMLInputElement;
ov:OleVariant;
Window2:IHTMLWindow2;
begin
 for i:=1 to Doc.all.length do
 begin
  Disp:=Doc.all.item(Pred(i),0);
  Disp.QueryInterface(IHTMLElement,Element);
  if Assigned(Element) then
  begin
   Element.QueryInterface(IHTMLInputElement,InputElement);
   if Assigned(InputElement) then
   begin
    if Add=False then
    Memo1.Lines.Add('NAME= '+InputElement.Name)
    else
    if InputElement.name=IName then
    begin
     if Comm<>'ClickBt' then
     InputElement.value:=Comm
     else
     begin
      Element.click;
     end;
    end;
   end;
  end;
 end;
 frames:=Doc.frames;
 if Assigned(frames) then
 begin
  for y:=1 to frames.length do
  begin
   ov:=y-1;
   Disp:=frames.item(ov);
   Disp.QueryInterface(IHTMLWindow2,Window2);
   Frame(Window2.document,Add,IName,Comm);
  end;
 end;
end;

// Открываем страничку в браузере берём адрес из эдита
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
WebBrowser1.Navigate(Edit3.Text);
end;

// Запускаем просмотр компонентов ввода
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
Doc:IHTMLDocument2;
begin
Memo1.Lines.Clear;
if not Assigned(WebBrowser1.ControlInterface.Document) then
Memo1.Lines.Add('Фрейм Верхнего уровня ненайден!')
else
begin
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,Doc);
Frame(Doc,False,'','');
end;

// Вводим значение из edit2.Text в компонент с именем edit1.Text
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
Doc:IHTMLDocument2;
begin
Memo1.Lines.Clear;
if Assigned(WebBrowser1.ControlInterface.Document) then
begin
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,Doc);
Frame(Doc,True,Edit1.Text,Edit2.Text);
end;
end;



Это сообщение отредактировал(а) Garmahis - 19.11.2005, 18:49
PM   Вверх
p0s0l
Дата 19.11.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 6
Всего: 112



Тебе именно нужно заполнить форму ?
Или может проще послать сразу запрос, в котором указаны значения заполняемых полей ?
(т.е. ты делаешь именно заполнятор форм (напр. для помощи юзеру), или делаешь бота (который автоматически будет всё там делать) )


--------------------
С уважением, г-н Посол.
PM   Вверх
Garmahis
Дата 19.11.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Я делаю бота smile С комбобоксом разобрался. Теперь остаётся вопрос почему на меня ругается сервер по поводу доступа и что делать.
PM   Вверх
p0s0l
Дата 19.11.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 6
Всего: 112



С комбой надо было юзать интерфейс IHTMLSelectElement...

Цитата(Garmahis @ 19.11.2005, 22:11)
ругается сервер по поводу доступа и что делать.
А как ругается, что пишет ?

И если бота, то можно попробовать обойтись без IE и заполнения форм...
http://forum.vingrad.ru/index.php?showtopic=33141
(т.е. передаешь в виде
timestamp=...&v=2&Uni=ogame279.de&login=marsianin&pass=123
)


--------------------
С уважением, г-н Посол.
PM   Вверх
Garmahis
Дата 20.11.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Я это уже понял smile
Сообщение выходит на 44 строчке программы сообщает что Отказано в доступе.
Я попробовал сейчас обрабатывать вторым способом через
Код

procedure TFormSimpleWB.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  var i,y:integer;
      iDoc:IHtmlDocument2;
      iDisp: IDispatch;
      iElement:IHTMLElement;
      iInputElement:IHTMLInputElement;
      Uni:IHTMLSelectElement;
      S:string;
begin //
 // Memo1.Clear;
  iDoc:=(pDisp as IWebBrowser).Document as IHtmlDocument2;
  y:=0;
  for i:=1 to iDoc.All.Get_length do begin
    iDisp:=iDoc.Get_all.item(pred(i),0);
    iDisp.QueryInterface(IHTMLElement, iElement);
    if assigned(iElement) then begin
     // S:=S+'tag='+iElement.Get_tagName+'   ';
      iElement.QueryInterface(IHTMLSelectElement,Uni);
      if assigned(Uni) then begin
      y:=y+1;
      Memo1.Lines.Add(IntToStr(y)+' Select='+Uni.name);
      if ListNumber=0 then
      Gal:=Uni;
      if ListNumber=1 then
      begin
      Planet:=Uni;
      Planet1:=iElement;
      end;
      end;
      iElement.QueryInterface(IHtmlInputElement,iInputElement);
      if assigned(iInputElement) then begin
      y:=y+1;
      Memo1.Lines.Add(IntToStr(y)+' Input='+iInputElement.name);
      if ListNumber=0 then
      begin
      if iInputElement.name='login' then
      Login:=iInputElement;
      if iInputElement.name='pass' then
      Pass:=iInputElement;
      if iInputElement.name='' then
      Butt:=iElement;
      end;
      end;
    end;
  end;
end;

так ошибка не возникает...
PM   Вверх
p0s0l
Дата 20.11.2005, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 6
Всего: 112



Цитата(Garmahis @ 20.11.2005, 00:15)
Сообщение выходит на 44 строчке программы сообщает что Отказано в доступе.
Эта ошибка возникает, если документ не загружен или не полностью загружен, а ты пытаешься с ним что-нить сделать...

Имхо, так код немного нагляднее:
Код
var
  doc, frame, inp : OleVariant;

begin
  doc := wb1.OleObject.Document;
  frame := doc.frames.item(0).document;
  frame := frame.frames.item(0).document;
  frame.formular.login.value := 'marsianin';
  frame.formular.pass.value := '12345678';
  frame.formular.uni.value := frame.formular.uni.options.item(3).value;
  inp := frame.all.tags('input');
  inp.item(inp.length-1).click;
end;
(в том смысле, что можно обойтись без перебора всех элементов)


--------------------
С уважением, г-н Посол.
PM   Вверх
Garmahis
Дата 20.11.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Нет у меня это сообщение выводит даже если я десять минут жду.
Так нагляднее, но мне надо создать универсальный обработчик, который анализировал не тока первую страницу, но и все другие.
PM   Вверх
p0s0l
Дата 20.11.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 6
Всего: 112



Цитата(Garmahis @ 20.11.2005, 14:13)
Нет у меня это сообщение выводит даже если я десять минут жду.
Ничего сказать тогда не могу, т.к. кода ты не привел (для случая, когда выводит отказано в доступе). Приведенный выше мною код нормально входит на сайт (да и твой должен работать, если документ загружен)...
И вообще, не понятно, работает у тебя или нет smile (такое подозрение, что у тебя всё работает, я тут только немного торможу и продолжаю рассусоливать дальше smile ) - вроде говоришь
Цитата(Garmahis @ 20.11.2005, 00:15)
Сообщение выходит на 44 строчке программы сообщает что Отказано в доступе.
и в этом же сообщении:
Цитата(Garmahis @ 20.11.2005, 00:15)
так ошибка не возникает...



--------------------
С уважением, г-н Посол.
PM   Вверх
Garmahis
Дата 20.11.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Да совсем забыл. Вот новый код, который полностью работает.

Код

procedure TFormSimpleWB.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  var i,y:integer;
      iDoc:IHtmlDocument2;
      iDisp: IDispatch;
      iElement:IHTMLElement;
      iInputElement:IHTMLInputElement;
      Uni:IHTMLSelectElement;
      Link:IHTMLLinkElement;
     Body: variant;
     df:IHTMLLinkElementDisp;
     u : variant;
      S:string;
begin
  iDoc:=(pDisp as IWebBrowser).Document as IHtmlDocument2;
  y:=0;
  if Assigned(iDoc.body) then
   if iDoc.body.tagName = 'BODY' then
     begin
       Body := iDoc.links;
       for i := 0 to Body.Length - 1 do
       begin
         u := Body.item(i);
         Memo1.Lines.Add('Link= '+u.href);
     end;
     end;
  for i:=1 to iDoc.All.Get_length do begin
    iDisp:=iDoc.Get_all.item(pred(i),0);
    iDisp.QueryInterface(IHTMLElement, iElement);
    if assigned(iElement) then
    begin
     iElement.QueryInterface(IHTMLLinkElement,Link);
      if Assigned(Link) then begin
        y:=y+1;
      Memo1.Lines.Add(IntToStr(y)+' Link='+Link.href);
      end;
      iElement.QueryInterface(IHTMLSelectElement,Uni);
      if assigned(Uni) then begin
      y:=y+1;
      Memo1.Lines.Add(IntToStr(y)+' Select='+Uni.name);
      if ListNumber=0 then
      Gal:=Uni;
      if ListNumber=1 then
      begin
      Planet:=Uni;
      Planet1:=iElement;
      end;
      end;
      iElement.QueryInterface(IHtmlInputElement,iInputElement);
      if assigned(iInputElement) then begin
      y:=y+1;
      Memo1.Lines.Add(IntToStr(y)+' Input='+iInputElement.name);
      if ListNumber=0 then
      begin
      if iInputElement.name='login' then
      Login:=iInputElement;
      if iInputElement.name='pass' then
      Pass:=iInputElement;
      if iInputElement.name='' then
      Butt:=iElement;
      end;
      end;
    end;
  end;
end;



Тока ещё один вопрос я там считываю адрес линка это href а как считать надпись линка? Ну пользователь там видит нормальную надпись как её получить? вроде никакого span там нет...
PM   Вверх
December
Дата 3.12.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Цитата(Garmahis @ 20.11.2005, 22:54)
Тока ещё один вопрос я там считываю адрес линка это href а как считать надпись линка?

Может, innerText?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.