程序自动化表单字段输入和网页结果检查
我正在尝试使用C#(可能使用WinForms)创建一个程序,该程序将在特定网站的表单字段中输入许可证号,并validation许可证号是否是当前有效的许可证。
我不确定从哪里开始,因为我甚至无法在网站的源代码中找到表单字段ID,并且不确定网站使用什么技术。
此外,该程序的目的是输入许可证号列表并返回每个许可证的名称和validation状态。 数据源是网站。
关于如何解决这个问题的任何信息都将非常感激,我是一名中级C#开发人员 – 主要在ASP.Net工作,但感觉Winforms可能更适合这个项目。
亲切的问候
您可以使用WebBrowser
控件:
- 您可以使用
webBrowser1.Navigate("url of site")
加载页面 - 使用
webBrowser1.Document.GetElementById("buttonid")
在页面中查找元素也可以迭代webBrowser1.Document.Body.All
HtmlElement
并检查示例element.GetAttribute("value") == "some vaule"
来查找它。 - 使用
element.InnerText ="some value"
或element.SetAttribute("value", "some value")
设置元素的element.SetAttribute("value", "some value")
- 通过调用表单提交或使用
element.InvokeMember("method")
单击其提交按钮来提交表单
例
例如,如果您浏览谷歌并查看页面源,您将看到搜索文本框的名称为“q”,并且包含搜索框的表单的名称为“f”,因此您可以编写此代码以自动搜索。
- 创建名为
BrowserSample
的表单。 - 从工具箱中,拖动
WebBrowser
并放在窗体上。 - Hanfdle
Load
forms的事件并导航到谷歌。 - 处理
webBrowser1
DocumentCompleted
事件并找到f
并找到q
并设置q
InnerText
并调用f
提交。 导航和文档加载完成后,将触发此事件。 - 在实际应用程序中添加所需的空检查。
码:
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() .FirstOrDefault(); var q = f.All.GetElementsByName("q") .Cast () .FirstOrDefault(); q.InnerText = "C# Webbrowser Control"; f.InvokeMember("submit"); }
如果您执行该程序,它首先导航到谷歌,然后显示搜索结果:
在你的特殊情况下
由于网站使用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() .FirstOrDefault(); var q = f.All.GetElementsByName("searchText") .Cast () .FirstOrDefault(); q.InnerText = "123456789"; f.InvokeMember("submit"); }
不要忘记using System.Threading.Tasks;
添加using System.Threading.Tasks;
或者如果你使用.Net 4.0,你可以使用System.Threading.Thread.Sleep(5000)
并删除async / await。
看起来该网站使用JSON POST。 如果你有FireFox打开Developer – > Network并查看“PerformSearch”条目。 这将告诉您在POST请求中您需要知道的所有内容,以便您可以阅读响应。