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["btnSubmit"]; var code = ReadLoginVerifyCode();
var userInfo = cboAccount.ComboBox.SelectedValue as UserInfo;
if (userInfo == null) { MessageBox.Show("获取用户信息失败!"); return; } txtUserID.SetAttribute("value", userInfo.UserID);
txtPsd.SetAttribute("value", userInfo.Password);
txtVrf.SetAttribute("value", code);if (string.IsNullOrWhiteSpace(code)) return;
btnSubmit.InvokeMember("click");//自动提交
特殊需求:查找webbrowser页面上的一个无ID无Name的A控件,后台模拟点击事件。
初始代码:
var b = wbsTask.Document.Body.InnerText.Contains("XXX");
if (!b) return false;
foreach (HtmlElement he in wbsTask.Document.GetElementsByTagName("a"))
{
if (he.InnerText == "XXX")
{
he.InvokeMember("click");
}
}
最后发现无法引发click事件,而a处的代码为:
<a href="javascript:;" onclick="dialog(650,450,'zzz','../../dialog/sss.aspx?id=bbb');return false;" class="link_t">XXX</a>
也就是说click事件调用了一个javasript函数。
为毛没有执行he.InvokeMember("click")这句呢?我百思不得其解。附带说明,上面的代码是在documentComplete事件时调用的,所以页面加载已经完成。
在网上搜寻解决方案,得几种提示
提示一:html代码已经加载完毕,但js还没有加载完毕,解决方案timer一下。
if (he.InnerText == "XXX")
{
new Action(() =>
{
System.Threading.Thread.Sleep();
new Action(() => he.InvokeMember("click")).InvokeRun(this);
}).RunThread();
}
这里的InvokeRun(this)是多线程回调,RunThread新开线程执行代码。测试结果:无效--------.
提示二:click变Click或onclick,无效。
提示三:
if (he.InnerText == "XXX")
{
wbsTask.Document.Focus();
IHTMLElement nativeElement = he.DomElement as IHTMLElement;
nativeElement.click();
}
测试结果:无效*-----
最终解决方案:
if (he.InnerText == "XXX")
{
var obj = he.DomElement;
var mi = obj.GetType().GetMethod("click");
mi.Invoke(obj, new object[]);
}
成功搞定!
webbrowser获取无ID无Name控件并模拟点击的更多相关文章
- 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”
最近公司需要把官方CPC电子申请移植到项目中,在移植完成后,撰写文档总是出现“无法获取“AxforApplication”控件的窗口句柄.不支持无窗口的 ActiveX 控件”,另楼主头疼很久,网上寥 ...
- Upload无刷新上传控件
Upload无刷新上传控件 最近在做一个web开发项目 ,用到upload上传控件 ,由于c#提供的控件局限性太大 ,所以就自己从国外大牛 手里借鉴一下. 该控件可以判断上传的文件是否已存在 ,减少了 ...
- 学习笔记找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID.
解决 找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID. private void DisplayHotBooks() { //获取 ...
- C++ 一个程序获取另一个程序Edit控件的内容
//一个程序获取另一个程序Edit控件的内容 //根据指定程序的标题名获取改程序窗口的句柄 HWND hWnd=::FindWindow(NULL,"zhang001"); if( ...
- ASP.NET 获取不同frame中的控件
最近在做网站时遇到一个问题,需要获取不同frame中的控件,请教了一些同事,他们都说是无法取到的, 在网上查找了很多资料,找到了解决方法,现在整理一下当初的解决思路: 1.我需要在mainFrame中 ...
- Windows获取其他进程中Edit控件的内容
最近做的MFC项目中,有个获取其他进程中Edit控件内容的需求,本来以为是个很简单的问题,但是来来回回折腾了不少时间,发博记录一下. 刚开始拿到这个问题,很自然的就想到GetDlgItemText() ...
- Delphi 获取当前鼠标下的控件内容
Delphi 获取当前鼠标下的控件内容 主要函数: GetCursorPos://获取鼠标的位置 WindowFromPoint://获取制定point下的handle GetClassName:// ...
- WebBrowser无法显示招商银行password输入控件的问题
本文由CharlesSimonyi发表于CSDN博客:http://blog.csdn.net/charlessimonyi/article/details/30479131转载请注明出处 之前就看到 ...
- 获取Delphi焦点所在的控件及通过控件名称访问控件
方法一: Var I: Integer; Begin For I := To ComponentCount - Do //获取组件数量 Begin If Components[I] Is TWinCo ...
随机推荐
- Android_Bitmap_图片的二次采样并生成缩略图
1.Bitmap概述 Android系统支持几种图片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位图#ffff ...
- BIO NIO AIO 简介
原文: https://github.com/zhongmingmao/nio_demo 简介 NIO与AIO的简单使用 基本概念 同步与异步 同步和异步是针对应用程序和内核的交互而言的:同步指的是用 ...
- 《Deep Learning》(深度学习)中文版 开发下载
<Deep Learning>(深度学习)中文版开放下载 <Deep Learning>(深度学习)是一本皆在帮助学生和从业人员进入机器学习领域的教科书,以开源的形式免费在 ...
- centos 6.3 64位下cpuminer +mining_proxy 挖掘莱特币(LTC)教程
1.下载软件: cpuminer: http://sourceforge.net/projects/cpuminer/files/ 找到对应的版本,我的服务器是centos64的,找了个当前最高版本: ...
- 让Redis在你的系统中发挥更大作用
Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...
- 用Entityframework 调用Mysql时,datetime格式插入不进去数据库的解决办法。
1. 打开Model.edmx, 2. 选择userinfo中的createtime字段的属性 3. storegeneratedpattern设置值为None
- 【Android开发】交互界面布局详解
原文:http://android.eoe.cn/topic/summary Android 的系统 UI 为构建您自己的应用提供了基础的框架.主要包括主屏幕 (Home Screen).系统 UI ...
- apicloud开发笔记
第一次用apicloud做正式项目 ,下面把做的过程中用到的代码段列出来....都是从文档里复制的代码,只是感觉官网那个文档好难找哦... 注:api.????的方法都是在APP中调用才行的,$api ...
- testbench的设计 文件读取和写入操作 源代码
十大基本功之 testbench 1. 激励的产生 对于 testbench 而言,端口应当和被测试的 module 一一对应.端口分为 input,output 和 inout 类型产生激励信号的时 ...
- PostgreSQL PL/Python 和 PL/Postgres 函数互相调用
create or replace function hello(name text) returns text as $$ # str = name+',你吃饭了吗?'; # return 'hel ...