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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2013, 19:34   #1
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию Как вычислить координаты ссылки в TWebBrowser?

Здравствуйте, уважаемые форумчане. Может, кто знает, как вычислить координаты (x,y) ссылки или определённого слова, которые имеются на загруженной веб странице в TWebBrowser?
Vedaslav вне форума Ответить с цитированием
Старый 09.04.2013, 20:22   #2
SamBellamy
 
Регистрация: 28.06.2008
Сообщений: 6
По умолчанию

это вам нужно найти объект нужной ссылки и посмотреть его свойства, найти что-то похожее на left и top
всё что вы видите на странице в браузере описано в объектной модели, называется DOM, она имеет структуру дерева, основное это IHtmlDocument2 - документ, хранит объекты IHTMLElementCollection


ниже пример не по теме но всё же показывает как находить объекты по имени, полю value, тегу, умеет имитировать событие клика
Код:
function TAutoBoi.submit(web: TWebBrowser; name, value, tag: string;
  const bClick: bool = false; skip: byte = 0; ValueSearch: bool = false): bool;
var
  doc: IHtmlDocument2;
  tSkip: shortint;

  function action(doc: IHtmlDocument2; name, value: string; button: bool): bool;
  var
    i: Integer;
    collection: IHTMLElementCollection;
    obj: variant;
  begin
    result := false;
    collection := doc.all.tags(Tag) as IHTMLElementCollection;
    if collection = nil then exit;
    //перебор объектов ввода на странице
    for i := 0 to collection.length - 1 do begin
      obj := collection.item(i, 0);
      if (LowerCase(tag) = 'a') then begin
        //если ValueSearch = true то ссылку можно нажать имея только часть имени
        if (obj.href = name) or
           ((Pos(name, obj.href) <> 0) and (ValueSearch)) then begin
          obj.Click;
          exit
        end;
      end else
        if ((not ValueSearch) and (obj.name = name)) or
           ((ValueSearch) and (obj.value = value)) then begin
          dec(tSkip);
          if tSkip <> -1 then continue;
          result := true;
          //кнопку нажать или значение подставить
          if button then obj.Click else obj.value := value;
          exit;
        end;
    end;
  end;

  function recursion(var doc: IHtmlDocument2): bool;
  var
    f: Integer;
    frame: IDispatch;
    t: IHtmlDocument2;
  begin
    result := false;
    if (doc = nil) or (tSkip = -1) then exit;
    //просмотр фрейма
    if action(doc, name, value, bClick) = true then result := true;
    //перебор фреймов
    for f := 0 to doc.frames.length - 1 do begin
      frame := doc.frames.item(f).Document;
      t := frame as IHTMLDocument2;
      if recursion(t) = true then result := true;
    end;
  end;

begin
  doc := Web.Document as IHtmlDocument2;
  tSkip := skip;
  result := recursion(doc);
end;
следующим образом можно найти тег A у которого ссылка будет начинаться с 'leave_combat.php?rnd=' и выполнить событие click

Код:
submit(WebBrowser, 'leave_combat.php?rnd=', '', 'a', false, 0, true)

Последний раз редактировалось SamBellamy; 09.04.2013 в 22:18. Причина: добавлен пример использования функции
SamBellamy вне форума Ответить с цитированием
Старый 12.04.2013, 22:26   #3
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Благодарю, но мне надо было решить немного другую задачу:

1) Допустим в TWebBrowser уже загружена какая-нибудь веб страница,

2) с помощью специальных функций мы узнаем все имеющиеся ссылки на этой странице,

3) далее вычисляем координаты (x,y) той ссылки, которая нас интересуют,

4) программно перемещаем курсор к этой ссылке по тем координатам, которые нам уже известны и делаем клик.

Фактически, всё это нужно было для бота, который бы автоматически посещал через прокси определённые интернет ресурсы и имитировал действия юзера.

Вот нашёл решение, но привести код в работоспособное состояние не смог

Цитата:
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, ExtCtrls, StdCtrls, ComCtrls;

