C# webBrowser模拟网页点击

a3622041 2018-10-24 02:40:35



private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

HtmlDocument doc = webBrowser1.Document;

SendKeys.SendWait("(123)");
//HtmlElement btn = null;
HtmlElementCollection elementcol = doc.GetElementsByTagName("input"); //搜索所有的 input 标签
foreach (HtmlElement ele in elementcol)
{

/* if (ele.GetAttribute("type").Equals(("password")))
{
ele.InnerText = "123";

}*/
if(ele.GetAttribute("value").Equals(("进入存储管理系统")))
{
ele.InvokeMember("click");//点击一下

}
}
这种情况下的话,能触发按钮点击 把注释那部分取消的话,按钮点击不能触发

不管通过哪种元素,密码框内都无法输入密码 如何解决呢?
...全文
1451 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
nxwspace 2018-11-24
  • 打赏
  • 举报
回复
引用 13 楼 a3622041 的回复:
[quote=引用 12 楼 YKPkaiping 的回复:]
这俩不能写在一起,你可以试一下用两个按钮来执行,就可以,如果非要写一起,写到线程里吧


我这个就是想连续登陆多个不同的摄像头查看情况, 点按钮肯定不行。 线程是写在DocumentCompleted里面吗 有没有其他方法解决啊[/quote]用timer试试,我之前就是这样解决的,每个步骤起个命令,执行完一个命令执行下一个,比如:命令=登录;命令=点击
一只鬼 2018-11-06
  • 打赏
  • 举报
回复
哦,等下给你个例子
一只鬼 2018-11-06
  • 打赏
  • 举报
回复
//委托 delegate void 填写密码(); delegate void 登录(); void c填写密码() { HtmlElement h1 = webBrowser1.Document.GetElementById("填写密码文本框id"); h1.SetAttribute("value",密码); } void c登录() { //点击登录 HtmlElement h3 = webBrowser1.Document.GetElementById("buttonid"); h3.InvokeMember("click"); } 在线程里调用 this.Invoke(new 填写密码(c填写密码)); Thread.Sleep(1000); this.Invoke(new 登录(c登录)); 你试一试
a3622041 2018-10-29
  • 打赏
  • 举报
回复
引用 21 楼 YKPkaiping 的回复:
在webbrowser中能正常显示吗?在开发工具里都能获取到控件吧? 不用写到DocumentCompleted,直接写一方法,加到线程里就可以,但是操作webbrowser需要在主线程执行,所以需要委托,再用Invoke执行, 一般能获取到控件,都能执行的
有没有例子看看呀 我线程里面调用不了webbrowser控件 那我线程里面写什么呀? 我整个程序就一个DocumentCompleted 没有其他操作 谢谢了 没写过C# 有id的那种 我用C++已经实现了
mkjkjj 2018-10-26
  • 打赏
  • 举报
回复
线程里面HtmlDocument document = browser.Document; 一直为空 怎么办呀?
a3622041 2018-10-26
  • 打赏
  • 举报
回复
引用 12 楼 YKPkaiping 的回复:
这俩不能写在一起,你可以试一下用两个按钮来执行,就可以,如果非要写一起,写到线程里吧


线程里面HtmlDocument document = browser.Document; 一直为空 怎么办呀?
a3622041 2018-10-26
  • 打赏
  • 举报
回复
引用 12 楼 YKPkaiping 的回复:
这俩不能写在一起,你可以试一下用两个按钮来执行,就可以,如果非要写一起,写到线程里吧


我这个就是想连续登陆多个不同的摄像头查看情况, 点按钮肯定不行。 线程是写在DocumentCompleted里面吗 有没有其他方法解决啊
a3622041 2018-10-26
  • 打赏
  • 举报
回复
引用 22 楼 p47655255 的回复:
[quote=引用 20 楼 a3622041 的回复:]
[quote=引用 18 楼 p47655255 的回复:]
也许是 循环的顺序问题,


