ウェブサイトを自動化し、データを入力してから、このサイトを送信し、応答したときにデータを取得することで、ウェブでプロジェクトを作成しています。Google でサーフィンをして、Webbrowser Control を使用して codeproject で最適なアクティクルを選択することにしました。
http://www.codeproject.com/Articles/50544/Using-the-WebBrowser-Control-in-ASP-NET
Googleで解決策を見つけて追跡して試してみることができないほど多くの問題がありますが、何も変わりません。
データを抽出したいサイトには、次のような送信フォームがあります。
<form id = "ctl103">
<input type="radio" id="rdoFlightTypeReturn" name="rdoFlightType"
value="return" checked="checked"/>
<input type="radio" id="rdoFlightTypeOneWay" name="rdoFlightType"
value="oneway" />
<input name="so long" type="text" id="txtOrigin" autocomplete="off" />
<input name="very much" type="text" id="txtDestination" autocomplete="off" />
<input type="text" id="txtDepart" autocomplete="off" name="txtDepart"/>
//dd/mm/yyyy format
<input type="text" id="txtReturn" autocomplete="off" name="txtReturn" />
//dd/mm/yyyy format
<button type="submit" class="png-bg" id="btnSearchForFlights">Search Flight</button>
</form>
このフォームを送信するために私が書いたコード:
void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlDocument doc = ((WebBrowser)sender).Document;
if (doc.Title.Equals("Home") && loginCount++ < 3)
{ try
{
HtmlElement element = doc.GetElementById("rdoFlightTypeOneWay");
element.InvokeMember("click");
}
catch {
ieBrowser.Navigate("http://www.my---favoritesite.com");
return;
}
doc.GetElementById("txtOrigin").InnerText = "SGN";
doc.GetElementById("txtDestination").InnerText = "HAN";
doc.GetElementById("txtDepart").InnerText = "03/11/2012";
doc.InvokeScript("setTimeout", new object[] { "submitFlights()", 20 });
}
else
{
doc.InvokeScript("setTimeout", new object[] {
string.Format("window.external.getHtmlResult({0})", navigationCounter), 10 });
}
}
問題は:
通常、最初にプロジェクトを実行するときはほとんどありませんが、その後は問題ありません。その理由は、間違った方法で送信またはポストバックできないためだと思うので、次のようなことを試します。
HtmlElement button_searchFlight = doc.GetElementById("btnSearchForFlights");
button_searchFlight.InvokeMember("click");
また
mshtml.HTMLAnchorElementClass obj =
(HTMLAnchorElementClass)button_searchFlight.DomElement;
obj.click();
また
mshtml.HTMLButtonElementClass button1 =
(mshtml.HTMLButtonElementClass)button_searchFlight.DomElement;
button1.click();
また
doc.InvokeScript("submitFlight()");
または doc.GetElementById("ctl03").InvokeMember("submit");
それらすべてがうまくいかないか、フォームをリセットするか、何もしないので、私は戻ってきました
doc.InvokeScript("setTimeout", new object[] { "submitFlights()", 20 });
フォームを送信します。
注: 非常に奇妙なことの 1 つは、Web で見つけたときに、「submitFlight()」が機能することを発見したことです。bookNow() を起動し、その後、bookNow() が別のスクリプト「formsubmit()」を起動しましたが、ページへの他の JavaScript リンクを含むソース コードのどこにも「formsubmit()」が見つかりません。
プロジェクトの実行に成功したことがありますが、現在はサイトにデータを投稿していないため、サイトが以前に設定した Cookie に問題がある可能性があります。すべての Cookie を削除するために IE (インターネット エクスプローラー) にアクセスしました。その後、コードは入力データを送信するために再び機能しましたが、間違った方法で実行しました。私はいくつかのクッキーがまだ設定されていることを発見しました。それはテキストボックスの古い状態に関するものでした。
私が理解できるのは、サイトのJavaScriptまたは/および設定されたCookieに関する問題である可能性があります。
(私の英語が下手なのでごめんなさい)