c# - 在 C# WebBrowser 控件中单击编程按钮
问题描述
WinForms 中 webbrowser 的文档指定您可以调用如下事件:
webBrowser1.Document.GetElementById("signin").InvokeMember("click");
..但这对我不起作用。我尝试了一个黑客:
HtmlElement element = webBrowser1.Document.CreateElement("script");
element.InnerText = "function SubmitForm() { document.getElementById('signin').click(); }";
webBrowser1.Document.Forms[0].AppendChild(element);
webBrowser1.Document.InvokeScript("SubmitForm");
..这也不起作用。然而,另一个黑客:
HtmlElement element = webBrowser1.Document.CreateElement("script");
element.InnerText = "function SubmitForm() { alert('Click me!');
document.getElementById('signin').click(); }";
webBrowser1.Document.Forms[0].AppendChild(element);
webBrowser1.Document.InvokeScript("SubmitForm");
..完美地工作。除了有用户干预来单击警报框,这是我不想要的。这是某种竞赛条件吗?该代码在webBrowser1_DocumentCompleted中执行,所以应该没问题。如果您有办法成功触发事件,请告诉。
@Jimi 这是您要求的代码:
private void Form1_Load(object sender, EventArgs e)
{
string targetUrl = "https://banking.westpac.com.au/wbc/banking/handler?TAM_OP=login&URL=%2Fsecure%2Fbanking%2Foverview%2Fdashboard";
webBrowser1.Navigate(targetUrl);
}
private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted_1;
webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted_2;
webBrowser1.Document.GetElementById("fakeusername").InnerText = "andy";
webBrowser1.Document.GetElementById("password").InnerText = "password";
//webBrowser1.Document.GetElementById("signin").InvokeMember("click");
HtmlElement element = webBrowser1.Document.CreateElement("script");
element.InnerText = "function SubmitForm() { setTimeout(function() { document.getElementById('signin').click(); }, 5000); }";
webBrowser1.Document.Forms[0].AppendChild(element);
webBrowser1.Document.InvokeScript("SubmitForm");
}
警报使它起作用(setTimeout 也是如此)。看起来文档还没有真正完成,但浏览器认为它是。页面上的JS可以做到吗?
解决方案
根据您的解决方法,我猜这可能是由于您尝试执行代码时尚未加载文档。为了确保页面被加载,您可以订阅DocumentCompleted
事件并在那里执行您的操作。这对我有用:
public Form1()
{
InitializeComponent();
webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
string curDir = Directory.GetCurrentDirectory();
webBrowser1.Navigate($"file://{curDir}/test.html");
}
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.GetElementById("btn").InvokeMember("onclick");
}
我可以看到的另一个问题是,您正在使用click
成员,因为我不确定元素是什么(可能是button
?),然后尝试调用onclick
,就像我在提供的代码中所做的那样。
这样的片段也对我有用:
public Form1()
{
InitializeComponent();
webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
webBrowser1.Navigate(@"https://banking.westpac.com.au/wbc/banking/handler?TAM_OP=login&URL=%2Fsecure%2Fbanking%2Foverview%2Fdashboard");
}
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.GetElementById("signin").InvokeMember("click");
}
推荐阅读
- python - python2.7.15如何连接Informix数据库?
- r - 如果高于 R 中的某个阈值,则有条件地将数据帧中的值乘以另一个数据帧
- javascript - 如何在具有重复 ID 的 Bootstrap 选项卡窗格之间切换
- mysql - 添加全局 MySQL 异常处理程序
- java - 图形:您将如何在 JButton 打开的第二个 GUI 上绘制图形?
- pagespeed - 设置 Google pagespeed 洞察力以忽略 URL
- scala - 在 Spark 中将可选参数建模为 UDF 的最佳方法是什么?
- laravel - 语法错误,我的 laravel 代码中的文件意外结束
- javascript - 将巨大数组中的每个 JavaScript 对象与另一个对象合并
- python - 如何打印2条水平线