C#多线程处理webbrowser及InvokeMember(click)无响应的问题

C# 管理 WebBrowser Print webBrowser 在打印时想要监控打印状态可以做如下的事情 1.监控是否已经执行打印命令 2.是否打印事件已完成 监控打印执行 需要引用 Microsoft Internet Controls 具体如下: using System.Reflection; using System.Threading; using SHDocVw; private void PrintFactur 阅读详情

多线程处理webbrowser的相关问题,并解决触发click事件,js无响应问题。

最近刚好碰上一个需求:循环遍历网页元素,找到innerText为指定的内容时,就模拟人工点击。

解决办法:使用WebBrowser将指定位置的文档加载到 WebBrowser 控件中(注:这里的webbrowser是在拉控件的方式,而不是直接在代码中new)

源码如下:


private void loadPage(object URL)
        {
            try
            {
                string url = (string)URL;              
                browser.Navigate(url);               
                while (true)
                {
                   Application.DoEvents();               
                   if(browser.ReadyState != WebBrowserReadyState.Complete)
                  {
                        break;
                   }
                }                               
                HtmlDocument document = browser.Document;
                HtmlElementCollection elems = browser.Document.GetElementsByTagName("a");
                foreach (HtmlElement em in elems)
                {
                    if (em.InnerText == "测试")
                    {         
                        em.InvokeMember("click");//"触发点击事件"
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }     

有一点没说到,上面的只适合单线程的,如果执行以上代码的是在新开辟的一个线程中的话,会碰到一系列的问题......(很遗憾,我没有将那些问题记录下来,但相信如果你跟我有着同样的需求的话,即采用多线程的方式处理webbrowser加载的网页内容的话,可以继续看下去,也许对你有所帮助)

网上一搜,关于webbrowser在多线程中的使用着实会碰到很多问题……后来,经过自己不断的Google(在这过程中你能体会到百度离Google还有多远),有找到了几篇对我有所帮助的文章:

关于线程的知识:http://www.cnblogs.com/JimmyZheng/archive/2012/06/10/2543143.html

WebBrowser多线程带来的麻烦:http://www.cnblogs.com/xjfhnsd/archive/2010/03/14/1685441.html

WebBrowser 显示Html内容3点细节技巧: http://www.cnblogs.com/cyq1162/archive/2012/03/27/2419655.html

 

接着,我就使用webclient配合webbrowser从而顺利的解决了问题。

WebClient:下载指定网址的源码

WebBrowser:navigate一个空白页(具体参考:)

注:这里的WebBrowser要从代码中new,如果是拉控件的方式创建的,将会报错:"指定的转换无效"

这里我就写一个以上列出的文章所没有提到的。

比如,我们要click的网页元素是通过js来触发的,而使用webclient只能下载指定的url的网页源码,无法自动加载相关的js,因此导致在使用invokeMember("click")的时候,没能见到预期效果。

解决办法:将指定的js文件也下载下来(或者将需要用到的js方法放到本地,使用webclient  载入进来也行)

我这里说的只是一个大题的思路和解决途径

最后,贴上一段测试代码:

C#源码:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net;
namespace webbrowser控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            ParameterizedThreadStart pt;
            pt = new ParameterizedThreadStart(loadPage);
            Thread td = new Thread(pt);
            td.Name = "主线程";
            td.SetApartmentState(ApartmentState.STA);//在线程启动前设置其单元状态
            td.Start("http://127.0.0.1/test.html");           
        }
        private void loadPage(object URL)
        {
            try
            {
                string url = (string)URL;
                WebBrowser browser = new WebBrowser();//当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
                browser.ScriptErrorsSuppressed = true;
                //browser.Navigate(url);
                //browser.DocumentCompleted += browser_DocumentCompleted;
                browser.Navigate("about:blank");
                string htmlcode = GetHtmlSource(url);
                string js = GetHtmlSource("http://127.0.0.1/MY/test/js.html");//载入js
                browser.Document.Write(js); 
                textBox1.Text = htmlcode;
                //while (browser.ReadyState != WebBrowserReadyState.Complete)  //报错“指定的转换无效”
                //    Application.DoEvents();
                browser.Document.Write(htmlcode);
                //MessageBox.Show(browser.DocumentText);
                HtmlDocument document = browser.Document;
                HtmlElementCollection elems = browser.Document.GetElementsByTagName("a");
                foreach (HtmlElement em in elems)
                {
                    if (em.InnerText == "点击")
                    {         
                        em.InvokeMember("click");//alert("触发点击事件")
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                //MessageBox.Show("当前执行线程:"+Thread.CurrentThread.Name);
            }
        }
        //WebClient取网页源码
        private string GetHtmlSource(string Url)
        {
            string text1 = "";
            try
            {
                WebClient wc = new WebClient();

                text1 = wc.DownloadString(Url);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            return text1;
        }

    }
}

test.html:


<html>
<head>
<title></title>
<script type="text/javascript" src="a.js"></script>
</head>
<body>
<a href="javascript:void();" onclick="t()">点击</a>
</body>
</html>

js:

<script type="text/javascript">
function t()
{
    alert('ddd');
}
</script>

IMU660RA姿态解算实战:从传感器滤波到欧拉角输出的完整实现 本文详细介绍了IMU660RA姿态解算的完整实现过程,从传感器滤波到欧拉角输出。通过实战案例和代码示例,展示了如何有效处理陀螺仪和加速度计的噪声问题,并选择合适的算法进行数据融合和姿态解算。特别强调了欧拉角输出中的坐标系对齐和动态补偿技巧,帮助工程师快速掌握IMU660RA的应用。 阅读详情

相关推荐

海思方案定制hi3531dv200/SS528 DVR方案解析:从硬件选型到编解码实战应用

海思方案,Hi3518EV100,Hi3518CV100,Hi3515CV100,Hi3516CV100,Hi3516ECV100,Hi3516D,Hi3516A,Hi3519,Hi3520D,Hi3521A,Hi3535,Hi3531,Hi3536,Hi3536C,Hi3536D,Hi3518EV200,Hi3518EV201,Hi3520DV200,Hi3516CV200,Hi3516CV300,Hi3516AV200,Hi3520DV300,Hi3519V101,sd3403,hi3519av200

1585

C# webbrowser 获取网页元素 示例代码

在应用webbrowser对网页进行自动化操作时,不能有效地获取网页元素,往往是后续编程的拦路虎,原因是webbrowser提供的GetElementById()、GetElementFromPoint()、GetElementsByTagName()共3个方法,如果不仔细的研究,使用起来还真的是有些障碍。为了解决这些问题,我只要硬着头皮,费劲心思地研究了一番。至于说有什么成果没有,那就只有本文的读者自己体会了。下面用图片给大家展示一下,同时,把代码亮出来分享,以对大家有些小小的帮助。 网页元素要想看清楚

weixin_39410618的博客 4070

四、嘉立创EDA原理图绘制实战:从零搭建STM32温湿度监测系统

本文详细介绍了使用嘉立创EDA标准版从零开始绘制STM32温湿度监测系统原理图的完整流程。涵盖核心元器件选型、电源电路设计、ADC按键创新应用及模块化布局技巧,帮助电子爱好者快速掌握STM32系统设计,提升嵌入式开发实战能力。

h0i1j2k3l的博客 883

WebBrowser1_DocumentCompleted事件里面无法触发InvokeMember("click")

在WebBrowser1_DocumentCompleted事件里面加入网页操作之后,任何操作都没反应,如:foreach (HtmlElement em in extendedWebBrowser1.Document.Links) { if ((em.InnerText == "购买") && (em.GetAttribute("title") == "确认信息。")...

weixin_30426879的博客 193

FPGA实现16x16点阵汉字滚动显示:Verilog代码与Quartus仿真详解

本文详细介绍了如何使用FPGA实现16x16点阵汉字滚动显示,包括Verilog代码设计、Quartus仿真及硬件连接技巧。通过字模数据存储和扫描控制逻辑,实现汉字的动态显示效果,并提供了优化建议和常见问题解决方案,适合FPGA开发者和硬件爱好者学习参考。

weixin_29172963的博客 350

PID算法(位置式pid算法和增量式pid算法)

PID 算法是闭环控制系统中常用的算法,PID 分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控。

m0_57678852的博客 2万+

为何使用WEBBROWSER的对象CLICK事件不能生效

     最近为方便同事,做了一个海淀驾校约车的软件。以前使用VS2003下的WebBrowser控件虽然没有封装,但是掌握了技巧以后很容易。所以信心满满的做这个软件,惊喜的发现,WebBrower已经被封装过了,很多功能可以很轻松的使用。       但是做到自动约车的时候,需要两次连续的点击动作,结果发现,点击事件无法立刻被执行。调用点击事件代码如下:void webBrowser

小D的日记 2310

Ansys Lumerical双层扭曲液晶偏振光栅仿真:宽角度衍射效率优化

Ansys Lumerical双层扭曲液晶偏振光栅仿真研究 摘要 本文采用Ansys Lumerical软件平台,对双层扭曲液晶偏振光栅的宽角度衍射特性进行系统仿真研究。针对6μm周期的液晶光栅结构,以1050nm、1064nm和1550nm三个近红外波段为研究对象,在±40°入射角范围内优化平均衍射效率。研究基于液晶材料的双折射特性(Δn=0.135),通过构建两层扭曲方向相反的液晶层结构,扫描0-90°单层扭曲角度和不同厚度参数,利用RCWA求解器进行严格耦合波分析~~~~~~~

huanghm88的专栏 164

C#多线程处理webbrowser及InvokeMember("click")无响应的问题

文章重点:多线程处理webbrowser的相关问题,并解决触发click事件,js无响应问题 最近刚好碰上一个需求:循环遍历网页元素,找到innerText为指定的内容时,就模拟人工点击 解决办法:使用WebBrowser将指定位置的文档加载到 WebBrowser 控件中(注:这里的webbrowser是在拉控件的方式,而不是直接在代码中new) 源码如下: private void...

weixin_34388207的博客 368

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

小白也能懂!一步步教你用FPGA加速YOLO目标检测(入门篇)

安装到 PYNQ 开发板中。该库为 PYNQ 平台提供了对量化神经网络(如 YOLO)的硬件加速支持。确保你的电脑已连接到外网,如 WiFi 或热点(手机热点理论上也可用,未实测)。当你看到安装成功的提示后,打开 Jupyter Notebook,你会发现在。趁这个机会,泡了杯茶,刷了会儿手机,顺便感慨了一下开源社区的强大……页面中多出了一些新的项目文件夹 —— 这就是我们刚才安装的。参数,浅拷贝只克隆最近一次提交,减少数据量,避免超时问题。初始化,打开该文件,即可运行我们的Tiny YOLO。

FJN110的博客 1597

webbrowser获取无ID无Name控件并模拟点击

常见的获取控件并点击(自动登录): var txtUserID = wbsTask.Document.All["userName"]; var txtPsd = wbsTask.Document.All["password"]; var txtVrf = wbsTask.Document.All["code"];var btnSubmit = wbsTask.Document.All

GIS骆驼的GIS博客 3069

C# webBrowser禁止在新窗口打开,强制在本窗口打开

进行webBrower开发的时候,肯定都会遇到一个问题。 那就是怎么样强制在本窗口打开新窗口的问题。 网上最常见的解决方法就是, 在NewWindow事件中取得要打开的网址,取消打开新窗口,然后在本窗口打开要转向的网址 p rivate void webBrowser_1_NewWindow(object sender, CancelEventArgs e) {

Lassewang的成长历程 4162

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c#中的webbrowser 多线程 【转载】

我们在做采集软件的时候 有些网站通过直接分析html文本是很麻烦的事情 在利用WinForm编程的情况下 有一种更好的方式当然是分析HtmlDocument 然而,这HtmlDoucment并不能直接创建 它必须由 WebBroswer控件Navigate生成一个页面后 才能取得wb.HtmlDocument 然后就可以对HtmlDocument的各元素、标签进行分析。

cuoban的学习空间 1877

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c# 通过webBrowser实现打印功能

在用c#实现打印功能时,我们可以将内容先转化为网页形式或者吧模板写成固定的html格式,然后进行内容填充。 在打印过程中,我们可以用到的函数: //转到某个网址 webBrowser.Navigate(""); //直接打印 webBrowser.Print(); //预览 webBrowser.ShowPrintPreviewDialog(); //打印 webBrowser.Show...

c1149884598的博客 4384

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c#窗体开启线程无反应问题

需要在线程开启之前加上这一句 Control.CheckForIllegalCrossThreadCalls = false;//开启线程首先要将主线程不允许开启其他线程的控制关掉

Y1172215784的博客 1066

C# 下控制 WebBrower 以及 HtmlDocument

C# 下带有 WebBrowser 控件,可以用 html 来完成图文混排,报表显示和打印,比前面提供的 vc++ 下使用 IHTMLDocument 容易很多。 下面是一个可以本地生成 html 文件的class:                public CHtmlDocumentBase(WebBrowser browser, int bufferSize)      

Akron的专栏 4283

利用c#和webbrowser轻松打造注册机和回帖机

步骤如下: 第一步:获取网页调用Webbrowser 的Navigate系列函数。等待网页装载完成,得到document对象。 在调用 webBrowser.Document 之前,请确保 Webbrowser 网页装载完成,可以通过Webbrowser的DocumentCompleted事件进行监视。 小技巧 先指定一个变量:IsCompleted在调用Webbrowser 的Navig...

weixin_34248849的博客 418

C# webBrowser中调用HTML控件事件

有此朋友好能会和我一样,我在模以CS自动操作网页的时候也碰到过这种问题!我也在百度上找个好多资料,其中大部分都是VB的,我一个C#的没找到!后来慢慢研究我成功了!        请选择缴费类型               arrayLength = 23      arraySav = new Array(arrayLength)                       代收电费|黑龙江电

zhaoxin19870517的专栏 956

C# 使用PuppeteerSharp工具类

PuppeteerSharp 是一个用于在 .NET 平台上控制无头(Headless) Chrome 浏览器的库。它允许开发者通过编程方式模拟浏览器行为,执行网页操作,截取网页截图,获取网页内容,可以把网页转换成PDF等等

rjcql的专栏 2622

c#winform使用WebBrowser 大全

C# WinForm WebBrowser (一) MSDN资料  1、主要用途:使用户可以在窗体中导航网页。 2、注意:WebBrowser 控件会占用大量资源。使用完该控件后一定要调用 Dispose 方法,以便确保及时释放所有资源。必须在附加事件的同一线程上调用 Dispose 方法,该线程应始终是消息或用户界面 (UI) 线程。 3、WebBrowser 使用下面的成员可

tery001的专栏 2031

用webBrowser打开网页出现脚本错误怎么办

当IE浏览器遇到脚本错误时,在浏览器左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。我们在用webBrowser编写的程序打开网页,遇到脚本有问题是,会弹出一个错误提示框,需要确认后才能够进行执行。如果我们设计的程序是用来自动处理网页的,那么在出现这种情况时,程序运行被打断,需要人工干预。这显然无法达到我们的要求。 那么,在使用webBrowser...

u014712365的博客 815
上一篇: C#: 通过html调用WinForm
下一篇: WebBrowser多线程带来的麻烦 .
cuoban
博客等级 码龄24年 239粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值