等待网页加载完成的C#代码

等待网页加载完成的C#代码,c#,internet-explorer,load,webpage,C#,Internet Explorer,Load,Webpage,我一辈子都不知道如何让我的C代码等到网页加载完毕。我无法完成ie.documentcomplete或ie.documentcomplete,甚至无法接近工作状态。事实上,即使我正在引用system.windows.forms程序集,我也无法让VS2012将documentcompleted作为下拉选项提供给我。请帮忙 谢谢 public static string getTheBlockArray() { SHDocVw.InternetExplorer

我一辈子都不知道如何让我的C代码等到网页加载完毕。我无法完成ie.documentcomplete或ie.documentcomplete,甚至无法接近工作状态。事实上,即使我正在引用system.windows.forms程序集,我也无法让VS2012将documentcompleted作为下拉选项提供给我。请帮忙

谢谢

public static string getTheBlockArray()
        {
            SHDocVw.InternetExplorer IE = new SHDocVw.InternetExplorer();
            string id = "resultsTable";
            object Empty = 0;
            object URL = "http://www.cmegroup.com/clearing/trading-practices/block-data.html#contractTypes=FUT,OPT,SPD&exchanges=XCME&assetclass=assetClassId=1,6";
            IE.Navigate2(ref URL, ref Empty, ref Empty, ref Empty, ref Empty);

            // Some code here to wait until the webpage loads

            object theRange = IE.Document.getelementbyID(id).innertext;
            string blockString = theRange.ToString();
            IE.Quit();
            return blockString;
        }
试试这个:

while(IE.Busy)
{
    //You might want to sleep or count or something.
    //System.Threading.Thread.Sleep(1000);
}

难道没有完成的工作吗

如果iy有效,您可以尝试这样做:

IE.completed += (s, e) => {
  // your code

})

由javascript代码通过异步请求填充的resultsTable元素的内容。因此,您不应该处理DOM,而是必须像javascript那样直接查询数据。下面的代码可能是一个很好的起点

  class Program
  {
    private static readonly string url = "http://www.cmegroup.com/clearing/trading-practices/CmeWS/mvc/xsltTransformer.do?xlstDoc=/XSLT/md/blocks-records.xsl&url=/da/BlockTradeQuotes/V1/Block/BlockTrades?exchange={0}&foi={1}&{2}&tradeDate={3}&sortCol={4}&sortBy={5}&_=1372913232800";

    static void Main(string[] args)
    {
      Exchange exchange = Exchange.XCME;
      ContractType contractType = ContractType.FUT | ContractType.OPT | ContractType.SPD;
      string assetClass = "assetClassId=0"; // See asset_class dropdown options in HTML source for valid values
      DateTime tradeDate = new DateTime(2013, 7, 3);
      string sortCol = "time"; // Column to sort
      SortOrder sortOrder = SortOrder.desc;

      string xml = QueryData(exchange, contractType, assetClass, tradeDate, sortCol, sortOrder);
      Console.WriteLine(xml);
    }

    private static string QueryData(Exchange exchange, ContractType contractType, string assetClass, DateTime tradeDate, string sortCol, SortOrder sortOrder)
    {
      string exc = GetEnumString(exchange);
      string ct = GetEnumString(contractType);
      string td = tradeDate.ToString("MMddyyyy");
      string query = string.Format(url, exc, ct, assetClass, td, sortCol, sortOrder.ToString());

      WebRequest request = WebRequest.Create(query);
      request.Credentials = CredentialCache.DefaultCredentials;
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      {
        using (Stream stream = response.GetResponseStream())
        {
          using (StreamReader reader = new StreamReader(stream))
          {
            return reader.ReadToEnd();
          }
        }
      }
    }

    private static string GetEnumString(Enum item)
    {
      return item.ToString().Replace(" ", "");
    }
  }

  [Flags]
  enum Exchange
  {
    /// <summary>
    /// CBOT.
    /// </summary>
    XCBT = 1,

    /// <summary>
    /// CME.
    /// </summary>
    XCME = 2,

    /// <summary>
    /// COMEX.
    /// </summary>
    XCEC = 4,

    /// <summary>
    /// DME.
    /// </summary>
    DUMX = 8,

    /// <summary>
    /// NYMEX.
    /// </summary>
    XNYM = 16
  }

  [Flags]
  enum ContractType
  {
    /// <summary>
    /// Futures.
    /// </summary>
    FUT = 1,

    /// <summary>
    /// Options.
    /// </summary>
    OPT = 2,

    /// <summary>
    /// Spreads.
    /// </summary>
    SPD = 4
  }

  enum SortOrder
  {
    /// <summary>
    /// Ascending.
    /// </summary>
    asc,

    /// <summary>
    /// Descending.
    /// </summary>
    desc
  }
