0

これが私の要件です。英数字の文字列を入力として受け取り、データをテーブル要素に取得する公開 Web サイトがあります (ボタンのクリックを介して)。テーブル要素には、対応するデータが取り込まれるラベルがいくつかあります。特定の文字列が Web サイトのデータベースに存在するかどうかを確認できるツール/ソリューションが必要です。その場合、その文字列のすべての出現のすべての ID を取得します。Web サイトの「ソースの表示」 (JavaScript は使用されていません) を見て、input 要素名とボタン要素名に注目し、既存のサンプルの助けを借りて、実用的なソリューションを得ることができました。以下は機能するコードですが、より優れたより高速なアプローチがあるかどうかを確認したいと思います。以下のコードには、「無限ループ」の問題などの問題があることを知っています。

    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

検索ボタンがクリックされた後のページに、このコード スニペットを使用できるよりも 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 に答える