自动化表单字段输入和网页结果检查的程序

Program to automate form field entry and result checking of webpage

我正在尝试用 C# 创建一个程序(可能使用 WinForms),它将在特定 website 的表单字段中输入许可证号并验证许可证号是否是当前有效的许可证.

我不确定从哪里开始,因为我什至在网站的源代码中找不到表单字段 ID,也不确定网站使用了什么技术。

此外,此程序的目的是输入许可证编号列表和 return 每个许可证的名称和验证状态。数据源是网站。

如能提供有关如何进行此操作的任何信息,我将不胜感激,我是一名中级 C# 开发人员 - 大部分时间都在 ASP.Net 工作,但感觉 Winforms 可能更适合此项目。

亲切的问候

网站似乎使用了 JSON POST。如果你有 FireFox 打开 Developer -> Network 并查看 "PerformSearch" 条目。这将告诉您网站在 POST 请求中期望的所有信息,以便您阅读响应。

您可以使用 WebBrowser 控件:

  1. 您可以使用 webBrowser1.Navigate("url of site")
  2. 加载页面
  3. 使用 webBrowser1.Document.GetElementById("buttonid") 在页面中查找元素您也可以遍历 webBrowser1.Document.Body.AllHtmlElement 并检查例如 element.GetAttribute("value") == "some vaule" 以找到它。
  4. 使用 element.InnerText ="some value"element.SetAttribute("value", "some value")
  5. 为元素设置值
  6. 通过调用表单提交或使用 element.InvokeMember("method")
  7. 单击其提交按钮来提交您的表单

例子

例如,如果您浏览 google 并查看页面源代码,您将看到搜索文本框的名称是 "q",包含搜索框的表单的名称是 "f", 所以你可以写这个代码来自动搜索。

  1. 创建一个名为 BrowserSample 的表单。
  2. 从工具箱中,将 WebBrowser 拖放到表单上。
  3. 处理表单的 Load 事件并导航到 google。
  4. 处理webBrowser1DocumentCompleted事件并找到f并找到q并设置qInnerText并调用[的提交=26=]。此事件在导航和文档加载完成后触发。
  5. 在实际应用程序中添加所需的空值检查。

代码:

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.