1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Вопрос к программистам: программа типа RoboForm

Тема в разделе "Софт", создана пользователем DirectX, 25.10.04.

  1. DirectX

    DirectX Активный участник

    1.880
    4
    В общем, такая задача: написать программулину, которая заполняет web-форму и нажимает кнопку Submit. Собственно, делается это всё для того, чтобы автоматически заполнить большой каталог описаний товаров из БД. Поэтотму собственно RoboForm - не вариант.
    Понятно, что делать это проще всего через ActiveX интернет эксплорер, но тут у меня возникли вопросы, каким образом можно получить с загруженной страницы все текстовые поля типа INPUT, изменить их свойство text, и нажать на кнопку?
    Начал я писать программу на C# (можно и на C++, тут просто C# нагляднее), но что-то как-то не разобрался как можно докопаться до полей и кнопочек. Фрагмент:

    Код:
    //... private void browser_NavigateComplete(...)
    mshtml.IHTMLDocument2 HTMLDoc = (mshtml.IHTMLDocument2)browser.Document;
    mshtml.IHTMLElementCollection ElementsCollection =
       (mshtml.IHTMLElementCollection)HTMLDoc.all;
    foreach (mshtml.IHTMLElement element in ElementsCollection)
    {
       string sName = element.getAttribute("name", 0).ToString();
       MessageBox.Show(sName);
    }
    
    выдаёт лишь встречающиеся в документе теги HTML, META... Тут всплывает первый вопрос: чем различаются интерфейсы HTMLDocument, HTMLDocument2, HTMLDocument3, HTMLDocument4 и HTMLDocument5? Что-то в MSDN не нашёл толкового разъяснения на эту тему. И чем также различаются команды Navigate и Navigate2. Что-то мне подсказывает, что всё довольно просто...
     
  2. pegas

    pegas Участник

    311
    0
    в приведенном примере после mshtml.IHTMLDocument2 HTMLDoc = (mshtml.IHTMLDocument2)browser.Document надо посмотреть коллекцию HTMLDoc.Forms и затем для Forms просматривать коллекцию elements, вылавливая все с tagName="INPUT" и анализируя свойство type. если type="text" присвоить значение св-ву Value, если type="submit" то сделать Click или сделать submit всей форме. А можно через Navigate, вручную сформировав PostData.Примеры есть в msdn.
     
  3. DirectX

    DirectX Активный участник

    1.880
    4
    Спасибо :)

    Собственно, главная загвоздка окзалась в NavigateComplete. Оказывается, нужно было обрабатывать DocumentComplete. И тогда уже всё ок. Кому интересно:

    Код:
    private void browser_DocumentComplete(object sender,
       Microsoft.InternetExplorer.ActiveX.NavigateEventArgs e)
    {
       lstDebug.Items.Add("DocumentComplete: " + browser.HtmlDocument.url +
       " (" + browser.HtmlDocument.all.length + ") elements");
    
       foreach (mshtml.IHTMLElement el in browser.HtmlDocument.all)
       {
          if (el.tagName == "INPUT")
          {
             string sValue = el.getAttribute("value", 0).ToString();
             lstDebug.Items.Add("  value = " + sValue + ", type = " + el.ToString());
          }
       }
    }