Программа для автоматизации ввода полей формы и проверки результатов веб-страницы
Я пытаюсь создать программу на C# (возможно, с помощью WinForms), которая введет номер лицензии в поле формы конкретного веб-сайта и проверит, является ли номер лицензии действующей лицензией.
Я не знаю, с чего начать, так как я даже не могу найти идентификатор поля формы в исходном коде веб-сайта и не знаю, какие технологии использует веб-сайт.
Кроме того, целью этой программы будет ввод списка номеров лицензий и возвращайте имена и статус проверки каждой лицензии. Источником данных является веб-сайт.
Любая информация о том, как это сделать, была бы очень признательна, я являюсь промежуточным разработчиком C# - в основном работал в ASP.Net, хотя feel Winforms может быть лучше подходит для этого проекта.
С Уважением
2 ответа:
Вы можете использовать
WebBrowser
управление:
- Вы можете загрузить страницу, используя
webBrowser1.Navigate("url of site")
- найдите элементы на странице, используя
webBrowser1.Document.GetElementById("buttonid")
Также вы можете перебиратьHtmlElement
изwebBrowser1.Document.Body.All
и проверять, например,element.GetAttribute("value") == "some vaule"
, чтобы найти его.- задайте значение для элемента с помощью
element.InnerText ="some value"
илиelement.SetAttribute("value", "some value")
- отправьте свою форму, вызвав команду отправить форму или нажав ее кнопку Отправить с помощью
element.InvokeMember("method")
Пример
Например, если вы просматриваете google и смотрите на источник страницы, вы вы увидите, что имя текстового поля поиска - "q", а имя формы, содержащей поле поиска, - "f", поэтому вы можете написать эти коды для автоматизации поиска.
- создайте форму с именем
BrowserSample
.- из toolbox, перетащите
WebBrowser
и поместите на форму.- Hanfdle
Load
событие формы и перейдите в google.- обработайте
DocumentCompleted
событиеwebBrowser1
и найдитеf
и найдитеq
и установитеInnerText
изq
и вызовите submit изf
. Это событие срабатывает после навигации и документа загрузка завершена.- в реальном приложении добавьте обязательную проверку 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.