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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2015, 23:20   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Цикл внутри цикла. Дождаться полной загрузки страницы.

Доброго времени суток!
Есть три ссылки и две учётные записи. Сама задача:
В цикле берём данные первого аккаунта и далее во вложенном цикле идём по ссылкам:
Пока мы идём по ссылка цикл по аккаунтам "остановлен"
1. загружаем стартовую страницу
2. дожидаемся загрузки, вводим регистрационные данные, авторизуемся
3. загружаем страницу магазина
4. дожидаемся загрузки, нажимаем кнопку
5. загружаем страницу выхода
6. дожидаемся загрузки и переходим к следующему аккаунту
Получилась вот такая жесть
Код:
unit frm_Main;
...
type
  TAccounts = Record
    Login: String;
    Password: String;
  end;

type
  TURLs = Record
    URL: String;
  end;

var
  FormMain: TFormMain;
  HTMLSource: String;
  ITimerGetTimeInterval, IMas: Integer;
  LoadComplete: Boolean;
  Accounts: Array[0..1] of TAccounts;
  URLs: Array[0..2] of TURLs;

implementation

{$R *.dfm}
...
procedure TFormMain.FormCreate(Sender: TObject);
begin
  Accounts[0].Login := 'login1';
  Accounts[0].Password := 'pass1';
  Accounts[1].Login := 'login2';
  Accounts[1].Password := 'pass2';

  URLs[0].URL := 'http://localhost';
  URLs[1].URL := 'http://localhost/account/market';
  URLs[2].URL := 'http://localhost/account/exit';
end;

procedure TFormMain.PBBGetSilverClick(Sender: TObject);
var
  I, I2: Integer;
  Flags: OleVariant;
begin
  I := 0;
  IMas := I;

  LoadComplete := True;

  while I <> Length(Accounts) do
  begin
    I2 := 0;

    while I2 <> Length(URLs) do
    begin
      if LoadComplete then
      begin
        LoadComplete := False;
        // Загружаем страницу
        WebBrowser1.Navigate(URLs[I2].URL);
        Application.ProcessMessages;
        Inc(I2);
      end
      else Application.ProcessMessages;
    end;

    Application.ProcessMessages;
    Inc(I);
    IMas := I;
  end;
end;

procedure TFormMain.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
var
  I, I2: Integer;
  Form: OleVariant;
begin
  if URL = WebBrowser1.LocationURL then
  begin
    // Исходный код страницы
    HTMLSource := WB_GetHTMLCode(WebBrowser1);
    // Заполняем поля на главной странице и авторизовываемся
    if Pos('Welcome', HTMLSource) > 0 then
    begin
      for I := 0 to WebBrowser1.OleObject.Document.Forms.Length - 1 do
      begin
        Form := WebBrowser1.OleObject.Document.Forms.Item(I).elements;

        for I2 := 0 to Form.Length - 1 do
        begin
          if Form.Item(I2).name = 'log_email' then Form.Item(I2).value := Accounts[IMas].Login
          else if Form.Item(I2).name = 'pass' then Form.Item(I2).value := Accounts[IMas].Password;
        end;
        // Авторизация
        for I2 := 0 to Form.Length - 1 do
        begin
          if ((Form.Item(I2).type = 'submit') and (Form.Item(I2).value = 'Войти')) then
          begin
            Form.Item(I2).Click;
          end;
        end;
      end;
    end;
    // Заходим на склад и продаём
    if Pos('Аккаунт - Торговая лавка', HTMLSource) > 0 then
    begin
      for I := 0 to WebBrowser1.OleObject.Document.Forms.Length - 1 do
      begin
        Form := WebBrowser1.OleObject.Document.Forms.Item(I).elements;

        for I2 := 0 to Form.Length - 1 do
        begin
          if ((Form.Item(I2).type = 'submit') and (Form.Item(I2).name = 'sell')) then
          begin
            Form.Item(I2).Click;
          end;
        end;
      end;
    end;

    LoadComplete := True;
  end;
end;
Всё бы может ничего, только вот WebBrowser1DocumentComplete под конец уходит в бесконечный цикл + каким-то образом при Accounts[IMas].Login, где IMas = 2 выдирается первая запись из массива с ссылками. IMas - это переменная, которая держит число, с которым мы обращаемся к массиву с аккаунтами, максимум может быть = 1.

Последний раз редактировалось Shouldercannon; 24.07.2015 в 23:45.
Shouldercannon вне форума Ответить с цитированием
Старый 25.07.2015, 07:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В бесконечный цикл он уходит скорее всего из-за субмитирования формы. Ты когда клик посылаешь - страница перезагружается, соответственно опять DocumentComplete срабатывает, и там опять делаешь клик, и опять срабатывает...
Короче "чейтането" у тебя со стратегией... Не нравится мне именно такой подход.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.07.2015, 12:42   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Тоже не нравится. Другой придумать не получается.

Последний раз редактировалось Shouldercannon; 25.07.2015 в 13:55.
Shouldercannon вне форума Ответить с цитированием
Старый 25.07.2015, 17:39   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

А пароль не слишком уязвим? Можно зашифровать с ключом последнего логина, например и при каждом запуске программы менять ключ.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 25.07.2015, 18:25   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

пароль вообще не в шифрованном виде отправляется
Shouldercannon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает setInterval внутри цикла. JavaScript Luca Brasi Помощь студентам 2 11.01.2015 13:05
Цикл внутри цикла? Number_30 Microsoft Office Excel 14 08.02.2013 09:35
iostream указатель работает только внутри цикла Egyptorium Помощь студентам 2 04.01.2012 13:54
цикл for i:=0 to count -1 do. Уменьшать счётчик i внутри цикла... Человек_Борща Общие вопросы Delphi 10 01.07.2011 21:11
Сокет не может дождаться ответа AxenicX C/C++ Сетевое программирование 1 14.05.2010 16:49