类程序
{
专用静态只读字符串url=”http://www.cmegroup.com/clearing/trading-practices/CmeWS/mvc/xsltTransformer.do?xlstDoc=/XSLT/md/blocks-records.xsl&url=/da/BlockTradeQuotes/V1/Block/BlockTrades?exchange={0}&foi={1}&{2}&tradeDate={3}&sortCol={4}&sortBy={5}&&uu=1372913232800”;
静态void Main(字符串[]参数)
{
Exchange=Exchange.XCME;
ContractType ContractType=ContractType.FUT | ContractType.OPT | ContractType.SPD;
string assetClass=“assetClassId=0”;//有关有效值,请参阅HTML源中的asset_类下拉选项
DateTime tradeDate=新的日期时间(2013,7,3);
字符串sortCol=“time”;//要排序的列
SortOrder SortOrder=SortOrder.desc;
字符串xml=QueryData(exchange、contractType、assetClass、tradeDate、sortCol、sortOrder);
Console.WriteLine(xml);
}
私有静态字符串查询数据(Exchange Exchange、ContractType ContractType、string assetClass、DateTime tradeDate、string sortCol、SortOrder SortOrder)
{
string exc=GetEnumString(交换);
字符串ct=GetEnumString(contractType);
字符串td=tradeDate.ToString(“MMddyyyy”);
字符串查询=string.Format(url、exc、ct、assetClass、td、sortCol、sortOrder.ToString());
WebRequest=WebRequest.Create(查询);
request.Credentials=CredentialCache.DefaultCredentials;
使用(HttpWebResponse=(HttpWebResponse)request.GetResponse())
{
使用(Stream=response.GetResponseStream())
{
使用(StreamReader=新StreamReader(stream))
{
返回reader.ReadToEnd();
}
}
}
}
私有静态字符串GetEnumString(枚举项)
{
return item.ToString().Replace(“,”);
}
}
[旗帜]
枚举交换
{
/// 
///CBOT。
/// 
XCBT=1,
/// 
///继续医学教育。
/// 
XCME=2,
/// 
///纽约商品交易所。
/// 
XCEC=4,
/// 
///二甲醚。
/// 
DUMX=8,
/// 
///纽约商品交易所。
/// 
XNYM=16
}
[旗帜]
枚举契约类型
{
/// 
///未来。
/// 
FUT=1,
/// 
///选项。
/// 
OPT=2,
/// 
///蔓延。
/// 
SPD=4
}
枚举排序器
{
/// 
///上升。
/// 
asc,
/// 
///下降。
/// 
描述
}
结果是xml变量()


祝您好运。

既然您使用的是winforms,您就不能使用
WebBrowser
控件及其
DocumentCompleted
事件吗?这是一个老问题,但InternetExplorer对象有一个DocumentComplete事件。只需添加
ie.DocumentComplete+=ie_DocumentComplete并在事件处理程序中执行getelementbyID等操作。您可能需要延迟
IE.Quit()直到获得数据。while(IE.Busy){Application.DoEvents()}不会等待页面加载。不过,谢谢。我认为您混淆了页面加载,页面完成了所有异步请求。页面在呈现库存表之前完成加载。如果您希望加载页面时表已满,那么您就运气不佳。你可以等到页面加载完成,然后再等待2或3秒,但显然这不是傻瓜式的。FWIW,使用Selenium之类的工具,你可以等待特定的dom元素出现。如果是AJAX调用,为什么不让你的应用程序执行该调用呢?Fox。非常感谢你。你是个巫师。