winform与web交互问题总结

最近做数据采集,碰到了很多钉子,这里一一记录下来。

很久没写东西了... ,不是没有写的,是没心情写,想的太多了,在想些什么,自己也说不清楚,往大了说关于人生,往小了说关于怎么活。扯远了,不废话了。

1、选择什么方式去采集?

网上方式很多WebClient,WebRequest和WebBroswer,分析需求之后选择 WebBroswer ,

原因有几点:

a、很多地方需要登陆之后才能采集,要做模拟登陆就会牵扯到状态保存问题等等

b、多级页面跳转,也需要模拟去触发点击事件

c、Ajax页面数据采集

2、WebBroswer 的加载状态问题,页面什么时候加载完?

WebBroswer 加载状态一个页面时候加载完 , 一开始是一个很头疼的问题 , 写了个Demo发单凭WebBrowser.ReadyState是不可靠的 , 有人直接延时,但延多少根本没办法确定。

后来测试发现WebBrowser_DocumentCompleted事件会重复触发,造成业务逻辑混乱,找到问题之后就好办了,用完就去掉它这个委托。

if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

3、如何查找某Html元素?

复制代码
HtmlDocument hDoc = webBrowser1.Document;
            
for (int i = 0; i < hDoc.All.Count; i++)
            {
                
if (hDoc.All[i].TagName.ToUpper().Equals("INPUT"))
                {
                    
if (hDoc.All[i].GetAttribute("type").Trim().Equals("button"))
                    {
                        hDoc.All[i].InvokeMember(
"click"); //触发它的事件
                        
break;
                    }
                }
            }
复制代码

 

 4、如何获取Ajax页面动态加载的数据?

 if (WebBrowser.ReadyState != WebBrowserReadyState.Complete || WebBrowserst.StatusText != "完成" && !WebBrowser.IsBusy) return;

然后再用timer延时2秒去取WebBrowser.Document,就可以了

5、如何给WebBroswer加入内容?

 //例如注册脚本
HtmlElement ele = webBrowser1.Document.CreateElement("script");
ele.SetAttribute("type", "text/javascript");
ele.SetAttribute("text", "function aa(s){alert(s);}");
WebBrowser.Document.Body.AppendChild(ele);

6、如何调用WebBroswer加载页面内的Js方法?

WebBrowser.Document.InvokeScript("aa", new object[] {'Hi , daniel;!'});

7、采集回来的Html代码不完整或者对方的代码本来就有问题怎么办?

这里要去修复Html代码,我用的HtmlParser,但效率不怎么样,目前还没发现更好的!

8、页面弹出错误脚本怎么办?

这里要分清是网页弹出来的还是浏览器弹出来的,WebBrowser本省就是一个浏览器。

如果是网页弹出来的,可以通过注入脚本去覆盖原来的alert方法,如果是浏览器的可以把WebBrowser.ScriptErrorsSuppresse设为True.

9、文件下载弹出框怎么处理?

我的解决办法是采用系统API,去找到那个窗体然后去点击上面的某个按钮。

 

 

 

posted @   Daniel Chow  阅读(3932)  评论(4编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示