これが私の要件です。英数字の文字列を入力として受け取り、データをテーブル要素に取得する公開 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;
}
}
}
}
}