Webbrowser 控件的DocumentCompleted事件,对于异步加载的页面判断不是很靠谱,这个事件基本无法获得ajax加载完毕的时间点,所以会导致用读取document中的html时,数据还未加载完毕的可能。
我的做法是:
1. 等页面框架加载完毕后,调用execScript方法,将原页面中,在加载完毕后执行的某个js函数置换掉 (javascript中函数名称跟函数指针差不多)
下面这个 icfReplFunc 函数,把原来 dosomething_org 函数替换为我的 icfInJection(),在 icfInJection() 内部再调用原来的 dosomething_org 函数
String newScript = ” function icfInJection() { cc();window.external.ajaxLoadComplete(); } function icfReplFunc(){ cc=dosomething_org; dosomething_org=icfInJection; window.status=’replaced’;} icfReplFunc();”;
IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
win.execScript(newScript, “Javascript”);
2. 触发页面(模拟click)中数据加载动作;
3. 数据加载完毕后,会调用 dosomething_org(), 而实际上调用的是我注入的 icfInJection()
4. 在 icfInJection 函数中,运行“window.external.ajaxLoadComplete()”,触发c# 程序里面的 ajaxLoadComplete(), 告诉C#程序,数据加载完毕了,可以进行页面元素分析