顺序我都调整过 没有用 [/quote]

我的意思是 正常操作 必须是先输密码 然后才能点登陆

你在一个循环里面 你怎么确定 先后顺序的
可以写2个循环,一个输密码 一个登陆

[/quote]

只要输入密码成功后,就会出现System.NullReferenceException 中第一次偶然出现的“System.Windows.Forms.dll”类型的异常
p47655255 2018-10-26
  • 打赏
  • 举报
回复
引用 20 楼 a3622041 的回复:
[quote=引用 18 楼 p47655255 的回复:]
也许是 循环的顺序问题,


顺序我都调整过 没有用 [/quote]

我的意思是 正常操作 必须是先输密码 然后才能点登陆

你在一个循环里面 你怎么确定 先后顺序的
可以写2个循环,一个输密码 一个登陆
一只鬼 2018-10-26
  • 打赏
  • 举报
回复
在webbrowser中能正常显示吗?在开发工具里都能获取到控件吧? 不用写到DocumentCompleted,直接写一方法,加到线程里就可以,但是操作webbrowser需要在主线程执行,所以需要委托,再用Invoke执行, 一般能获取到控件,都能执行的
a3622041 2018-10-26
  • 打赏
  • 举报
回复
引用 18 楼 p47655255 的回复:
也许是 循环的顺序问题,


顺序我都调整过 没有用
weixin_43524811 2018-10-26
  • 打赏
  • 举报
回复
谢谢谢分析!
p47655255 2018-10-26
  • 打赏
  • 举报
回复
也许是 循环的顺序问题,
xiaoxiangqing 2018-10-25
  • 打赏
  • 举报
回复
按钮触发js里弹一个框,这样就知道有没有触发。大部分情况是可以的。
a3622041 2018-10-25
  • 打赏
  • 举报
回复

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

HtmlDocument doc = webBrowser1.Document;

webBrowser1.Document.GetElementsByTagName("input")["p_pass"].InnerText = "123";

HtmlElementCollection elementcol = doc.GetElementsByTagName("input"); //搜索所有的 input 标签

foreach (HtmlElement ele in elementcol)
{

if (ele.GetAttribute("name").Equals(("p_pass")))
{
ele.Focus();
SendKeys.Send("123");

}

if (ele.GetAttribute("value").Equals(("进入存储管理系统")))
{

ele.InvokeMember("click");//点击一下

}
}


}
这两句随便注销某一句都会出现 输入密码为空 这两句不注销的话 密码框内会有密码 但是不会触发按钮
a3622041 2018-10-25
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
看下ele是不是还有别的地方被选择了



没有
 foreach (HtmlElement ele in elementcol)
{


1 if (ele.GetAttribute("type").Equals(("password")))
{
ele.Focus();
SendKeys.Send("123");


}
2 if(ele.GetAttribute("value").Equals(("进入存储管理系统")))
{

ele.InvokeMember("click");//点击一下

}
}


1,2现在单独的话都可以实现 就是一起的话就不行 就是不能实现自动登陆
a3622041 2018-10-25
  • 打赏
  • 举报
回复
引用 5 楼 dogfish 的回复:
这是我的一个正在使用的程序的代码。
wbDoc.GetElementById("按钮的ID")?.InvokeMember("click");



按钮没有ID
一只鬼 2018-10-25
  • 打赏
  • 举报
回复
这俩不能写在一起,你可以试一下用两个按钮来执行,就可以,如果非要写一起,写到线程里吧
Dogfish 2018-10-25
  • 打赏
  • 举报
回复
Sorry楼主,我看错你的题目了。ignore我上面的答案 看看一下的链接是否能解决 https://stackoverflow.com/questions/15239946/popup-window-webbrowser-control
Dogfish 2018-10-25
  • 打赏
  • 举报
回复
这是我的一个正在使用的程序的代码。
wbDoc.GetElementById("按钮的ID")?.InvokeMember("click");
加载更多回复(5)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