Программа для автоматизации ввода полей формы и проверки результатов веб-страницы


Я пытаюсь создать программу на C# (возможно, с помощью WinForms), которая введет номер лицензии в поле формы конкретного веб-сайта и проверит, является ли номер лицензии действующей лицензией.

Я не знаю, с чего начать, так как я даже не могу найти идентификатор поля формы в исходном коде веб-сайта и не знаю, какие технологии использует веб-сайт.

Кроме того, целью этой программы будет ввод списка номеров лицензий и возвращайте имена и статус проверки каждой лицензии. Источником данных является веб-сайт.

Любая информация о том, как это сделать, была бы очень признательна, я являюсь промежуточным разработчиком C# - в основном работал в ASP.Net, хотя feel Winforms может быть лучше подходит для этого проекта.

С Уважением

2 3

2 ответа:

Вы можете использовать WebBrowser управление:

  1. Вы можете загрузить страницу, используя webBrowser1.Navigate("url of site")
  2. найдите элементы на странице, используя webBrowser1.Document.GetElementById("buttonid") Также вы можете перебирать HtmlElement из webBrowser1.Document.Body.All и проверять, например, element.GetAttribute("value") == "some vaule", чтобы найти его.
  3. задайте значение для элемента с помощью element.InnerText ="some value" или element.SetAttribute("value", "some value")
  4. отправьте свою форму, вызвав команду отправить форму или нажав ее кнопку Отправить с помощью element.InvokeMember("method")

Пример

Например, если вы просматриваете google и смотрите на источник страницы, вы вы увидите, что имя текстового поля поиска - "q", а имя формы, содержащей поле поиска, - "f", поэтому вы можете написать эти коды для автоматизации поиска.

  1. создайте форму с именем BrowserSample.
  2. из toolbox, перетащите WebBrowser и поместите на форму.
  3. Hanfdle Load событие формы и перейдите в google.
  4. обработайте DocumentCompleted событие webBrowser1 и найдите f и найдите q и установите InnerText из q и вызовите submit из f. Это событие срабатывает после навигации и документа загрузка завершена.
  5. в реальном приложении добавьте обязательную проверку null.

Код:

private void BrowserSample_Load(object sender, EventArgs e)
{
    this.webBrowser1.Navigate("https://www.google.com/");
}

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //Because submitting f causes navigation
    //to pervent a loop, we check the url of navigation 
    //and if it's different from google url, return
    if (e.Url.AbsoluteUri != "https://www.google.com/")
        return;
    var f = this.webBrowser1.Document.Body.All.GetElementsByName("f")
                .Cast<HtmlElement>()
                .FirstOrDefault();

    var q = f.All.GetElementsByName("q")
                .Cast<HtmlElement>()
                .FirstOrDefault();

    q.InnerText = "C# Webbrowser Control";
    f.InvokeMember("submit");
}

Если вы запустите программу, она сначала перейдет в google, а затем покажет результат поиска:

Введите описание изображения здесь

В вашем особом случае

Так как сайт загружает контент с помощью ajax, то вы должны сделать задержку в DocumentCompleted:

async void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.AbsoluteUri != "https://www.onegov.nsw.gov.au/PublicRegister/#/publicregister/search/Security")
        return;

    await Task.Delay(5000);
    var f = this.webBrowser1.Document.Body.All.GetElementsByName("searchForm")
                .Cast<HtmlElement>()
                .FirstOrDefault();

    var q = f.All.GetElementsByName("searchText")
                .Cast<HtmlElement>()
                .FirstOrDefault();

    q.InnerText = "123456789";
    f.InvokeMember("submit");
}

Не забудьте добавить using System.Threading.Tasks; или если вы используете .Net 4.0, вы просто можете использовать System.Threading.Thread.Sleep(5000) и удалить async / await.

Похоже, что сайт использует сообщения JSON. Если у вас есть FireFox откройте Developer - > Network и посмотрите на запись "PerformSearch". Это расскажет вам все, что вам нужно знать о том, что веб-сайт ожидает в запросе на публикацию, чтобы вы могли прочитать ответ.