首页 > 解决方案 > 在 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可以做到吗?

标签: c#winforms

解决方案


根据您的解决方法,我猜这可能是由于您尝试执行代码时尚未加载文档。为了确保页面被加载,您可以订阅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");
}

推荐阅读