等待网页加载完成的C#代码
我一辈子都不知道如何让我的C代码等到网页加载完毕。我无法完成ie.documentcomplete或ie.documentcomplete,甚至无法接近工作状态。事实上,即使我正在引用system.windows.forms程序集,我也无法让VS2012将documentcompleted作为下拉选项提供给我。请帮忙 谢谢等待网页加载完成的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
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。非常感谢你。你是个巫师。