0

这是我的要求。有一个公共网站将字母数字字符串作为输入并将数据检索到表格元素中(通过按钮单击)。表格元素有几个标签,这些标签填充了相应的数据。我需要一个可以检查网站数据库中是否存在特定字符串的工具/解决方案。如果是这样,则检索该字符串所有出现的所有 Id。查看网站的“查看源代码”(那里没有使用 JavaScript),我注意到输入元素名称和按钮元素名称,并且在现有示例的帮助下,我能够得到一个可行的解决方案。下面是有效的代码,但我想检查是否有更好更快的方法。我知道下面的代码有一些问题,比如“无限循环”问题和其他问题。

    namespace SearchWebSite
    {
        public partial class Form1 : Form
        {
            bool searched = false;
            long i; 

            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                i = 1;
                WebBrowser browser = new WebBrowser();
                string target = "http://www.SomePublicWebsite.com";
                browser.Navigate(target);
                browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(XYZ);
            }


            private void XYZ(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser b = null;
                if (searched == false)
                {
                    b = (WebBrowser)sender;
                    b.Document.GetElementById("txtId").InnerText = "M" + i.ToString();
                    b.Document.GetElementById("btnSearch").InvokeMember("click");
                    searched = true;
                }

                if (b.ReadyState == WebBrowserReadyState.Complete)
                {
                    if (b.Document.GetElementById("lblName") != null)
                    {
                        string IdNo = "M" + i.ToString();
                        string DateString = b.Document.GetElementById("lblDate").InnerHtml;
                        string NameString = b.Document.GetElementById("lblName").InnerHtml;

                        if (NameString != null && (NameString.Contains("XXXX") || NameString.Contains("xxxx")))
                        {
                            using (StreamWriter w = File.AppendText("log.txt"))
                            {
                                w.WriteLine("Id {0}, Date {1}, Name {2}", IdNo, DateString, NameString);
                                i = i + 1;
                                searched = false;
                            }
                        }
                        else
                        {
                            i = i + 1;
                            searched = false;
                        }
                    }
                    else
                    {
                        i = i + 1;
                        searched = false;
                    }
                }
            }
        }
    }
4

1 回答 1

0

如果单击 seach 按钮后的页面包含 txtId 和 btnSearch 控件,那么您可以使用此代码片段,这不是更快,但我认为是正确的形式。

public partial class Form1 : Form
{
    bool searched = false;
    long i = 1;
    private string IdNo { get { return "M" + i.ToString(); } }
    public Form1()
    {
        InitializeComponent(); 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        i = 1;
        WebBrowser browser = new WebBrowser();
        string target = "http://www.SomePublicWebsite.com";
        browser.Navigate(target);
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(XYZ);
    }
    private void XYZ(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser b = (WebBrowser)sender;
        if (b.ReadyState == WebBrowserReadyState. Complete)
        {
            if (searched == false)
            {
                DoSearch(b); return;
            }
            if (b.Document.GetElementById("lblName") != null)
            {
                string DateString = b.Document.GetElementById("lblDate").InnerHtml;
                string NameString = b.Document.GetElementById("lblName").InnerHtml;

                if (NameString != null && (NameString.Contains("XXXX") || NameString.Contains("xxxx")))
                    using (StreamWriter w = File.AppendText("log.txt"))
                        w.WriteLine("Id {0}, Date {1}, Name {2}", IdNo, DateString, NameString);
            }
            i++;
            DoSearch(b);
        }
    }
    private void DoSearch(WebBrowser wb)
    {
        wb.Document.GetElementById("txtId").InnerText = IdNo;
        wb.Document.GetElementById("btnSearch").InvokeMember("click");
        searched = true;
    }
}
于 2014-03-02T00:02:37.857 回答