Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2012, 21:06   #1
cashmail
Форумчанин
 
Регистрация: 23.06.2011
Сообщений: 201
Вопрос Клик по ссылке в iframe!

Здравствуйте! Учусь работе с WebBrowser! Сейчас изучаю dom!
Научился клик по ссылке! По картинкам, запонять поля! И вот на сайте учителя (Я там учусь про это)
http://parsing-and-i.blogspot.com/
хотел кликнуть программно на рекламу от google!
Все изучил! И понял! Она в iframe! И как теперь по ней кликнуть? В idhttp Я бы все спарсил открыл и кликнул, а раз изучаю WebBrowser хотел попробывать такое на нем! Подскажите как это реализовать?
cashmail вне форума Ответить с цитированием
Старый 13.07.2012, 16:50   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Я так понимаю, основная проблема - в том, что IE (а, соответственно, и WebBrowser) по дефолту не дает доступа к кроссдоменным фреймам? То есть, код

Код:
   Doc := WebBrowser1.Document as IHTMLDocument2;
   Frames := Doc.frames;
   for i := 0 to Frames.length - 1 do
   begin
      iCurr := i; // OleVariant
      Frame := (Frames.item(iCurr) as IHTMLWindow2).Document;
      // ... тут попытка найти линки на фрейме
   end;
просто не отработает, а вылетит с Access Denied. Так?

В таком случае работаем чуть по другому (страница в WebBrowser1 должна быть уже подгружена):
Код:
procedure TForm1.Button1Click(Sender: TObject);

   // Эта функция была найдена на просторах Интернета
   // Один из авторов - Rik Barker
   function CrossDomainFrame(Doc : IHTMLDocument2;
                             nFrame : Integer) : IWebBrowser2;
   var
      theContainer : IOLEContainer;
      Enumerator : IEnumUnknown;
      nFetched : PLongInt;
      unknownFrame : IUnknown;
   begin
      Result := nil;
      nFetched := nil;
      theContainer := Doc as IOleContainer;
      theContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enumerator);
      Enumerator.skip(nFrame);
      Enumerator.next(1, unknownFrame, nFetched);
      unknownframe.QueryInterface(IID_IWebBrowser2, Result);
   end;

var
   Doc : IHTMLDocument2;
   Frames : IHTMLFramesCollection2;
   i, j : Integer;
   iCurr, iLink : OleVariant;
   Disp : IDispatch;
   Frame : IHTMLWindow2;
   Lnk : IHTMLElementCollection;
   CurrLnk : IHTMLElement;
begin
   Doc := WebBrowser1.Document as IHTMLDocument2;
   Frames := Doc.frames;
   for i := 0 to Frames.length - 1 do
   begin
      iCurr := i;
      Disp := Frames.item(iCurr);
      OleCheck(Disp.QueryInterface(IID_IHTMLWindow2, Frame));

      // Для надежности работаем со всеми фреймами, как с междоменными:
      Doc := CrossDomainFrame(WebBrowser1.Document as iHTMLDocument2,
                              iCurr).document as iHTMLDocument2;
      // Теперь возьмем линки, присутствующие на текущем фрейме
      Lnk := Doc.links;
      for j := 0 to Lnk.length - 1 do
      begin
         iLink := j;
         CurrLnk := Lnk.item(varEmpty, iLink) as IHTMLElement;
         // и на 5-ом фрейме (на твоей странице это блок Гуглорекламы)
         // жмем первую ссылку:
         if (i = 4) and (j = 0) then
         begin
            CurrLnk.click;
            Exit; // Всё, выходим из перебора
         end;
      end;
   end;

end;
volvo877 вне форума Ответить с цитированием
Старый 13.07.2012, 20:50   #3
cashmail
Форумчанин
 
Регистрация: 23.06.2011
Сообщений: 201
По умолчанию

Спасибо!!!
cashmail вне форума Ответить с цитированием
Старый 12.03.2013, 23:10   #4
Spikerrok
Новичок
Джуниор
 
Регистрация: 12.03.2013
Сообщений: 1
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   Doc : IHTMLDocument2;
   Frames : IHTMLFramesCollection2;
   i, j : Integer;
   iCurr, iLink : OleVariant;
   Disp : IDispatch;
   Frame : IHTMLWindow2;
   Lnk : IHTMLElementCollection;
   CurrLnk : IHTMLElement;
begin
   Doc := WebBrowser1.Document as IHTMLDocument2;
   Frames := Doc.frames;
   for i := 0 to Frames.length - 1 do
   begin
      iCurr := i;
      Disp := Frames.item(iCurr);
      OleCheck(Disp.QueryInterface(IID_IHTMLWindow2, Frame));

      // Здесь на некоторых сайтах вылетает ошибка access dinied:
      Doc := CrossDomainFrame(WebBrowser1.Document as iHTMLDocument2,
                              iCurr).document as iHTMLDocument2;
end;
Помогите, пожалуйста, никак не могу въехать, почему на некоторых сайтах вылетает ошибка, а на некоторых нет с одним и тем же фреймом.
Spikerrok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клик по ссылке в TWebBrowser referent Компоненты Delphi 0 02.02.2012 16:48
Клик по ссылке Webbrowser DeFix Работа с сетью в Delphi 2 29.11.2011 16:09
клик по ссылке sevitov_yura Работа с сетью в Delphi 0 28.07.2010 00:13
как перейти по ссылке в iframe? Deceased JavaScript, Ajax 12 05.01.2010 21:15
Клик по ссылке Ecosasha JavaScript, Ajax 0 17.11.2009 15:25