type
TfrmMain = class(TForm)
SB: TStatusBar;
LB: TListBox;
SPL: TSplitter;
WB: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure WBDocumentComplete(Sender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
procedure LBClick(Sender: TObject);
procedure WBBeforeNavigate2(Sender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
WB.Navigate("http://www.site.ru/");
end;

function ElementTop(elem: OleVariant): integer;
var
top, height: integer;
begin
top := 0;
height := elem.offsetHeight;
repeat
top := top + elem.offsetTop;
elem := elem.offsetParent;
until elem.tagName = "BODY";
result := top + height div 2;
end;

function ElementLeft(elem: OleVariant): integer;
var
left, width: integer;
begin
left := 0;
width := elem.offsetWidth;
repeat
left := left + elem.offsetLeft;
elem := elem.offsetParent;
until elem.tagName = "BODY";
result := left + width div 2;
end;

procedure TfrmMain.WBDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i: integer;
allA: OleVariant;
p: TPoint;
begin
allA := WB.OleObject.document.all.tags("A") ;
for i := 0 to allA.length - 1 do begin
p := point(ElementLeft(allA.item(i)), ElementTop(allA.item(i)));
LB.Items.Add(inttostr(p.X) + " : " + inttostr(p.Y) + " -> " + allA.item(i).innerText);
end;
end;

procedure TfrmMain.LBClick(Sender: TObject);
var
p: TPoint;
bodyTop, bodyLeft: integer;
allA: OleVariant;
begin
allA := WB.OleObject.document.all.tags("A") ;
with LB do
p := point(ElementLeft(allA.item(ItemInd ex)), ElementTop(allA.item(ItemIndex)));
WB.OleObject.document.parentWindow. scrollTo(p.X - WB.Width div 2, p.Y - wb.Height div 2);
p := WB.ClientToScreen(p);
bodyTop := WB.OleObject.document.body.scrollTo p;
bodyLeft := WB.OleObject.document.body.scrollLe ft;
setcursorpos(p.X - bodyLeft, p.Y - bodyTop);
end;

procedure TfrmMain.WBBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
LB.Clear;
end;

end.
Vedaslav вне форума Ответить с цитированием
Старый 12.04.2013, 23:17   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

этот код для бота не подходит
eval вне форума Ответить с цитированием
Старый 12.04.2013, 23:19   #5
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
этот код для бота не подходит
почему не подходит?
Vedaslav вне форума Ответить с цитированием
Старый 12.04.2013, 23:26   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

потому что боты не работают с браузерами
eval вне форума Ответить с цитированием
Старый 12.04.2013, 23:36   #7
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
потому что боты не работают с браузерами

Интересно,, а вы слышали что-нибудь про боты автокликеры, eval?
Или про программу типа Userator? Я думаю вы глубоко ошибаетесь.
Vedaslav вне форума Ответить с цитированием
Старый 13.04.2013, 00:25   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

ни грамма не ошибаюсь
автокилеры это те что авто киляют?
eval вне форума Ответить с цитированием
Старый 13.04.2013, 00:41   #9
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
ни грамма не ошибаюсь
автокилеры это те что авто киляют?
Да, правильно, автоматически кликают и могут выполнять ещё кое-какие действия.

А если вы спорите со мной на счёт этимологии самого слова "автокликер", то многие Seo-оптимизаторы, да и вебмастера поймут о чём я.
Vedaslav вне форума Ответить с цитированием
Старый 13.04.2013, 00:46   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

да не я не спорю, делать мне чтоль нечего ...
просто покажите какойнибудь автокилер, вот и весь спор
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TWebBrowser - изменить текст ссылки AvRob Компоненты Delphi 8 23.07.2012 17:02
как заставить twebbrowser принудительно открывать все ftp ссылки в пассивном режиме key-bo2 Помощь студентам 0 24.07.2011 18:41
Как вычислить координаты после отражения? TacoBell Помощь студентам 3 20.04.2010 22:20
Как в TWebBrowser узнать адрес ссылки которая находится под курсором мышки SeRhy Общие вопросы Delphi 0 10.08.2008 10:11
twebbrowser Как получить ссылки на которые ведут картинки? darkcoder Работа с сетью в Delphi 1 07.03.2008 14:10