0

我通过自动化网站,输入数据,然后提交该网站并在它响应时获取数据来在网络中进行项目。在 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 有关。

(对不起,因为我的英语不好)

4

1 回答 1

1

尝试使用 WatiN 进行网络自动化。其中许多任务都是为您包装的。

于 2012-11-01T22:28:06.453 回答