我通过自动化网站,输入数据,然后提交该网站并在它响应时获取数据来在网络中进行项目。在 google 上冲浪,我决定使用 Webbrowser Control 在 codeproject 中选择最好的 acticle。
http://www.codeproject.com/Articles/50544/Using-the-WebBrowser-Control-in-ASP-NET
有很多问题我无法通过谷歌找到解决方案来追踪和尝试,但没有任何改变。
我要提取数据的网站的提交表单如下:
<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 });
提交表格。
注意:一件很奇怪的事情是:当我在网上找到时,我发现“submitFlight()”可以工作。它触发了 bookNow(),之后, bookNow() 触发了另一个脚本“formsubmit()”,但我在源代码中的任何地方都找不到“formsubmit()”,包括指向页面的其他一些 javascript 链接。
因为我已经成功地运行了这个项目,现在它也没有向网站发布任何数据,所以我认为问题可能出在网站之前设置的 cookie 上。我已经去 IE (Internet Explorer) 删除所有 cookie。之后,代码再次工作以提交输入数据,但方式错误。我发现一些 cookie 仍然设置,这是关于文本框“txtDepart”设置“2012 年 1 月 11 日”的旧状态
我能弄清楚我的问题可能与网站的 javascript 或/和它设置的 cookie 有关。
(对不起,因为我的英语不好)