浏览器自动化的一些体会4 webBrowser控件之零碎问题2

1. DocumentCompleted的多次执行问题

有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意想不到的结果。

我一般的做法,是定义一个全局变量(winform里form的成员变量),如下面代码所示:

复制代码
private string _type;

private void button1_Click(object sender, EventArgs e)
{
        _type = "test";
        webBrowser1.Navigate("http://abc.com");
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
       if (_type == "test")
       {
             _type = "";//下面的操作只能执行一次
             .........
       }
}
复制代码

这也可以用于DocumentCompleted事件需要多次触发的情况,如打开网页后,点某个链接,又打开一个网页。这时,把代码修改为

if (_type == "test") 

{

        ......

}

else if (_type == "test2")

{

        ......

}

或者用switch语句。

另外一种做法可参考 http://www.cnblogs.com/yejq/archive/2012/11/24/2785479.html,也就是,打开不同的网页,就webBrowser1.DocumentCompleted += 多个处理方法,在方法里通过检测不同的元素来处理不同的网页。好坏暂且不论。

2. 执行javascript

一种是用InvokeMember方法,常用的是InvokeMember("click"),实现点击按钮什么的。一种是用InvokeScript方法,我以前常这样用:

string js = "var a = 'test'; document.getElementById('a').value = a;";

webBrowser1.Document.InvokeScript("eval", new object[] { js});

 InvokeScript有个重载,可以返回值,利用它可以实现和网页里javascript的交互,这方面的资料很容易找,就不详细说了。

posted @   平静寄居者  阅读(261)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示